Mybatis延迟加载和缓存策略

Mybatis延迟加载和缓存策略

文章目录

    • Mybatis延迟加载和缓存策略
      • 1. 延迟加载
        • 1.1 一对一案例
        • 1.2 延迟加载的方案
        • 1.3 测试
        • 1.4 结果
        • 2.1 一级缓存测试
        • 2.2 二级缓存
          • 2.2.1 二级缓存说明
          • 2.2.2 二级缓存测试

1. 延迟加载

​ 延迟加载就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.

**好处:**先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

**缺点:**因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。

1.1 一对一案例

一个账户只属于一个用户

  • 数据库表

account账户表

字段 类型
accountId int(11)
UID int(11)
MONEY double

user表

字段 类型
id int(11)
username varchar(32)
birthday datetime
sex char(1)
address varchar(256)
  • Account 与 User实体类
public class Account {
	private int accountId;
	private int uid;
	private double money;
	// 一个账户对应一个用户
	private User user;
}

public class User {
	private int id;
	private String username;
	private Date birthday;
	private String sex;
	private String address;
	// 一个用户,对应多个账户
	private List<Account> accounts;
}
  • IAccountDao 和 IUserDao 接口
public interface IUserDao {  
    /**
     * 通过id查找用户
     */
    User findUserById(int id);
    
}

public interface IAccountDao {
    /**
     * 查询全部账户(需要查询账户的用户)
     */
    List<Account> findAll();
    
}
  • 映射文件配置

对IUserDao.java接口进行映射


 
< mapper namespace ="com.itheima.dao.IUserDao" >
	< select id ="findById" resultType ="user">
		select * from user where id=#{id}
	

对IAccountDao.java接口进行映射


 >
<mapper namespace="com.itheima.dao.IAccountDao">
<resultMap id="accountResultMap" type="account">
    
    <id property="accountId" column="accountId">id>
    <result property="uid" column="uid">result>
    <result property="money" column="money">result>
    
    
    
    <association property="user" javaType="user" column="uid"
      select="com.itheima.dao.IUserDao.findById">association>
resultMap>