延迟加载:先简单查询、需要时再从关联表去关联查询
1.配置:(在mybatis配置文件中开启延迟加载)
<settings>
<!--打开延迟加载开关-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--将积极加载改为消极加载-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
2.resultMap中的association、collection具备延迟加载功能
数据库表结构:
需求:查询orders,关联查询user信息
sql:(这里用户信息只写一个username,其他同理)
a)关联查询方式
SELECT orders.*, user.username FROM orders, user WHERE orders.user_id = user.id;
b)子查询方式
select orders.*,(select username from user where user.id = orders.user_id)username from orders;
pojo的属性:
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//用户信息
private User user;
mapper.xml:
a)关联查询的statement
<resultMap id="OrdersUserResultMap" type="cn.demo.ssm.po.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"/>
<!--配置映射的关联的用户信息-->
<association property="user" javaType="cn.demo.ssm.po.User">
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<result column="address" property="address"/>
</association>
</resultMap>
<select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
SELECT
orders.*,
user.username
FROM
orders,
user
WHERE orders.user_id = user.id
</select>
b**)延迟加载的statement**
<!--延迟加载的resultMap-->
<resultMap id="OrdersUserLazyLoadingResultMap" type="cn.demo.ssm.po.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(SQL语句)-->
<!--column:订单信息中关联用户信息的列-->
<association property="user" javaType="cn.demo.ssm.po.User" column="user_id" select="findUserById">
</association>
</resultMap>
<!--子查询-->
<select id="findUserById" parameterType="int" resultType="cn.demo.ssm.po.User">
SELECT * FROM user WHERE id=#{value}
</select>
<!--查询订单关联查询用户,用户信息延迟加载-->
<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
SELECT * FROM orders
</select>
测试代码:
List<Orders> list = ordersMapperCustom.findOrdersUserLazyLoading();
for(Orders orders:list){
User user = orders.getUser();
System.out.println(user);
}
对于延迟加载,当执行orders.getUser()时,子查询加载
对于关联查询,直接查询全部信息
可以查看日志,mybatis生成的sql
3.延迟加载的优点:将多表关联查询,变成单表或者双表查询,提高数据库性能
4.等价替换
可以先查询orders,在数据处理时在根据orders.user_id查询用户信息