本章主要内容: 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:generatorgenerator.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