在上一篇文章中已经将MyBatis的环境搭建完成。
本节将简单介绍MyBatis的文件配置及通过MyBatis完成一个简单的查询。
首先需要简单介绍两个基础类:
1、User模型类:
package com.wp.model; import java.util.Date; public class User { private int id; private String userName; private int sex; private int age; private Date birthDay; private String address; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthDay() { return birthDay; } public void setBirthDay(Date birthDay) { this.birthDay = birthDay; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public User() { super(); } public User(int id, String userName, int sex, int age, Date birthDay, String address) { super(); this.id = id; this.userName = userName; this.sex = sex; this.age = age; this.birthDay = birthDay; this.address = address; } public User(String userName, int sex, int age, Date birthDay, String address) { super(); this.userName = userName; this.sex = sex; this.age = age; this.birthDay = birthDay; this.address = address; } public String toString() { return "User [address=" + address + ", age=" + age + ", birthDay=" + birthDay + ", id=" + id + ", sex=" + sex + ", userName=" + userName + "]"; } }
2、日期工具类(在commons项目中有相应的类,本工具类是自己写的用来测试的)
package com.wp.util; import java.io.Serializable; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import org.apache.commons.lang3.StringUtils; /** * 日期工具类 * * */ public class DateUtil implements Serializable { private static final long serialVersionUID = 8321747583406350420L; /** * 全日期格式<br> * yyyy-MM-dd */ public static final String FULL_DAY_FORMAT = "yyyy-MM-dd"; /** * 日期格式<br> * yyyy-MM */ public static final String DAY_FORMAT = "yyyy-MM"; /** * 全日期带时间格式<br> * yyyy-MM-dd HH:mm:ss */ public static final String FULL_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; /** * 时间格式<br> * HH:mm:ss */ public static final String TIME_FORMAT = "HH:mm:ss"; /** * 将指定的字符串按指定类型转换为日期<br> * 转换异常时返回null * * @param str * 需要转换的字符串 * @param pattern * 转换格式 * @return */ public static Date parseStrToFullDate(String str, String pattern) { if (StringUtils.isBlank(str)) { return null; } if (StringUtils.isBlank(pattern)) { return null; } Date returnDate = null; SimpleDateFormat format = new SimpleDateFormat(pattern); try { returnDate = format.parse(str); } catch (ParseException e) { e.printStackTrace(); return null; } return returnDate; } /** * 将指定的字符串按指定类型转换为时间戳<br> * 转换异常时返回null * * @param str * 需要转换的字符串 * @param pattern * 转换格式 * @return */ public static Timestamp parseStrToFullTimestamp(String str, String pattern) { if (StringUtils.isBlank(str)) { return null; } if (StringUtils.isBlank(pattern)) { return null; } SimpleDateFormat format = new SimpleDateFormat(pattern); try { Date tempDate = format.parse(str); Timestamp timestamp = new Timestamp(tempDate.getTime()); return timestamp; } catch (ParseException e) { e.printStackTrace(); } return null; } /** * 将当前时间转换成指定格式的字符串<br> * 参数为空,返回空 * * @param pattern * 转换格式 * @return */ public static String changeCurrentToStr(String pattern) { return changeDateToStr(new Date(), pattern); } /** * 将指定的日期按给定的格式转换 * * @param date * 日期对象 * @param pattern * 格式。如:yyyy-MM-dd * @return */ public static String changeDateToStr(Date date, String pattern) { if (null == date) { return ""; } if (StringUtils.isBlank(pattern)) { return ""; } SimpleDateFormat format = new SimpleDateFormat(pattern); String result = format.format(new Timestamp(date.getTime())); return result; } /** * 获取指定日期所在月份的第一天 * * @param date * 指定日期 * @return */ @SuppressWarnings("deprecation") public static String getFirstDay(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int firstDayPersent = calendar.getActualMinimum(Calendar.DAY_OF_MONTH); Date firstDate = calendar.getTime(); firstDate.setDate(firstDayPersent); String firstDay = new SimpleDateFormat(FULL_DAY_FORMAT) .format(firstDate); return firstDay; } /** * 获取指定日期所在月份的最后一天 * * @param date * 指定日期 * @return */ @SuppressWarnings("deprecation") public static String getLastDay(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int lastDayPersent = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); Date lastDate = calendar.getTime(); lastDate.setDate(lastDayPersent); String lastDay = new SimpleDateFormat(FULL_DAY_FORMAT).format(lastDate); return lastDay; } /** * 获取指定日期所在月份的上个月的第一天 * * @param date * 指定日期 * @return */ public static String getFirstDayOfLastMonth(Date date) { SimpleDateFormat df = new SimpleDateFormat(FULL_DAY_FORMAT); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.MONTH, -1); Date theDate = calendar.getTime(); // 上个月第一天 GregorianCalendar gcLast = (GregorianCalendar) Calendar.getInstance(); gcLast.setTime(theDate); gcLast.set(Calendar.DAY_OF_MONTH, 1); String firstDay = df.format(gcLast.getTime()); return firstDay; } /** * 获取指定日期所在月份的上个月的最后一天 * * @param date * 指定日期 * @return */ public static String getLastDayOfLastMonth(Date date) { SimpleDateFormat df = new SimpleDateFormat(FULL_DAY_FORMAT); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.MONTH, -1); // 上个月最后一天 calendar.add(Calendar.MONTH, 1); // 加一个月 calendar.set(Calendar.DATE, 1); // 设置为该月第一天 calendar.add(Calendar.DATE, -1); // 再减一天即为上个月最后一天 String lastDay = df.format(calendar.getTime()); return lastDay; } /** * 获取指定日期所在月份的下个月的第一天 * * @param date * 指定日期 * @return */ public static String getFirstDayOfNextMonth(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.add(Calendar.MONTH, 1); SimpleDateFormat df = new SimpleDateFormat(FULL_DAY_FORMAT); String firstDay = df.format(calendar.getTime()); return firstDay; } /** * 获取指定日期所在月份的下个月的最后一天 * * @param date * 指定日期 * @return */ public static String getLastDayOfNextMonth(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.MONTH, +1); // 上个月最后一天 calendar.add(Calendar.MONTH, 1); // 加一个月 calendar.set(Calendar.DATE, 1); // 设置为该月第一天 calendar.add(Calendar.DATE, -1); // 再减一天即为上个月最后一天 SimpleDateFormat df = new SimpleDateFormat(FULL_DAY_FORMAT); String lastDay = df.format(calendar.getTime()); return lastDay; } /** * 获取指定日期的前一天 * * @param date * 指定日期 * @return 返回格式:yyyy-MM-dd */ public static String getDayOfBefore(Date date) { if (null == date) { return ""; } String beforeDay = ""; Calendar c = Calendar.getInstance(); c.setTime(date); int day = c.get(Calendar.DATE); c.set(Calendar.DATE, day - 1); beforeDay = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime()); return beforeDay; } /** * 获取指定日期的前一天 * * @param day * 指定日期.格式:yyyy-MM-dd * @return 返回格式:yyyy-MM-dd */ public static String getDayOfBefore(String day) { if (StringUtils.isBlank(day)) { return ""; } String beforeDay = ""; Date date = null; try { date = new SimpleDateFormat("yyyy-MM-dd").parse(day); beforeDay = getDayOfBefore(date); } catch (ParseException e) { e.printStackTrace(); } return beforeDay; } /** * 获取指定日期的后一天 * * @param date * 指定日期 * @return 返回格式:yyyy-MM-dd */ public static String getDayOfNext(Date date) { if (null == date) { return ""; } String nextDay = ""; Calendar c = Calendar.getInstance(); c.setTime(date); int day = c.get(Calendar.DATE); c.set(Calendar.DATE, day + 1); nextDay = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime()); return nextDay; } /** * 获取指定日期的后一天 * * @param day * 指定日期.格式:yyyy-MM-dd * @return 返回格式:yyyy-MM-dd */ public static String getDayOfNext(String day) { if (StringUtils.isBlank(day)) { return ""; } String nextDay = ""; Date date = null; try { date = new SimpleDateFormat("yyyy-MM-dd").parse(day); nextDay = getDayOfNext(date); } catch (ParseException e) { e.printStackTrace(); } return nextDay; } /** * 获取指定日期所在星期的第一天 * @param day * @return */ public static String getFirstDayOfWeek(String day) { String firstDay = ""; Calendar calendar = Calendar.getInstance(); try { calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(day)); int d = 0; if(calendar.get(Calendar.DAY_OF_WEEK)==1){ d = -6; }else{ d = 2 - calendar.get(Calendar.DAY_OF_WEEK); } calendar.add(Calendar.DAY_OF_WEEK, d); //所在周开始日期 firstDay = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime()); } catch (ParseException e) { e.printStackTrace(); } return firstDay; } /** * 获取指定日期所在星期的最后一天 * @param day * @return */ public static String getLastDayOfWeek(String day) { String lastDay = ""; Calendar calendar = Calendar.getInstance(); try { calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(day)); int d = 0; if(calendar.get(Calendar.DAY_OF_WEEK)==1){ d = -6; }else{ d = 2 - calendar.get(Calendar.DAY_OF_WEEK); } calendar.add(Calendar.DAY_OF_WEEK, d); calendar.add(Calendar.DAY_OF_WEEK, 6); //所在周结束日期 lastDay = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime()); } catch (ParseException e) { e.printStackTrace(); } return lastDay; } }
一、MyBatis全局配置文件配置:
在上节中MyBatis的配置文件为:mybatis-config.xml。下面再来看下项目的基本情况:
需要主要的是MyBatis的全局配置文件名是自己可以随意定义的,当然我们给文件命名的通用规则都是见名思意。
mybatis-config.xml文件中主要用来配置MyBatis的运行时环境与映射文件。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 加载数据库配置文件 --> <properties resource="db.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <!-- 配置数据源信息 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 加载映射文件 --> <mappers> <mapper resource="mapper/User.xml"/> </mappers> </configuration>
由于本例中数据库信息已经由单独的数据库配置文件配置完成,因此在mybatis-config.xml文件中引用此文件并用来配置数据源信息。数据库配置文件db.properties文件内容如下:
# 配置数据库相关参数 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8 jdbc.username=root jdbc.password=111111
在mybatis-config.xml中通过${}的形式引用db.properties的配置信息。
【environments】标签用来配置MyBatis的环境,此处不错过多解释,因为在最后与Spring整合之后将全部交由Spring管理。
【mappers】标签用来加载映射文件。
【mapper】标签的“resource”属性值来指定映射文件的位置和文件名。位置是从classpath开始的。
二、映射文件配置:
映射文件主要用来配置具体的SQL语句和对应的输入参数、输出参数。在mybatis-config.xml文件中引用了“mapper/User.xml”映射文件,下面是此文件的内容:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="UserSpace"> <!-- 根据用户ID查询用户 --> <select id="selectById" parameterType="java.lang.Integer" resultType="com.wp.model.User"> select * from user where id=#{id} </select> <!-- 根据用户名称模糊查询用户 --> <select id="selectByVagueName" parameterType="java.lang.String" resultType="com.wp.model.User"> select * from user where username like #{username} </select> <!-- 根据用户名称模糊查询用户2 --> <select id="selectByVagueName2" parameterType="java.lang.String" resultType="com.wp.model.User"> select * from user where username like ${value} </select> <!-- 添加用户 --> <insert id="addUser" parameterType="com.wp.model.User"> insert into user(username, sex, age, birthday, address) values(#{userName}, #{sex}, #{age}, #{birthDay}, #{address}) </insert> </mapper>
1、【mapper】标签的“namespace”属性用来标识映射文件的唯一性,在一个项目中namespace不可重复,是唯一的。目前采用普通定义的方式自定义名称即可,以后在使用mapper代理方式进行开发时再进行相应的讲解说明。
2、MyBatis的映射文件主要用来配置SQL语句及相应的输入输出参数,因为有了输入映射和输出映射,但是同时又需要自己书写SQL语句,因此本人认为MyBatis是一个半自动化的ORM框架。
3、在SQL语句中可以使用 #{} 和 ${} 来替代最后要输入的参数。需要注意的是:
#{} : 是占位符。用来为输入参数占据位置。当参数类型为普通类型时,占位符中的名称可随意填写。
${} : 是连接字符标志,会将输入参数原封不动的拼接到SQL语句中,此方式不安全,容易引起SQL注入,不建议使用。
4、【parameterType】为输入参数的类型,可以是基本类型、也可以是POJO类型。
如果输入参数是基本类型的情况下既可以使用MyBatis的数据类型,也可以使用JAVA类型。但是本人比较喜欢使用JAVA类型。
5、【resultType】为输出参数的类型。需要注意的是【resultType】表示的是返回的单条记录的类型。
比如:如果一个查询结果返回多条记录(List),那么【resultType】不能是List,实际上应该是List
内的具体对象类型。
三、以根据用户id查询用户为例说明一下具体的操作步骤:
1、在映射文件(User.xml)中配置相应的查询语句:
2、编写测试类(UserTest):
package com.wp.test; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import com.wp.model.User; public class UserTest { /** * 根据ID查询用户测试 */ @Test public void testSelectById() { // 设置MyBtis配置文件的路径和名称 String resource = "mybatis-config.xml"; try { // 加载配置文件 InputStream is = Resources.getResourceAsStream(resource); // 获取SqlSessionFactory SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); // 获取SqlSession SqlSession session = factory.openSession(); // 参数1:映射文件的namespace+statementID // 参数2:参数值 User user = session.selectOne("UserSpace.selectById", 2); System.out.println(user); // SqlSession关闭 session.close(); } catch (IOException e) { e.printStackTrace(); } } }
注意:SqlSessionFactory全局可使用一个,因此最好通过单例模式实现。
SqlSession在使用完成后一定要关闭。
selectOne:表示查询一个,其中的第一个参数是映射文件的namespace+配置语句的ID,第二个参数为参数值。 因为我们知道具体返回的是User对象,因此直接用User对象接收即可。
基本配置与最简单的查询到此结束。
相关推荐
在MyBatis中,`mybatis-3-config.dtd` 和 `mybatis-3-mapper.dtd` 是两个至关重要的DTD(Document Type Definition)文件,它们定义了MyBatis配置文件和映射文件的结构和规则。 首先,让我们深入了解一下`mybatis-3...
Mybatis-Plus是一款在Mybatis基础上进行增强的优秀工具,它简化了单表的CRUD操作,提高了开发效率,且对原有的SQL操作不做改变。Mybatis-Plus的实践及架构原理主要包含以下几个方面的知识点: 1. Mybatis-Plus的...
首先,你需要在Spring Boot的配置文件(application.yml或application.properties)中引入MyBatis-Plus的依赖,并进行基础配置,如数据库连接信息、实体扫描路径等。 3. **创建实体类(Entity)** 在项目中,每个...
首先,需要在 pom.xml 文件中添加 MyBatis-Plus 依赖项,然后 configure MyBatis-Plus 的基本配置项,最后,使用 MyBatis-Plus 实现 CRUD 操作。 通过使用 SpringBoot 集成 MyBatis-Plus,可以快速实现国产数据库...
`src/main/resources`通常包含了配置文件,如Mybatis的`mybatis-config.xml`,数据库连接信息,以及Mapper接口对应的XML文件等。 Mybatis-Extension的亮点在于它的动态SQL支持和插件机制。动态SQL允许我们在运行时...
在这个名为 "mybatis-plus-demo.zip" 的压缩包文件中,我们可以看到一个基础的 MyBatis-Plus 入门示例,通常包括配置文件、实体类、Mapper接口、Service以及Controller等关键组件。 1. **MyBatis-Plus 简介**: ...
接着,在配置文件`application.yml`或`application.properties`中配置Mybatis-Plus的相关属性,如数据库连接信息、全局配置等。 3. **实体类生成** Mybatis-Plus提供了一个代码生成器,可以根据数据库表结构自动...
在压缩包 "myframe" 中,可能包含了实现这一功能的基础框架文件,如配置文件(application.yml 或 application.properties)、SpringBoot 启动类、数据源配置类、路由策略实现类以及 MyBatis-Plus 相关的配置和...
MyBatis-Plus会自动处理SQL映射,无需编写XML配置文件。 然后,配置Spring Boot应用以扫描Mapper接口。在`application.yml`中添加以下内容: ```yaml mybatis-plus: mapper-locations: classpath:mapper/*.xml ...
在Spring配置文件中,我们需要定义一个`SqlSessionFactoryBean`,并指定数据源、MyBatis的配置文件路径等属性。例如: ```xml <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> ...
例如,你需要在 Maven 或 Gradle 的构建文件中添加 MyBatis-Plus 的依赖,然后在 Spring 配置文件中进行相应的配置。 接着,文档会详细介绍如何进行 CRUD 操作。MyBatis-Plus 提供了 BaseMapper 接口,每个实体类都...
1. SQL映射文件:MyBatis允许开发者在XML文件中编写自定义的SQL语句,这样可以提高SQL执行效率,并且易于维护。 2. 动态SQL:通过在XML或注解中使用条件语句,可以实现动态生成SQL,适应不同的查询需求。 3. 映射器...
3. **配置MyBatis**:在MyBatis的配置文件`mybatis-config.xml`中,配置数据源、事务工厂和映射文件的位置。同时,每个Mapper接口需要与对应的XML映射文件关联。 4. **PageHelper分页插件**:MyBatis-PageHelper是...
MyBatis-Plus是一个在MyBatis基础上进行扩展的轻量级框架,它极大地简化了对数据库的操作,提供了包括插入、删除、更新、查询在内的多种便捷功能。在本示例中,我们将探讨如何使用MyBatis-Plus与Spring Boot集成,以...
示例配置文件有助于快速理解和使用Mybatis Generator,通常会包含一些常见配置选项的注释,帮助新手入门。 使用Mybatis Generator时,首先需要在项目的类路径下放置配置文件,并指定要操作的数据库表。配置文件中...
`mybatis-3-config.xml` 和 `mybatis-3-mapper.dtd` 文件是 MyBatis 框架的核心配置文件,它们在 MyBatis 工作流程中扮演着至关重要的角色。 首先,`mybatis-3-config.xml` 是 MyBatis 的主配置文件,它定义了整个 ...