mybatis分步查询,懒加载未生效问题

mybatis分步查询,懒加载未生效问题

1.背景:

在mybatis的一对多查询中,collection可以步骤查询,即一对多场景,如果需要多,则先查一(省份),再查多(省份对应的所有城市)。如果仅仅查看(getProvinceName())一的某个属性,暂时不用多(省份对应的所有城市),则城市不应该被查询,即懒加载要生效

懒加载应该生效的场景

 Province province = cityService.queryCityByProIdStep(proId);
        if (province != null) {
            System.out.println(province.getProName());
        }

分步查询:先查省份,再查省份对应的所有城市

 Province province = cityService.queryCityByProIdStep(proId);
        if (province != null) {
            System.out.println(province.getProName());
            System.out.println(province.getCityList());
        }

2.解决

懒加载的配置application中,全局生效
mybatis.configuration.lazy-loading-enabled=true
mybatis.configuration.aggressive-lazy-loading=false

或者fetchType=“lazy”,仅仅这个Mapper.xml懒加载生效

 <collection property="cityList"
                    ofType="com.jd.lean.mjp.dal.entity.City"
                    select="com.jd.lean.mjp.dal.mapper.CityMapper.queryCitysByProId"
                    column="{ppid = ProID}" fetchType="lazy"
        />
MyBatis提供了一种分步查询的方式,可以在多个SQL语句中执行查询,并将结果连接在一起。这种方式可以减少内存消耗,特别是当查询结果集非常大时。 下面是一个示例,展示了如何使用MyBatis进行分步查询: 首先,需要定义一个Mapper接口,其中包含需要执行的SQL语句: ```java public interface UserMapper { List<User> getUsers(); List<Order> getOrdersByUserId(int userId); } ``` 然后,在Mapper的XML配置文件中定义SQL语句: ```xml <!-- 获取用户列表 --> <select id="getUsers" resultType="User"> SELECT * FROM users </select> <!-- 根据用户ID获取订单列表 --> <select id="getOrdersByUserId" resultType="Order"> SELECT * FROM orders WHERE user_id = #{userId} </select> ``` 接下来,可以在Java代码中使用分步查询。首先执行获取用户列表的查询,然后根据每个用户的ID执行获取订单列表的查询: ```java try (SqlSession sqlSession = sqlSessionFactory.openSession()) { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 获取用户列表 List<User> users = userMapper.getUsers(); // 遍历用户列表,获取每个用户的订单列表 for (User user : users) { List<Order> orders = userMapper.getOrdersByUserId(user.getId()); user.setOrders(orders); } } ``` 通过这种方式,可以实现分步查询,以减少内存消耗并提高性能。注意,在实际使用中,可能需要根据具体的业务需求进行适当的调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值