-
懒加载
-
概念
懒加载只能是通过
association
和collectibn
来实现,因为只有涉及到关联关系映射的的时候才会用到(多表查询), 所谓的懒加载就是需要使用的时候才给你加载 -
实现流程
- 配置mybatis-config.xml文件 开启懒加载模式(默认情况是积极加载)
<settings> <!-- 开启mybatis的懒加载开关--> <setting name="lazyLoadingEnabled" value="true"/> <!--把积极加载设置为false --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
-
一个订单表对应一个用户,通过订单表
orders
中user_id
字段是user
表中主键id
字段的外键 通过查询order表(select * from orders
),把对应的user_id
给(select * from user where id=#{id}
)查询出user
- OrderMapper接口
public interface OrdersMapper { //查询order的接口 public List<Orders> queryById(); }
- UserMapper接口
public interface UserMapper { // 通过id查找user public User queryById(int id); }
- OrderMapper.xml映射文件
<mapper namespace="com.zhiyou100.mapper.OrdersMapper"> <select id="queryById" resultMap="rm1"> select * from orders </select> <resultMap type="Orders" id="rm1"> <id column="id" property="id"/> <result column="order_id" property="number"/> <result column="create_time" property="createtime"/> <result column="user_id" property="u_id"/> <!--column 是从orders表的user_id字段直接当做查询user的参数id--> <association property="user" select="com.zhiyou100.mapper.UserMapper.queryById"column="user_id" javaType="User"> </association> </resultMap> </mapper>
- UserMapper.xml映射文件
mapper namespace="com.zhiyou100.mapper.UserMapper"> <select id="queryById" resultType="User" parameterType="Integer"> select * from user where id=#{id} </select> </mapper>
- 测试文件
@Test public void test1(){ //获取工厂 SqlSessionFactory factory = MybatisUtil.getFactory(); //获得会话对象 SqlSession session = factory.openSession(); //获得接口代理实现类对象 OrdersMapper mapper = session.getMapper(OrdersMapper.class); //通过实现类对象调用方法 List<Orders> list = mapper.queryById(); for (Orders orders : list) { System.out.println("订单编号:"+orders.getNumber()); } //关闭资源 session.close(); }
可以发现当只查询
orders
信息的时候并不会查询user
的相关信息,当使用到user
表中的相关信息的时候才会去查询user
表- 更改测试文件
@Test public void test1(){ SqlSessionFactory factory = MybatisUtil.getFactory(); SqlSession session = factory.openSession(); OrdersMapper mapper = session.getMapper(OrdersMapper.class); List<Orders> list = mapper.queryById(); for (Orders orders : list) { System.out.print("订单编号:"+orders.getNumber()); //需要用到user表中的信息了 才开始查询user表 System.out.println("订单所属的用户是:"+orders.getUser().getName()); } //获取用户名 session.close(); }
如果关闭了懒加载 并且不使用用户信息的时候 也会进行
user
表的查询 造成了数据库负担<setting name="aggressiveLazyLoading" value="true"/>
-
总结
懒加载就是通过表之间的关系映射 通过外键进行关联查询 主表的某个字段给附表作为参数查询
-
Mybatis 懒加载详解
最新推荐文章于 2023-06-22 21:24:09 发布