1.什么是延迟加载
resultMap可以实现高级映射,association、collection具备延迟加载功能。
延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询速度快。
2.根据订单查询相关联用户,使用延迟加载
- sql语句(子查询)
SELECT * ,
(SELECT `user`.username FROM user WHERE `user`.id=orders.user_id)username
FROM orders
- mapper.xml
1.只查询订单信息
<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
SELECT * FROM orders
</select>
2.关联查询用户信息
通过上边查询到的订单信息中的user_id去关联查询用户信息。
使用UserMapper.xml中的findUserById。
<select id="findUserById" parameterType="int" resultType="com.chinglee.mybatis.pojo.User">
SELECT * FROM user WHERE id=#{id}
</select>
上边先去执行findOrdersUserLazyLoading,需要查询用户信息的时候再执行findUserById。
- resultMap的配置
使用association中的select指定延迟加载去执行的statement的id。
<resultMap id="OrdersUserLazyLoadingResultMap" type="com.chinglee.mybatis.pojo.Orders">
<id column="id" property="id"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<!-- 实现对用户的延时加载
colunm:订单中关联用户的查询的列
-->
<association property="user" javaType="com.chinglee.mybatis.pojo.User" select="com.chinglee.mybatis.mapper.UserMapper.findUserById" column="user_id">
</association>
</resultMap>
- OrderCustomMapper.java
//查询订单关联查询用户,用户信息延迟加载
public List<Order> findOrdersUserLazyLoading() throws Exception;
- 延迟加载配置
mybatis默认没有开启延迟加载,需要在sqlMapConfig.xml中setting配置。
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
- 测试
1.执行mapper方法findOrdersUserLazyLoading,内部去调用com.chinglee.mybatis.mapper.OrderCustomMapper中的findOrdersUserLazyLoading,只查询到orders信息(单表)
2.在程序中去遍历上一步骤查询出的List<Orders>,当我们调用Orders中的getUser方法时,开始延迟加载。
3.延迟加载,去调用UserMapper.xml中findUserbyId方法获取用户信息。
//查询订单关联查询用户延迟加载
public void findOrdersUserLazyLoadingTest() throws Exception{
SqlSession sqlSession=sqlSessionFactory.openSession();
//创建代理对象
OrderCustomMapper orderCustomMapper= sqlSession.getMapper(OrderCustomMapper.class);
//调用mapper的方法
List<Orders> list =orderCustomMapper.findOrdersUserLazyLoading();
//遍历上边的订单列表
for(Orders orders:list){
//执行getUser
User user=orders.getUser();
System.out.println(user);
}
sqlSession.close();
}
总之:
使用延迟加载方法,先去查询简单的sql(最好单表,也可以是关联的表),再去按需加载关联查询的其他信息。