mybatis的延时加载
1、定义
mybatis延时加载即用时查询,通常用于多表联级查询
2、好处
mybatis延时加载 把关联表的查询 拆分 一个个单表查询,关联的表需要时再去查询。提升性能
数据库单表查询性能 > 关联查询的性能
3、配置
默认关闭 如下全局配置中开启
<settings>
<!--开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--关闭积极加载-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
4、使用
在resultMap中使用association或者collection,即可使用延迟加载。
如:
-
<!--查询订单和创建订单的用户,使用延迟加载--> <resultMap id="OrderAndUserLazyLoad" type="Orders"> <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 colunm:关联两张表的那个列的列名 --> <association property="user" javaType="User" select="findUser" column="user_id"> </association> </resultMap>
- 必须要有两个statement
-
两个statement直接必须存在关联的数据列
<select id="findOrdersByLazyLoad" resultMap="OrderAndUserLazyLoad"> SELECT * FROM orders </select> <select id="findUser" parameterType="int" resultType="User"> SELECT * FROM User WHERE id = #{value} </select>
public void testFindOrdersByLazyLoad() throws Exception{
SqlSession session = sessionFactory.openSession();
Mapper mapper = session.getMapper(Mapper.class);
//只会发送查询订单信息的SQL
List orders = mapper.findOrdersByLazyLoad();
for (Orders order : orders){
//会发生查询用户信息的SQL
order.getUser();
}
}
5、总结
association、collection支持延时加载
association:一对一映射
collection:一对多映射
参考:
https://www.cnblogs.com/dreamyoung/p/11801950.html