本文使用的案例是出自该博客的多对多查询>>>>>> Mybatis中连表查询的学习
1.延迟加载(按需加载)
- 使用场景:
如果只是处理登录请求,有关于用户的订单之类的其他信息,属于无用的数据,加载这些数据造成了资源浪费,有些时候,有些数据需要要求我们做选择,选择性的加载,按照需要加载,这种方式按需加载(延迟加载)
- 简单来说就是我们查询数据有的时候没有必要一次性将全部关联数据查询出来.
- Mybatis如何使用按需加载?
方式一 | 局部延迟加载 |
---|---|
方式二 | 全局延迟加载配置 |
使用局部延迟加载:
- 我们如果不想把用户的订单信息全部查询出来,只是查询其用户信息怎么办,这里使用到< collection >标签的属性:fetchType,其有两个值,一个为lazy延迟加载,一个为eager立即加载
- 代码实现:
<resultMap id="newMap1" type="com.offcn.pojo.Customer" extends="baesMap">
<collection property="orders" ofType="com.offcn.pojo.Orders"
column="cid" select="com.offcn.mapper.OrdersMapper.queryByid" fetchType="lazy">
</collection>
</resultMap>
<select id="queryByidLazy" parameterType="int" resultMap="newMap1">
select * from customer where cid=#{cid};
</select>
使用全局延迟加载:
- 在Mybatis核心配置文件中设置:
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
总结:
第一点 | 全局延迟加载优先级低于局部设置 |
---|---|
第二点 | 延迟加载开启需要关联查询的方式为嵌套查询 |
2.二级缓存
- 目的:
降低服务器请求次数,减少服务器压力
- 有关缓存的算法:常用缓存淘汰算法(LFU、LRU、ARC、FIFO、MRU)
- Mybatis缓存的分类:
第一种 | 一级缓存 |
---|---|
第二种 | 二级缓存 |
一级缓存:
- SqlSession级别的缓存,默认开启,不可关闭.
- 具体实现场景:当我们使用相同映射对象执行方法,并且条件相同,那么当第一次执行结束后,第二次执行不会调用sql语句执行,而是从一级缓存中读取.
- 代码实现:
@Test
public void testQueryByCnum() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
CardMapper mapper = sqlSession.getMapper(CardMapper.class);
Card card = mapper.queryByCnum("111111");
System.out.println("---------");
Card card1 = mapper.queryByCnum("111111");
System.out.println(card1);
System.out.println(card);
sqlSession.close();
}
- 结果:
- 可以看到执行了两次.
- 如果想再次手动获取,需要清理缓存,这里有三种方式:
第一种 | clearCache |
---|---|
第二种 | commit |
第三种 | close |
- 我们修改上面代码,实现清除缓存:
@Test
public void testQueryByCnum() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
CardMapper mapper = sqlSession.getMapper(CardMapper.class);
Card card = mapper.queryByCnum("111111");
System.out.println("---------");
sqlSession.clearCache();
Card card1 = mapper.queryByCnum("111111");
System.out.println(card1);
System.out.println(card);
sqlSession.close();
}
- 结果:
二级缓存:
-
可以理解为SqlSessionFactory级别的缓存.
-
画张图片来理解:
-
我们可以类比JSP的域对象,此时mapper对象好比request对象,范围是一次请求,而SqlSessionFactory就是session对象的作用范围.
-
二级缓存默认关闭,接下来如何使用呢?
-
第一步:全局配置文件中开启二级缓存:
<settings>
<setting name="cacheEnabled" value="true"></setting>
</settings>
- 第二步:在需要开启缓存的映射文件中设置:
- 对于局部禁用缓存,我们使用useCache属性为false即可
- 对于可以使用缓存的实体类需要实现序列化接口.
3.Mybatis使用注解开发
- Mybatis支持使用注解来快速实现sql语句的实现.
1.使用注解完成单表的增删改查:
2.使用注解完成一对一连表查询: