基本概念
- 问题:在一对多中,当我们有一个用户,它有100个用户
- 在查询用户的时候,要不要把关联的账户查出来?
- 在查询账户的时候,要不要把关联的用户查出来
- 什么是延迟加载
- 在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)
- 什么是立即加载
- 不管用不用,只要一调用方法,马上发起查询
- 对应的四种关系表中
- 一对多,多对多:通常情况下我们都是采用延迟加载
- 多对一,一对一:通常情况下我们都是采用立即加载
一对一延迟加载
- 在主配置文件SqlMapConfig.xml中添加设置
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
- 修改Account的resultMap
<?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="dao.AccountDao">
<resultMap id="accountUserMap" type="domain.Account">
<id property="id" column="id"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!--一对一的关系映射,配置封装user的内容-->
<association property="mybatisUser" column="uid" javaType="domain.MybatisUser" select="dao.UserDao.findUserById">
</association>
</resultMap>
<!--查询所有 -->
<select id="findAll" resultMap="accountUserMap">
SELECT * FROM ACCOUNT ;
</select>
</mapper>
- AccountDao.xml中编写查询所有账户的sql语句
<select id="findAll" resultMap="accountUserMap">
SELECT * FROM ACCOUNT ;
</select>
- UserDao.xml中编写查询账户对应用户的sql语句
<select id="findUserById" parameterType="int" resultType="domain.MybatisUser">
SELECT * FROM mybatisuser WHERE id=#{
uid};
</select>
-
执行的sql语句
- 若只查询账户
public void testFindAll(){ List<Account> accounts = accountDao.findAll(); }
- 若需要查询账户及账户所属用户信息
public void testFindAll(){ List<Account> accounts = accountDao.findAll(); for (Account account : accounts){ System.out.println("账户"+account.getId()+"----------------------------"); System.out.println(account); System.out.println(account.getMybatisUser()); } }
一对多延迟加载
- 修改Account的resultMap
<resultMap id="userAccountMap" type="domain.UserAccount">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="birthday" column="birthday"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
<!--一对多的关系映射,配置UserAccount对象中accounts集合的内容-->
<collection property="accounts" ofType="domain.Account" column="id" select="dao.AccountDao.findAccountByUid"></collection>
</resultMap>
- UseDao.xml中编写查询所有用户的sql语句
<select id="findAll" resultMap="userAccountMap">
SELECT * FROM mybatisuser;
</select>
- AccountDao.xml中编写查询用户下的账户的sql语句
<select id="findAccountByUid" parameterType="int" resultType="domain.Account">
select * from account where uid=#{
id};
</select>
- 执行结果
- 只查询所有用户
public void testFindAll(){ List<UserAccount> users = userDao.findAll(); }
- 查询用户,同时获得用户的所有账户信息
public void testFindAll(){
List<UserAccount> users = userDao.findAll();
for (UserAccount user : users){
System.out.println("用户"+user.getId()+"--------------------");
System.out.println(user);
System.out.println(user.getAccounts());
}
}