Mybatis核心知识整理

MyBatis

MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射,免除了几乎所有的jdbc代码以及设置参数和获取结果集的工作,它可以通过简单的xml或注解来配置java对象作为数据库中的记录。

MyBatis的编程步骤

  1. 创建SqlSessionFactory
  2. 通过SqlSessionFactory创建SqlSession
  3. 通过SqlSession执行数据库操作
  4. 调用session.commit()提交事务
  5. 调用session.close()关闭对话

MyBatis工作原理

  1. 读取MyBatis配置文件(mybatis-config.xml).它配置了MyBatis的运行环境等信息,例如数据库连接信息
  2. 加载映射文件,即SQL映射文件,改文件配置了操作数据库的sql语句
  3. 构造会话工厂SQLSessionFactory
  4. 根据会话工厂创建会话对象sqlSession,该对象包含了执行sql语句的所有方法
  5. Executor执行器,MyBatis底层定义了一个Executor接口来操作数据库,它根据sqlSession传递的参数动态地生成需要执行的sql语句
  6. MappedStatement对象,用于对映射信息的封装用于存储要映射的sql语句的id,参数等
  7. 输入参数映射,输入参数类型可以是Map、List等集合类型,也可以是基本数据类型
  8. 输出结果映射。

MyBatis中的执行器Executor

  • SimpleExecutor(默认):每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
  • ReuseExecutor:重复使用Statement对象。以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象供下次使用。
  • BatchExecutor:将所有sql都添加到批处理中,等待统一执行。

#{}和${}的区别

  • #{}是占位符,预编译处理;${}是拼接符,字符串替换
  • Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值
  • #{}可防止sql注入,提高系统的安全性

模糊查询like语句怎么写

  1. “%”#{value}”%” 注意,因为#{}解析成sql时,会在变量外侧自动加单引号,所以只能用双引号
  2. 推荐使用CONCAT函数,CONCAT(‘%’,#{value},’%’)
1
2
3
<select id="queryBookByName" resultType="Books">
select * from books where bookName like "%"#{bookName}"%";
</select>

mapper中传递参数的方法

1. Java Bean传参

2. @Param注解传参

3. Map传参法

1
2
3
4
5
6
7
8

public User selectUser(Map<String, Object> params);

<select id="selectUser" parameterType="java.util.Map"
resultMap="UserResultMap">
select * from user
where user_name = #{userName} and dept_id = #{deptId}
</select>

#{} 里面的名称对应的是Map里的key

Mapper编写的方式

使用Mapper扫描器

  1. mapper.xml文件的编写
    1. mapper.xml中的namespace为mapper接口的地址
    2. mapper接口中的方法名和mapper.xml中的定义的statement的id保持一致
  2. 定义mapper接口(与mapper.xml名称一致且在同一目录)
  3. 配置mapper扫描器
1
2
3
4
5
6
7
<!--配置扫描Dao接口包,动态实现Dao接口注入到spring容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--注入sqlSessionFactory-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--给出需要扫描Dao接口包-->
<property name="basePackage" value="xyz.yolin.mapper"/>
</bean>

什么是MyBatis 的接口绑定?

接口绑定,就是接口里的方法和sql语句绑定,我们直接调用方法就可以了

有哪些实现方式?

  1. 通过注解绑定,在接口上加上@Select、@Update等注解
  2. xml配置来绑定,需要指定xml映射文件里的namespace为接口的全路径名

sql语句简单时用注解,复杂时用xml绑定

MyBatis中不同的xml映射文件,id是否可以重复

  • 如果配置了namespace,则id可以重复,如果没有配置namespace,则不能重复。
  • 原因就是Map<String,MappedStatement>的key是namespace+id,有了namespace,自然id可以重复

动态sql

MyBatis的动态sql可以让我们在xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,MyBatis提供多种动态sql标签:

trim、where、set、foreach、if、choose、when、otherwise、bind

Mybatis一级、二级缓存

  1. 一级缓存:基于PerpetualCache的HahsMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache就将清空
  2. 二级缓存与一级缓存机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于存储作用域为Mapper(namespace),且可以自定义存储源

MyBatis分页

使用分页插件pageHelper

1
2
3
4
5
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.11</version>
</dependency>

分页插件的基本原理是使用MyBatis提供的插件接口,实现自定义插件,在插件拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和分页参数

请我喝杯咖啡吧~

支付宝
微信