本章主要内容: MyBatis环境的构建、MyBatis的工作原理、与Spring框架的整合开发、MyBatis的入门程序。
前言
1 、简述MyBatis的工作原理?
mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加@Configuration)中构建出SqlSessionFactory(SqlSessionFactory是线程安全的);然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession。
说明:SqlSession是单线程对象,因为它是非线程安全的,是持久化操作的独享对象,类似jdbc中的Connection,底层就封装了jdbc连接。
详细流程如下:
1.加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。
2.SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。
3.SqlSession对象完成和数据库的交互:
a、用户程序调用mybatis接口层api(即Mapper接口中的方法)
b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
c、通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
d、JDBC执行sql。
e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。
mybatis层次图:
2.简述MyBatis与Spring的整合过程。
答:
1、实现MyBatis与Spring的整合,需要导入相关JAR包,包括MyBatis、Spring以及其他JAR包:
1)MyBatis框架所需的JAR包;
2)Spring框架所需的JAR包;
3)MyBatis与Spring整合的中间JAR包;
4)数据库驱动JAR包;
5)数据源所需的JAR包。
2、在Spring中配置MyBatis工厂。
3、使用Spring管理MyBatis的数据操作接口。整合示例参加6.5.4节。
3.除MyBatis持久化框架外,您还知道哪些持久化框架?
答:Hibernate。
6.1 MyBatis简介
MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。
MyBatis 是一个基于Java的持久层框架。MyBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO),它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和Java的 POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
6.2 MyBatis环境的构建
MyBatis的3.4.5版本可以通过“https://github.com/mybatis/mybatis-3/releases”网址下载。下载时只需选择mybatis-3.4.5.zip即可,解压后得到如图6.1所示的目录。
图6.1中mybatis-3.4.5.jar是MyBatis的核心包,mybatis-3.4.5.pdf是MyBatis的使用手册,lib文件夹下的JAR是MyBatis的依赖包。 使用MyBatis框架时,需要将它的核心包和依赖包引入到应用程序中。如果是Web应用,只需将核心包和依赖包复制到/WEB-INF/lib目录中。
6.3 MyBatis的工作原理
简述MyBatis的工作原理:
1)读取MyBatis配置文件mybatis-config.xml。mybatis-config.xml为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,如数据库连接信息。
2)加载映射文件。映射文件即SQL映射文件,文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml文件可以加载多个映射文件,每个文件对应数据库中一张表。
3)构造会话工厂。通过MyBatis的环境等配置信息,构建会话工厂SqlSessionFactory。
4)创建SqlSession对象。由会话工厂创建SqlSession对象,该对象中包含执行SQL语句的所有方法。
5)MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
6)在Executor接口的执行方法中,有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
7)输入参数映射。输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。
8)输出结果映射。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。
过程如图示:
6.4 使用Eclipse开发MyBatis入门程序
本节使用第5章MySQL数据库springtest的user数据表进行讲解。下面通过一个实例讲解如何使用Eclipse开发MyBatis入门程序,具体过程如下。
1.创建Web应用,并添加相关JAR包
2.创建日志文件log4j.properties
MyBatis默认使用log4j输出日志信息,如果开发者需要查看控制台输出的SQL语句,那么需要在classpath路径下配置其日志文件。在应用的src目录下创建log4j.properties文件,内容如下:
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.mybatis=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
日志文件中配置了全局的日志配置、MyBatis的日志配置和控制台输出,其中MyBatis的日志配置用于将com.mybatis包下所有类的日志记录级别设置为DEBUG。该配置文件内容不需要开发者全部手写,可以从MyBatis使用手册中Logging小节复制,然后进行简单修改。
3.创建持久化类MyUser.java
在src目录下,创建一个名为com.mybatis.po包,在该包中创建持久化类MyUser。类中声明的属性与数据表user(创建表的代码参照5.1)的字段一致。
package com.mybatis.po;
/**
*springtest数据库中user表的持久化类
*属性和表中字段一一对应,并重写了toString()
*/
public class MyUser {
private Integer uid;//主键
private String uname;
private String usex;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUsex() {
return usex;
}
public void setUsex(String usex) {
this.usex = usex;
}
@Override
public String toString() {
return "User [uid=" + uid +",uname=" + uname + ",usex=" + usex +"]";
}
}
4.创建映射文件UserMapper.xml
在src目录下,创建一个名为com.mybatis.mapper包,在该包中创建映射文件UserMapper.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="com.mybatis.mapper.UserMapper">
<!-- 根据uid查询一个用户信息 -->
<select id="selectUserById" parameterType="Integer"
resultType="com.mybatis.po.MyUser">
select * from user where uid = #{uid}
</select>
<!-- 查询所有用户信息 -->
<select id="selectAllUser" resultType="com.mybatis.po.MyUser">
select * from user
</select>
<!-- 添加一个用户 ,#{uname}为com.mybatis.po.MyUser的属性值-->
<insert id="addUser" parameterType="com.mybatis.po.MyUser">
insert into user (uname,usex) values(#{uname},#{usex})
</insert>
<!-- 修改一个用户 -->
<update id="updateUser" parameterType="com.mybatis.po.MyUser">
update user set uname = #{uname},usex = #{usex} where uid = #{uid}
</update>
<!-- 删除一个用户 -->
<delete id="deleteUser" parameterType="Integer">
delete from user where uid = #{uid}
</delete>
</mapper>
上述映射文件中,<mapper>元素是配置文件的根元素,它包含了一个namespace属性,该属性值通常设置为“包名+SQL映射文件名”,指定了唯一的命名空间。子元素<select>、<insert>、<update>以及<delete>中的信息是用于执行查询、添加、修改以及删除操作的配置。在定义的SQL语句中,“#{}”表示一个占位符,相当于“?”,而“#{uid}”表示该占位符待接收参数的名称为uid。
5.创建MyBatis的配置文件mybatis-config.xml
在src目录下,创建MyBatis的核心配置文件mybatis-config.xml。在该文件中,配置了数据库环境和映射文件的位置。
<?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>
<!-- 配置环境 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC的事务管理 -->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- MySQL数据库驱动 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!-- 连接数据库的URL -->
<property name="url" value="jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 映射文件的位置 -->
<mapper resource="com/mybatis/mapper/UserMapper.xml"/>
</mappers>
</configuration>
6.创建测试类MyBatisTest.java
在src目录下,创建一个名为com.mybatis.test包,在该包中创建MyBatisTest测试类。在测试类中,首先使用输入流读取配置文件,然后根据配置信息构建SqlSessionFactory对象。接下来通过SqlSessionFactory对象创建SqlSession对象,并使用SqlSession对象的方法执行数据库操作。
package com.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 com.mybatis.po.MyUser;
public class MyBatisTest {
public static void main(String[] args) {
try {
//读取配置文件mybatis-config.xml
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
//根据配置文件构建SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
//通过SqlSessionFactory创建SqlSession
SqlSession ss = ssf.openSession();
//SqlSession执行映射文件中定义的SQL,并返回映射结果
//com.mybatis.mapper.UserMapper.selectUserById为UserMapper.xml中的命名空间+select的id
//查询一个用户
MyUser mu = ss.selectOne("com.mybatis.mapper.UserMapper.selectUserById", 1);
System.out.println(mu);
//添加一个用户
MyUser addmu = new MyUser();
addmu.setUname("陈恒");
addmu.setUsex("男");
ss.insert("com.mybatis.mapper.UserMapper.addUser",addmu);
//修改一个用户
MyUser updatemu = new MyUser();
updatemu.setUid(1);
updatemu.setUname("张三");
updatemu.setUsex("女");
ss.update("com.mybatis.mapper.UserMapper.updateUser", updatemu);
//删除一个用户
ss.delete("com.mybatis.mapper.UserMapper.deleteUser", 3);
//查询所有用户
List<MyUser> listMu = ss.selectList("com.mybatis.mapper.UserMapper.selectAllUser");
for (MyUser myUser : listMu) {
System.out.println(myUser);
}
//提交事务
ss.commit();
//关闭SqlSession
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
可能小伙伴们心里有些疑惑,先记下来,安安静静的敲完这个例子代码,并成功运行,细节下面会将。结果截图如下:
6.5 MyBatis与Spring的整合
1. 导入相关JAR包
MyBatis框架所需的JAR包:包括它的核心包和依赖包,包的详情见6.2节。
Spring框架所需的JAR包:Spring框架所需的JAR包,包括它的核心模块JAR、AOP开发使用的JAR、JDBC和事务的JAR包(其中依赖包不需要再导入,因为MyBatis已提供),具体如下:
aopalliance-1.0.jar
aspectjweaver-1.8.13.jar
spring-aop-5.0.2.RELEASE.jar
spring-aspects-5.0.2.RELEASE.jar
spring-beans-5.0.2.RELEASE.jar
spring-context-5.0.2.RELEASE.jar
spring-core-5.0.2.RELEASE.jar
spring-expression-5.0.2.RELEASE.jar
spring-jdbc-5.0.2.RELEASE.jar
spring-tx-5.0.2.RELEASE.jar
MyBatis与Spring整合的中间JAR包:该中间JAR包的最新版本为mybatis-spring-1.3.1.jar。此版本可从地址“http://mvnrepository.com/artifact/org.mybatis/mybatis-spring/1.3.1”下载。
数据库驱动JAR包: 本书所使用的MySQL数据库驱动包为mysql-connector-java-5.1.45-bin.jar。
数据源所需的JAR包: 整合时使用的是DBCP数据源,需要准备DBCP和连接池的JAR包。最新版本的DBCP的JAR包为commons-dbcp2-2.2.0.jar,可从地址“http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi”下载;最新版本的连接池的JAR包为commons-pool2-2.5.0.jar,可从地址“http://commons.apache.org/proper/commons-pool/download_pool.cgi”下载。
2. 在Spring中配置MyBatis工厂
通过与Spring的整合,MyBatis的SessionFactory交由Spring来构建。构建时需要在Spring的配置文件中添加如下代码:
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://jiahao.work:3306/springtest?characterEncoding=utf8" />
<property name="username" value="jdbc" />
<property name="password" value="jdbc" />
<!-- 最大连接数 -->
<property name="maxTotal" value="30"/>
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10"/>
<!-- 初始化连接数 -->
<property name="initialSize" value="5"/>
</bean>
<!-- 配置MyBatis工厂,同时指定数据源,并与MyBatis完美整合 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- configLocation的属性值为MyBatis的核心配置文件 -->
<property name="configLocation" value="classpath:com/mybatis/mybatis-config.xml"/>
</bean>
3 .使用Spring管理MyBatis的数据操作接口
使用Spring管理MyBatis的数据操作接口的方式有多种。其中,最常用最简洁的一种是基于MapperScannerConfigurer的整合。该方式需要在Spring的配置文件中加入以下内容:
<!--Mapper代理开发,使用Spring自动扫描MyBatis的接口并装配
(Spring将指定包中所有被@Mapper注解标注的接口自动装配为MyBatis的映射接口) -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- mybatis-spring组件的扫描器 com.dao只需要接口(接口方法与SQL映射文件中相同)-->
<property name="basePackage" value="com.dao"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
4.创建数据访问接口
在src目录下,创建一个名为com.dao的包,在该包中创建UserDao接口,并将接口使用@Mapper注解为Mapper,接口中的方法与SQL映射文件一致。源码太多,具体代码见文末Github地址。
@Repository("userDao")
@Mapper
/*使用Spring自动扫描MyBatis的接口并装配
(Spring将指定包中所有被@Mapper注解标注的接口自动装配为MyBatis的映射接口*/
public interface UserDao {
/**
* 接口方法对应SQL映射文件UserMapper.xml中的id
*/
public MyUser selectUserById(Integer uid);
public List<MyUser> selectAllUser();
public int addUser(MyUser user);
public int updateUser(MyUser user);
public int deleteUser(Integer uid);
}
5.创建控制层
在src目录下,创建一个名为com.controller的包,在包中创建UserController类,在该类中调用数据访问接口中的方法。
@Controller("userController")
public class UserController {
@Autowired
private UserDao userDao;
public void test() {
//只需要调用userDao中的接口即可--接口由Spring容器自动装配了Mybatis的映射接口--UserMapper.xml
//查询一个用户
MyUser auser = userDao.selectUserById(66);
System.out.println(auser);
System.out.println("================");
//添加一个用户
MyUser addmu = new MyUser();
addmu.setUname("陈恒");
addmu.setUsex("男");
int add = userDao.addUser(addmu);
System.out.println("添加了" + add + "条记录");
System.out.println("================");
//修改一个用户
MyUser updatemu = new MyUser();
updatemu.setUid(1);
updatemu.setUname("张三");
updatemu.setUsex("女");
int up = userDao.updateUser(updatemu);
System.out.println("修改了" + up + "条记录");
System.out.println( "================");
//删除一个用户
int dl = userDao.deleteUser(62);
System.out.println("删除了" + dl + "条记录");
System.out.println("================");
//查询所有用户
List<MyUser> list = userDao.selectAllUser();
for (MyUser myUser : list) {
System.out.println(myUser);
}
}
}
6.创建测试类
在包com.controller中,创建测试类TestController,代码如下:
ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
UserController uc = (UserController)appCon.getBean("userController");
uc.test();
结果同6.3小节是一样的,截图如下:
6.6 使用MyBatis Generator插件自动生成映射文件
使用MyBatis Generator插件自动生成MyBatis所需要的DAO接口、实体模型类POJO、Mapping映射文件,将生成的代码复制到项目工程中即可,把更多精力放在业务逻辑上。MyBatis Generator有三种常用方法自动生成代码:命令行、Eclipse插件和Maven插件。本节使用比较简单的方法(命令行)自动生成相关代码。
1.准备相关JAR包
需要准备的JAR包:mysql-connector-java-5.1.45-bin.jar和mybatis-generator-core-1.3.6.jar
(http://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core/1.3.6)。
2.创建文件目录
在某磁盘根目录下新建一个文件目录。如,D:\generator。并将mysql-connector-java-5.1.45-bin.jar和mybatis-generator-core-1.3.6.jar文件复制到generator目录下。另外,在generator目录下,创建src子目录存放生成的相关代码文件。
3.创建配置文件
在第二步创建的文件目录(D:\generator)下创建配置文件,如D:\generator\generator.xml。文件目录如图所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--数据库驱动-->
<classPathEntry location="mysql-connector-java-5.1.22-bin.jar"/>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接地址账号密码-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8" userId="root" password="root">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--生成Model类存放位置-->
<javaModelGenerator targetPackage="com.po" targetProject="src">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--生成映射文件存放位置-->
<sqlMapGenerator targetPackage="com.mapping" targetProject="src">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--生成Dao类存放位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.dao" targetProject="src">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!--生成对应表及类名-->
<table tableName="user" domainObjectName="Messgae" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
需要修改文件配置的地方我都已经把注释标注出来了,这里的相关路径(如数据库驱动包,生成对应的相关文件位置可以自定义)不能带有中文。
4.使用命令生成代码
打开命令提示符,进入D:\generator,输入命令:java -jar mybatis-generator-core-1.3.6.jar -configfile generator.xml –overwrite,具体命令随jar版本改变,如图所示:
java -jar mybatis-generator-core-1.3.6.jar -configfile generator.xml –overwrite
小技巧:Windows系统下,在该目录按住Shift键,右键鼠标选择"在此处打开命令窗口",复制粘贴生成语句的文件代码即可。
成功生成所需文件:
本教程所有源码地址:
https://github.com/jiahaoit/java_ssm_course