05.mybatis优化和分页

Mybatis03-优化和分页

第一节:性能优化

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>
设置项 描述 允许值 默认值
lazyLoadingEnabled 全局性设置懒加载。如果设为false,则所有相关联的都会被初始化加载。 true | false false
aggressiveLazyLoading 当设置为true的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 true | false true
1.1.3 使用association进行延迟加载
(1) 需求
查询订单并且关联查询用户信息(对用户信息的加载要求是按需加载)
(2) 编写映射文件
需要定义两个mapper的方法对应的statement。

1、只查询订单信息

SELECT * FROM orders

在查询订单的statement中使用association去延迟加载(执行)下边的satatement(关联查询用户信息)

<!-- 定义OrdersUserLazyLoadingRstMap -->
<resultMap type="com.qf.mybatis.po.Orders" id="OrdersUserLazyLoadingRstMap">
    <id column="id" property="id" />
    <result column="user_id" property="userId" />
    <result column="number" property="number" />
    <result column="createtime" property="createtime" />
    <result column="note" property="note" />
    <!-- 延迟加载用户信息 -->
    <!-- select:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement)
       我们使用UserMapper.xml中的findUserById完成根据用户ID(user_id)查询用户信
       如果findUserById不在本mapper中,前边需要加namespace
    -->
    <!-- column:主信息表中需要关联查询的列,此处是user_id -->
    <association property="user" select="com.qf.mybatis.mapper.UserMapper.findUserById" column="user_id"></association>
</resultMap>
<!-- 查询订单信息,延迟加载关联查询的用户信息 -->
<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingRstMap">
    SELECT * FROM orders
</select>

2、关联查询用户信息

通过上边查询到的订单信息中user_id去关联查询用户信息

使用UserMapper.xml中的findUserById

<select id="findUserById" parameterType="int"
       resultType="com.qf.mybatis.po.User">
    SELECT * FROM user WHERE id = #{id}
</select>

上边先去执行findOrdersUserLazyLoading,当需要去查询用户的时候再去执行findUserById,通过resultMap的定义将延迟加载执行配置起来。
(3) 加载映射文件

<package name="com.qf.mybatis.mapper”/>

(4) 编写mapper接口
// 查询订单信息,延迟加载关联查询的用户信息
public List<Orders> findOrdersUserLazyLoading();

(5) 编写测试代码

思路:

1、执行上边mapper方法(findOrdersUserLazyLoading),内部去调用com.qf.mybatis.mapper.OrdersMapper中的findOrdersUserLazyLoading只查询orders信息(单表)。

2、在程序中去遍历上一步骤查询出的List,当我们调用Orders中的getUser方法时,开始进行延迟加载。

3、执行延迟加载,去调用UserMapper.xml中findUserbyId这个方法获取用户信息。

@Test
public void testFindOrdersUserLazyLoading() {
   
    // 创建sqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 通过SqlSession构造usermapper的代理对象
    OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
    // 调用usermapper的方法
    List<Orders> list = ordersMapper.findOrdersUserLazyLoading();
    for(Orders orders : list){
   
       System.out.println(orders.getId());
       System.out.println(orders.getUser());
    }
    // 释放SqlSession
    sqlSession.close();
}

1.4、延迟加载思考
不使用mybatis提供的association及collection中的延迟加载功能,如何实现延迟加载?
实现方法如下:

定义两个mapper方法:

1、查询订单列表

2、根据用户id查询用户信息

实现思路:

先去查询第一个mapper方法,获取订单信息列表

在程序中(service),按需去调用第二个mapper方法去查询用户信息。

 总之:

使用延迟加载方法,先去查询单表数据,再去按需要加载关联查询的其它信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值