【08】Mybatis笔记–延时加载
文章目录
一、概念:
1)延时加载
- 只有在需要数据的时候才进行查询,不用的时候不查询。(懒加载
- 比如:当只需查询所有商品的分类时,不必把分类对象里面的商品集合全都查出来
2)立即加载
- 就是方法一调用,就会立刻查询出对象内所有数据
3)各种表关系中,一般采用哪种加载?
- 一对多,多对多:通常采用延时加载
- 多对一,一对一:通常采用立即加载
二、Mybatis如何配置延时加载?
- 一对一
- 一对多
1)一对一关系配置:
步骤:
1 先在主配置文件里面开启延时加载
<!--开启延时加载-->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
2 环境准备:
数据表:用户表(User),账户表(Account)。 一个用户可有多个账户
要求:查询所有账户,并且查询出账户所属用户(延时
映射配置文件:AccountDao.xml
在
<association>
标签内配置select
属性,属性值:是指获取用户唯一标识的方法。在
column
属性中配置的是select
配置的方法所需要的参数值。(注,这里要查询账户,账户里面的User对象是延时加载,然后,
select
配置的就是UserDao
中获取User对象的方法。 )
UserDao.java和Account.java
public interface UserDao {
/**
* 查询所有用户,同时获取用户下所有账户信息
* 一对多:延时加载
* @return
*/
List<User> list();
/**
* 查询用户根据id
* @param id
* @return
*/
User get(Integer id);
}
//为显示方便,就放在一起了。实际是单独的文件
public interface AccountDao {
/**
* 查询所有账户
* @return
*/
List<Account> list();
/**
* 根据id获取
* @param id
* @return
*/
Account get(Integer id);
/**
* 根据uid获取账户集
*/
List<Account> findByUid(Integer uid);
}
映射配置文件:
<?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="indi.xu.dao.AccountDao">
<resultMap id="AccountMap" type="Account">
<!--主键字段对应-->
<id property="id" column="id"></id>
<!--非主键字段对应-->
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!--一对一的关系映射,配置封装user的内容-->
<!--就是在副表里面添加主表对象,以获取主表内容
column:指的是与主表关联的外键
javaTyep:指的是主表对应的实体类
property:副表实体类里面主表对象名
配置延时加载
select:获取用户唯一标识的方法。在UserDao中。
column:提供的能获取User的id值 (用户根据id查询时,所需要的参数的值
-->
<association property="user" column="uid" javaType="user" select="indi.xu.dao.UserDao.get">
</association>
</resultMap>
<!--查询所有账户同时包含用户名和地址信息-->
<select id="list" resultMap="AccountMap">
select * from account
</select>
<select id="get" resultType="Account" parameterType="int">
select * from account where uid = #{uid}
</select>
</mapper>
测试类:
( 这里只调用list()
方法的时候,只会执行select * from account
这条SQL语句,在account.getUser()
,就会根据上面配置的column
中的值查询User对象,这就是延时加载)
@org.junit.Test
public void testAccount(){
List<Account> list = accountDao.list();
/*for (Account account : list) {
System.out.println(account.getUser());
}*/
}
2)一对多关系配置:
要求:查询所有用户,及其所拥有的账户(延时
步骤上面类似
在
<collection>
标签里面配置select
属性。是获取Account对象的方法UserDao.xml配置
<?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="indi.xu.dao.UserDao">
<resultMap id="userAccountMap" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
<!--主附表一对多体现-->
<!--配置user对象中accounts集合的映射
ofType:指的是集合元素类型,要写全限定类名。(这里使用了别名
column:使用的是用户的id去查找
-->
<collection property="accounts" ofType="account" select="indi.xu.dao.AccountDao.findByUid" column="id">
</collection>
</resultMap>
<!-- 查询所有-->
<select id="list" resultMap="userAccountMap">
SELECT * from user;
</select>
<!--查询一个-->
<select id="get" parameterType="Integer" resultType="user">
select * from user where id = #{id}
</select>
</mapper>
三、总结:
延时加载就是 在需要数据的时候,使用对方配置文件中的获取唯一对象的<select>
配置