第一节:性能优化
1.1 延迟加载
1.1.1 什么是延迟加载
? resultMap中的association和collection标签具有延迟加载的功能。
延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。需要关联信息时再去按需加载关联信息。这样会大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
1.1.2 设置延迟加载
? Mybatis默认是不开启延迟加载功能的,我们需要手动开启。需要在SqlMapConfig.xml文件中,在标签中开启延迟加载功能。
<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方法去查询用户信息。
总之:
使用延迟加载方法,先去查询单表数据,再去按需要加载关联查询的其它信息。
1.2 MyBatis缓存
Mybatis的缓存,包括一级缓存和二级缓存: