基本概念
- 問題:1対多では、1人のユーザーがいる場合、100人のユーザーがいます
- ユーザーにクエリを実行するときに、関連付けられているアカウントを確認しますか?
- アカウントについて問い合わせるときに、関連するユーザーを確認しますか?
- 遅延読み込みとは
- クエリは、データが実際に使用されているときに開始され、使用されていないときは開始されません。オンデマンド読み込み(遅延読み込み)
- 即時読み込みとは
- 使用されているかどうかに関係なく、メソッドが呼び出されている限り、クエリはすぐに開始されます
- 4つのリレーショナルテーブルに対応
- 1対多、多対多:通常は遅延読み込みを使用します
- 多対1、1対1:通常は即時読み込みを使用します
1対1の遅延読み込み
- メイン構成ファイルSqlMapConfig.xmlに設定を追加します
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
- アカウントの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()); } }
1対多の遅延読み込み
- アカウントの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());
}
}