第一节:性能优化
1.1 延迟加载
1.1.1 什么是延迟加载
resultMap中的association和collection标签具有延迟加载的功能。
延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。需要关联信息时再去按需加载关联信息。这样会大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
1.1.2 设置延迟加载
Mybatis默认是不开启延迟加载功能的,我们需要手动开启。需要在SqlMapConfig.xml文件中,在<settings>标签中开启延迟加载功能。
<settings>
<!-- 全局性设置懒加载。如果设为false,则所有相关联的都会被初始化加载。 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当设置为true的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
1.2 MyBatis缓存
Mybatis的缓存,包括一级缓存和二级缓存:
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。 级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。 一级缓存是默认使用的。二级缓存需要手动开启。
二级缓存
使用 <catch/> 标签来定义是否进入缓存
二级缓存需要提交事务,才会生效。
原因:用于全局共享的数据,还是在操作数据的事务结束后再生效为好。
1.2.1 一级缓存
第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。
如果sqlSession去执行commit操作(执行插入、更新、删除),清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
**** 如果是执行两次service调用查询相同 的用户信息,不走一级缓存,因为session方法结束,sqlSession就关闭,一级缓存就清空。
第二节:分页查询
PageHelper的使用
第一步:添加依赖
依赖信息如下:
<!--5-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.6</version>
</dependency>
第二步:配置pageHelper插件
<plugins>
<!--5.0之前版本 方言去掉,可以自动识别,不然报错-->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--也大小为0,查询所有的数据 -->
<property name="pageSizeZero" value="true"/>
<!--查询合理化 index<1 查询第一页 index>pageCount 查询最后一页 -->
<property name="reasonable" value="true"/>
</plugin>
</plugins>
第三步:编写代码测试
@Test
public void queryAll(){
PageHelper.startPage(1, 3);
PageHelper.orderBy("id");
List<User> list = userMapper.queryAll();
PageInfo<User> p=new PageInfo<User>(list);
for (User user : list) {
System.out.println(user.toString());
}
System.out.println(p.getPages());
System.out.println(p.getPageSize());
System.out.println(p.getPageNum());
System.out.println(p.getOrderBy());
}