Java-MyBatis 框架之延迟加载、缓存和分页

第一节:性能优化

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());
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值