Mybatis实现延迟加载的原理和过程实例
时间: 2023-06-01 17:04:11 浏览: 114
mybatis延迟加载样例
3星 · 编辑精心推荐
Mybatis实现延迟加载的原理是通过动态代理技术,当查询到需要延迟加载的属性时,不立即去数据库查询,而是返回一个代理对象,等到使用该属性时再去查询数据库。
下面是一个简单的示例:
1. 定义User类和Order类,User类中有一个List<Order>属性:
public class User {
private int id;
private String username;
private List<Order> orders;
// getter和setter
}
public class Order {
private int id;
private String orderNo;
// getter和setter
}
2. 定义UserMapper接口,其中定义一个selectById方法,查询用户信息以及用户的订单信息:
public interface UserMapper {
User selectById(int id);
}
3. 定义UserMapper.xml文件,实现selectById方法:
<select id="selectById" resultMap="userResultMap">
select * from user where id = #{id}
</select>
<resultMap id="userResultMap" type="User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<collection property="orders" ofType="Order" select="selectOrdersByUserId"/>
</resultMap>
<select id="selectOrdersByUserId" resultMap="orderResultMap">
select * from order where user_id = #{id}
</select>
<resultMap id="orderResultMap" type="Order">
<id column="id" property="id"/>
<result column="order_no" property="orderNo"/>
</resultMap>
4. 在Mybatis配置文件中配置延迟加载:
<configuration>
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
</configuration>
5. 在Java代码中调用selectById方法获取用户信息:
User user = userMapper.selectById(1);
此时,只有用户信息被查询出来,用户的订单信息并没有被查询出来,而是返回了一个代理对象。
6. 当使用用户的订单信息时,代理对象会去查询数据库,获取订单信息:
List<Order> orders = user.getOrders();
此时,代理对象会调用selectOrdersByUserId方法查询数据库,获取用户的订单信息。
通过以上过程可以看出,Mybatis实现延迟加载的原理就是通过代理对象实现的。当需要延迟加载的属性被调用时,代理对象会去查询数据库获取数据,从而实现延迟加载。
阅读全文