带你学习MyBatis
(一)什么是MyBatis
MyBatis是一个开源的数据持久层框架。它内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询、存储过程和高级映射,几乎消除了所有的JDBC代码和参数的手工设置以及结果集的检索。
(二)MyBatis框架的优缺点
优点:
①与JDBC相比,减少了50%以上的代码量
②最简单的持久化框架,小巧并简单易学
③SQL代码从程序代码中彻底分离,可重用
④提供XML标签,支持编写动态SQL
⑤提供映射标签,支持对象与数据库的ORM字段映射
缺点 :
①SQL语句编写工作量大,对开发人员有一定要求
②数据库移植性差
(三)使用MyBatis的开发步骤
1、下载jar包并导入工程
①mybatis-3.2.2.jar
② MySQL-connector-java-5.1.0-bin.jar
2、创建MyBatis核心配置文件(configuration.xml),并配置相关的database.properties
<?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="database.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value ="${url}"/>
<property name="username" value ="${user}"/>
<property name="password" value ="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
//mapper.xml文件的路径
<mapper url="file:///D:\java\idea-project\sj3\src\main\java\mapper\ProviderMapper.xml"/>
</mappers>
</configuration>
再根据自己的数据库好配置相关的database.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/数据库名?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
user=root
password=root
3、创建持久化类(POJO)和SQL映射文件
4、创建测试类
①读取核心配置文件mybatis-config.xml
② 创建SqlSessionFactory对象,读取配置文件
③创建SqlSession对象
④关闭SqlSession对象
@Test
public void testGetUserList {
SqlSession sqlSession=null;
List<Provider> providerList=new ArrayList<Provider>();
try{
sqlSession = MaBatisUtil.createSqlSession();
providerlist= sqlSession.selectList("cn.smbms.dao.provider.ProviderMapper.getProviderList")
}catch(Exception e){
e.printStakeTrace();
}finally{
MyBatisUtil.closeSqlSession(sqlSession);
}
for(Provider provider :list){
System.out.println(“需要打印出来的数据”);
}
}
(四)使用MyBatis实现对数据的增删改查
1、使用insert完成增加操作
2、使用delete完成删除操作
3、使用update完成修改操作
4、使用select完成查询操作
select语句有很多属性可以详细配置每一条语句
①id:命名空间中唯一的标识符,接口中的方法与映射文件中 的SQL语句id一一对应
②parameterType:传入SQL语句的参数类型
,表示SQL语句返回值类型的完整类名或别名
③resultType:表示查询语句返回结果类型的完全限定名或别名
④resultMap:对外部resultMap的引用
(五)MyBatis缓存
1、一级缓存
一级缓存是基于PrepetualCache(MyBatis自带)的HashMap本地缓存,作用范围为session域内,当session flush或者close之后,该session中所有的cache就会被清空
2、二级缓存
二级缓存就是global caching,它超出session范围之外,可以被所有SqlSession共享,开启它只需要在MyBatis的核心配置文件(mybatis-config.xml)setting中设置即可
▪二级缓存的配置
⑴在mybatis-config.xml中的setting中设置全局cache配置
<setting>
<setting name="cacheEnabled" value="true"/>
</setting>
⑵在mapper文件(如UserMapper.xml)中设置缓存
<mapper namespace="cn.smbms.dao.user.UserMapper">
<!--cache配置-->
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
......
</mapper>
⑶在mapper文件配置支持cache后,如果需要对个别查询进行调整,可以单独设置cache
<select id="getUserList" resultType="User" userCache="true">
......
</select>
(六)动态SQL
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似.MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。用于实现动态SQL的元素如下:
① if:利用if实现简单的条件选择
② choose:相当于Java中的switch语句,通常与when和otherwise搭配
③ where:简化SQL语句中where的条件判断
④ set:解决动态更新语句
⑤ trim:可以灵活的去除多余的关键字
⑥ foreach:迭代一个集合,通常用于in条件
•if,用于简单的条件判断
<if test="title != null">
and title like #{title}
</if>
•where,用来简化SQL语句中的where条件判断,并能智能的处理and和or
<where>
<if test="title != null">
and title like #{title}
</if>
</where>
•choose(when,otherwise),当test属性中的条件满足的话,执行when元素中的内容,不满足则自动输出otherwise元素中的内容
<choose>
<when test="title != null">
and title like #{title}
</when>
<when test="author != null and author.name != null">
and author_name like #{author.name}
</when>
<otherwise>
and featured = 1
</otherwise>
</choose>
•trim(where,set)
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
•foreach,完成复杂查询,主要用于in条件查询中,迭代集合
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
(七)MyBatis分页
1、引用jar
<!-- pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
<!-- jsqlparser -->
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>3.0</version>
</dependency>
2、配置拦截
<!--
plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="reasonable" value="true"/>
</plugin>
</plugins>
3、定义sql
<select id="selectPage" resultMap="membersMap">
select id,mname,mgender,mage from membersinfo
where 1 = 1
</select>
4、测试
@Test
public void testPage(){
SqlSession sqlSession = MybatisUtils.open();
MembersInfoMapper mapper = sqlSession.getMapper(MembersInfoMapper.class);
//引用pagehelper设置分页信息,这行代码必须在执行mapper层的sql前一行
PageHelper.startPage(1, 3, true);
List<Membersinfo> list = mapper.selectPage();
for (Membersinfo membersinfo : list) {
System.out.println(membersinfo.getId() + "," + membersinfo.getMname());
}
MybatisUtils.close(sqlSession);
}
国内牛人的一个开源项目,有兴趣的可以去看源码,都有中文注释
源码:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md