延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。
需求:查询订单信息的同时延时加载下单用户的信息
需求分析:如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。
开发步骤
1.配置与依赖
//在mybatis.xml文件中添加配置
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
//在pom文件中添加依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
2.mapper接口
public interface LazyLoadingMapper {
List<Orders> getOrdersUser();
User getUserById(int id);
}
3.sql映射文件
<?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="mapper.LazyLoadingMapper">
<select id="getOrdersUser" resultMap="orderUserResultMap">
select * from orders
</select>
<resultMap type="Orders" id="orderUserResultMap">
<id column="order_id" property="order_id"/>
<result column="order_id" property="order_id"/>
<result column="user_id" property="user_id"/>
<result column="order_no" property="order_no"/>
<association javaType="User" property="user" select="getUserById" column="user_id"/>
</resultMap>
<select id="getUserById" resultType="user">
select * from user where id = #{id}
</select>
</mapper>
4.po类编写
public class User {
//属性名要和数据库表的字段对应
private int id;
private String username;// 用户姓名
private String sex;// 性别
private String birthday;// 生日
private String address;// 地址
//get和set方法......
}
public class Orders{
private int order_id;
private int user_id;
private String order_no;
private String createTime;
private String note;
private User user;
//get和set方法......
}
5.测试
public class Test {
private static final Logger log = Logger.getLogger(Test.class.getName());
public static void main(String[] args) throws Exception {
// 1.获取mybatis配置文件的路径
String resource = "config/mybatis.xml";
// 2.得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 3.根据mybatis配置文件的信息创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
LazyLoadingMapper orderUserMapper = sqlSession.getMapper(LazyLoadingMapper.class);
List<Orders> ordersList = orderUserMapper.getOrdersUser();
for(Orders demo:ordersList){
System.out.println(demo.getOrder_no());
User user = demo.getUser();
System.out.println(user.getId());
System.out.println(user.getUsername());
}
}
}
运行测试结果如下