定义:
懒加载就是在需要使用这个数据的时候再去进行查询加载,不需要的时候就不查询。也就是按需加载
优点:
把关联查询分两次来做,而不是一次性查出所有的,延迟加载即先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
mybatis支持懒加载,resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。
需求:
假如现在有两张数据表,购物车和购物车项。要根据购物车cartId查询购物车和购物车的项。有两种方法
- 方法一:直接进行两张表的关联查询
select * from cart c,cartitem ci
where c.cartId = '4275a23c41694cc0ae54f2a8d97b024b' and c.cartId=ci.cartId
- 方法二:分步查询,首先通过cartId查询cart信息,然后通过查询到cart信息查询cartItem的信息
select * from cart where cartId='传入cartId'
select * from cartitem where cartId = #{cartId}
1 、这两步都是单表查询,执行效率比关联查询要高很多
2 、分两步,如果我们不需要cartItem的信息,那么我们就不必执行第二步,程序没有进行多余的操作。
方式二就是懒加载。
具体Demo
项目结构图:
数据库表字段
实体类:
购物车和购物车项为一对多的关系:需要在一的一方引入多的一方的集合
Cart
public class Cart {
private String cartId;
private long userId;
private long totalnum;
private double totalmoney;
private List<Cartitem> cartitemList;
getter setter toString
CartItem
public class Cartitem {
private String cartItemId;
private String cartId;
private String pid;
private long pnum;
private double pmoney;
getter setter toString
这里就不贴出来主配置文件了
编写接口和对应的映射文件
CartMapper
public interface CartMapper {
/**
* 根据购物车id查询购物车和购物车的项
*/
Cart selectCartAndCartItemByCartId(String cartId);
}
CartMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.codeyancy.cn.mapper.CartMapper">
<resultMap id="selectCartAndCartItemByCartIdMap" type="cart">
<result column="cartId" property="cartId"/>
<result column="userId" property="userId"/>
<result column="totalnum" property="totalnum"/>
<result column="totalmoney" property="totalmoney"/>
<collection property="cartitemList" ofType="cartitem" select="com.codeyancy.cn.mapper.CartItemMapper.selectCartItemByCartId"
column="cartId">
<result column="cartItemId" property="cartItemId"/>
<result column="cartId" property="cartId"/>
<result column="pid" property="pid"/>
<result column="pnum" property="pnum"/>
<result column="pmoney" property="pmoney"/>
</collection>
</resultMap>
<select id="selectCartAndCartItemByCartId" resultMap="selectCartAndCartItemByCartIdMap" parameterType="string">
select * from cart where cartId=#{cartId}
</select>
</mapper>
CartItemMapper
public interface CartItemMapper {
/**
*根据购物车id查询购物车项
*/
List<Cartitem> selectCartItemByCartId(String cartId);
}
CartItemMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.codeyancy.cn.mapper.CartItemMapper">
<select id="selectCartItemByCartId" parameterType="string" resultType="cartitem">
select * from cartitem where cartId = #{cartId}
</select>
</mapper>
此时需要在主配置文件中开启懒加载
mybatis-config.xml 部分代码
<!--懒加载-->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
编写测试类Demo
public class Demo {
SqlSession sqlSession;
InputStream resourceAsStream;
@Before
public void init(){
String path = "mybatis-config.xml";
try {
resourceAsStream = Resources.getResourceAsStream(path);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
sqlSession = sqlSessionFactory.openSession(true);
}
@Test
public void test(){
CartMapper mapper = sqlSession.getMapper(CartMapper.class);
Cart cart = mapper.selectCartAndCartItemByCartId("4275a23c41694cc0ae54f2a8d97b024b");
System.out.println("购物车id:"+cart.getCartId());
System.out.println("--------购物车的项如下--------");
cart.getCartitemList().forEach(cartitem -> System.out.println(cartitem));
}
@After
public void destroy(){
sqlSession.close();
try {
resourceAsStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果: