MyBatis懒加载(延迟加载)

定义:

懒加载就是在需要使用这个数据的时候再去进行查询加载,不需要的时候就不查询。也就是按需加载

优点:

把关联查询分两次来做,而不是一次性查出所有的,延迟加载即先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

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();
        }
    }
}

运行结果:

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值