- 以前の研究では、我々は、オールインワンのconfigureをMyBatisのをマスターしているし、多くの、多くの関係を実装するには、オブジェクトを達成することができます
クエリに関連付けられています。実際の開発プロセスは、多くの時間は、私たちは常に、それが自分のアカウント情報をロードしなければならないときに、ユーザー情報をロードする必要はありません。この時点で、私たちは、遅延ロードを呼び出します。
- 遅延ロードとは何ですか?
- レイジーローディング:
、データをロードするには、データがデータを必要としないロードしない使用する必要があります。知られるレイジーローディング、遅延ロード。 - 利点:単一テーブルが速くよりも、関連するクエリを複数のテーブルを照会するために、単一テーブルのクエリで始まり、その後、必要なときアソシエーションテーブルから関連クエリに行き、大幅にデータベースのパフォーマンスを向上させること。
- 短所:
必要なときにだけデータが使用されるため、問合せ作業には時間がかかりする必要がありますので、ときにデータのクエリ大量の、それは貧弱なユーザーエクスペリエンスが得られ、利用者がより長い時間を待つことを原因にすることを、データベースクエリを実行します。
- 実装要件
- 需要:
クエリに関連付けられたクエリアカウント(口座)情報利用者(ユーザー)の情報。我々は、ユーザ(利用者)の情報を照会する必要がある場合、要件を満たした後、利用者(ユーザー)の情報を照会する最初のチェックアカウント(アカウント)の情報があれば。オンデマンドでのクエリ情報への利用者(ユーザー)は、遅延ロードです。
私たちは、一から一を達成するために多くのものをこのresultMapを使用し、多くの関係が作動します。主に、協会を通じて収集し、1対多のマッピングを実現。協会、遅延ロード機能付きのコレクション。
使用assocationは、遅延ロードを実装します
- 要件:
同時にクエリのユーザーアカウント情報のクエリ情報。 - DAOアカウントの永続化層インタフェース
public interface IAccountDao {
/**
* 查询所有账户,同时获取账户的所属用户名称以及它的地址信息
* @return
*/
List<Account> findAll();
}
- アカウントの永続化レイヤマッピングファイル
<?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="com.itheima.dao.IAccountDao">
<!-- 建立对应关系 -->
<resultMap type="account" id="accountMap">
<id column="aid" property="id"/>
<result column="uid" property="uid"/>
<result column="money" property="money"/>
<!-- 它是用于指定从表方的引用实体属性的 -->
<association property="user" javaType="user"
select="com.itheima.dao.IUserDao.findById" column="uid">
</association>
</resultMap>
<select id="findAll" resultMap="accountMap">
select * from account
</select>
</mapper>
select: 填写我们要调用的 select 映射的 id
column : 填写我们要传递给 select 映射的参数
- ユーザー・インターフェースと永続化レイヤマッピングファイル
public interface IUserDao {
/**
* 根据 id 查询
* @param userId
* @return
*/
User findById(Integer userId);
}
<?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="com.itheima.dao.IUserDao">
<!-- 根据 id 查询 -->
<select id="findById" resultType="user" parameterType="int" >
select * from user where id = #{uid}
</select>
</mapper>
- ターンオン遅延ローディング戦略MyBatisの
我们需要在 Mybatis 的配置文件 SqlMapConfig.xml 文件中添加延迟加载的配置。
<!-- 开启延迟加载的支持 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
- 書き込みテストは、ユーザ情報のみをチェックしていないアカウント情報を確認してください。
public class AccountTest {
private InputStream in ;
private SqlSessionFactory factory;
private SqlSession session;
private IAccountDao accountDao;
@Test
public void testFindAll() {
//6.执行操作
List<Account> accounts = accountDao.findAll();
}
@Before
//在测试方法执行之前执行
public void init()throws Exception {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.创建 SqlSession 工厂对象
factory = builder.build(in);
//4.创建 SqlSession 对象
session = factory.openSession();
//5.创建 Dao 的代理对象
accountDao = session.getMapper(IAccountDao.class);
}
@After
//在测试方法执行完成之后执行
public void destroy() throws Exception{
//7.释放资源
session.close();
in.close();
}
}
- 次のようにテスト結果は以下のとおりです。
これがそう何の問題は、アカウントのお問い合わせに関連付けられているユーザーオブジェクトのSQL文がクエリではありません、コレクションにのみアカウントListオブジェクトクエリ出ている、とUserオブジェクトに関連していないので、我々は、それを発見しました。
使用コレクションは、遅延ロードを実装します
<コレクション>ノード同様に、我々はまた、多くの関係のconfigure遅延ロード戦略に構成することができます。
<コレクション>ノードはselect属性、列の属性を持っています。
需要:
ユーザーはユーザーが所有するオブジェクト、チェックのアカウント情報を完成ロードを持っている場合。
- 一覧<アカウント> Userエンティティの属性クラスを追加します。
private List<Account> accounts;
public List<Account> getAccounts() {
return accounts;
}
public void setAccounts(List<Account> accounts) {
this.accounts = accounts;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ",
birthday=" + birthday + ", sex=" + sex + ", address="
+ address + "]";
}
}
- ユーザーアカウントと持続的な層インタフェースを書きます
/**
* 查询所有用户,同时获取出每个用户下的所有账户信息
* @return
*/
List<User> findAll();
/**
* 根据用户 id 查询账户信息
* @param uid
* @return
*/
List<Account> findByUid(Integer uid);
- ユーザーの永続化マッピング設定を書きます
<resultMap type="user" id="userMap">
<id column="id" property="id"></id>
<result column="username" property="username"/>
<result column="address" property="address"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<!-- collection 是用于建立一对多中集合属性的对应关系
ofType 用于指定集合元素的数据类型
select 是用于指定查询账户的唯一标识(账户的 dao 全限定类名加上方法名称)
column 是用于指定使用哪个字段的值作为条件查询
-->
<collection property="accounts" ofType="account"
select="com.itheima.dao.IAccountDao.findByUid" column="id">
</collection>
</resultMap>
<!-- 配置查询所有操作 -->
<select id="findAll" resultMap="userMap">
select * from user
</select>
<collection>标签:
主要用于加载关联的集合对象
select 属性:
用于指定查询 account 列表的 sql 语句,所以填写的是该 sql 映射的 id
column 属性:
用于指定 select 属性的 sql 语句的参数来源,上面的参数来自于 user 的 id 列,
所以就写成 id 这一个字段名了
- 書かれたアカウントの永続化マッピングの設定
<!-- 根据用户 id 查询账户信息 -->
<select id="findByUid" resultType="account" parameterType="int">
select * from account where uid = #{uid}
</select>
- テストのみ負荷ユーザー情報
public class UserTest {
private InputStream in ;
private SqlSessionFactory factory;
private SqlSession session;
private IUserDao userDao;
@Test
public void testFindAll() {
//6.执行操作
List<User> users = userDao.findAll();
}
@Before
//在测试方法执行之前执行
public void init() throws Exception {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.创建 SqlSession 工厂对象
factory = builder.build(in);
//4.创建 SqlSession 对象
session = factory.openSession();
//5.创建 Dao 的代理对象
userDao = session.getMapper(IUserDao.class);
}
@After
//在测试方法执行完成之后执行
public void destroy() throws Exception{
session.commit();
//7.释放资源
session.close();
in.close();
}
}
次のようにテスト結果は以下のとおりです。
私たちは、無負荷時のアカウントのアカウント情報を見つかりませんでした。