什么是延迟加载
延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
例子:如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。
MyBatis有实现高级映射的resultMap
标签。resultMap
标签中的association
和collection
两个属性,可以实现延迟加载。1
实现延迟加载2
在数据库准备两张表
CREATE TABLE USER (
`id` INT(11)NOT NULL AUTO_INCREMENT,
`username` VARCHAR(32) NOT NULL COMMENT '用户名',
`telephone` VARCHAR(11) NOT NULL COMMENT '手机',
`birthday` DATETIME DEFAULT NULL COMMENT '生日',
`gender` CHAR(1) DEFAULT NULL COMMENT '性别',
`address` VARCHAR(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE TABLE `account` (
`ID` int(11) NOT NULL COMMENT '编号',
`UID` int(11) default NULL COMMENT '用户编号',
`MONEY` double default NULL COMMENT '金额',
PRIMARY KEY (`ID`),
KEY `FK_Reference_8` (`UID`),
CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后分别创建出其对应的实体类
public class User implements Serializable {
private Integer id;
private String username;
private String telephone;
private Date birthday;
private String gender;
private String address;
//一对多关系映射,主表实体应该包含从表实体的集合引用
private List<Account> accounts;
...... 请补充 get set 和 toString 方法
}
public class Account implements Serializable {
private Integer id;
private Integer uid;
private Double money;
//从表实体应该包含一个主表实体的对象引用
private User user;
...... 请补充 get set 和 toString 方法
}
两个接口中创建对应方法
public interface AccountMapper {
/**
* 查询所有账户
* @return
*/
List<Account> findAll();
}
public interface UserMapper {
/**
* 查询所有用户信息,同时显示出该用户下的所有账户
*
* @return
*/
List<User> findAll();
/**
* 根据id查询用户信息
* @param userId
* @return
*/
User findById(Integer userId);
}
创建相应的XML映射文件
<mapper namespace="cn.ideal.mapper.AccountMapper">
<!-- 定义封装 Account和User 的resultMap -->
<resultMap id="userAccountMap" type="Account">
<id property="id" column="id"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!-- 配置封装 User 的内容
select:查询用户的唯一标识
column:用户根据id查询的时候,需要的参数值
-->
<association property="user" column="uid" javaType="User" select="cn.ideal.mapper.UserMapper.findById"></association>
</resultMap>
<!-- 根据查询所有账户 -->
<select id="findAll" resultMap="userAccountMap">
SELECT * FROM account
</select>
</mapper>
- select 用来指定延迟加载所需要执行的 SQL 语句,也就是指定 某个SQL映射文件中的某个select标签对的 id,在这里我们指定了用户中通过id查询信息的方法
- column 是指关联的用户信息查询的列,在这里也就是关联的用户的主键即,id
开启延迟加载配置
如果想要开始延迟加载功能,就需要在总配置文件 SqlMapConfig.xml 中配置 setting 属性,也就是将延迟加载 lazyLoadingEnable
的开关设置成 true,由于是按需加载,所以还需要将积极加载修改为消极加载,也就是将 aggressiveLazyLoading
改为 false
当访问user
属性时,才会执行SQL语句,加载相应的属性。
for (Account account : accounts){
System.out.println(account.getUser());
}