MyBatis笔记
0. 概述
Mybatis是一个优秀的基于Java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement等繁杂的过程。
官方网站:https://mybatis.org/mybatis-3/zh/index.html
Mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过Java对象和statement 中 sql的动态参数进行映射生成最终执行的 sql语句,最后由 Mybatis 框架执行 sql并将结果映射为 java 对象并 返回。
1. 配置文件
1. 主配置文件
1 |
|
2.和Dao类对应的XML文件
此处给出一个例子,给出IUserDao.java和IUserDao.xml文件
以下是Java代码
1 | public interface IUserDao { |
以下是对应的配置文件
1 |
|
3. 延迟加载
查询账户(Account)信息并且关联查询用户(User)信息。如果先查询账户(Account)信息即可满足要 求,当我们需要查询用户(User)信息时再查询用户(User)信息。把对用户(User)信息的按需去查询就是延迟加载。
比如,在查询账户时,需要连带查询其所属的用户。如果使用延迟加载,那么在需要用到用户的时候才进行查询。具体的配置在配置文件association标签中修改如下:
1 | <association property="user" javaType="User" select="com.billychen.dao.IUserDao.findById" column="uid"> </association> |
其含义是,根据用户的uid这一列的值,去查询所属账户的id。
为了使延迟加载生效,还需要在主配置文件中配置
1 | <settings> |
4. 一级缓存和二级缓存
1. 一级缓存
一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存
比如:
第一次发起查询用户 id 为 1 的用户信息,先去找缓存中是否有 id 为 1 的用户信息,如果没有,从数据库查询用户信息。
得到用户信息,将用户信息存储到一级缓存中。
如果 sqlSession 去执行 commit 操作(执行插入、更新、删除),清空 SqlSession 中的一级缓存,这样 做的目的为了让缓存中存储的是最新的信息,避免脏读。 第二次发起查询用户 id 为 1
的用户信息,先去找缓存中是否有 id 为 1 的用户信息,缓存中有,直接从缓存 中获取用户信息。
2. 二级缓存
二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个 SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。
开启二级缓存:
- 在
SqlMapConfig.xml中开启1
2
3
4<settings>
<!-- 开启二级缓存的支持 -->
<setting name="cacheEnabled" value="true"/>
</settings> - 配置响应的
mapper文件1
2
3
4<mapper namespace="com.itheima.dao.IUserDao">
<!-- 开启二级缓存的支持 -->
<cache></cache>
</mapper> - 配置
statement上的useCache属性1
2
3<select id="findById" resultType="user" parameterType="int" useCache="true">
select * from user where id = #{uid}
</select>