1。読み込み遅延
ResultMapは、高度なマッピングを実装できます(アソシエーションとコレクションを使用して、1対1のマッピングを実装します)。協会とコレクションには、怠zyなロード機能があります。
遅延読み込み:単一のテーブルからの最初のクエリ、そして必要に応じて関連テーブルからのクエリを関連付け、データベースのパフォーマンスを大幅に改善します。単一のテーブルのクエリは複数のテーブルをクエリするよりも速いためです。
MyBatisコア構成ファイルで構成します:
LazyLoadingEnabled、AggressivelazyLoading
設定 | 説明する | 許可された値 | デフォルト値 |
lazyloadingEnabled | グローバル設定怠zyなロード。 「false」に設定すると、関連するすべてのものが初期化され、ロードされます。 | true |間違い | 間違い |
AggressivelazyLoading | 「真」に設定すると、怠zyなロードオブジェクトはすべての怠zyなプロパティによってロードされる場合があります。それ以外の場合、各プロパティは必要に応じてロードされます。 | true |間違い | 真実 |
<settings> <setting name = "lazyloadingEnabled" value = "true"/> <setting name = "aggressivelazyloading" value = "false"/> </settings>
機会:
一部のレコードのみが関連する他の情報をクエリする必要がある場合、必要に応じてロードを遅らせることができます。関連するクエリが必要な場合、データベースのパフォーマンスを改善するためにSQLがデータベースに発行されます。
関連するすべてのクエリ情報が必要な場合は、現時点で読み込みを遅らせる必要はありません。関連するすべてのクエリ情報を返してください。 resultTypeまたはresultMapを使用してマッピングを完了できます。
2つ:ケース:(部門と従業員の1対多)
ソースコードの紹介:
1.Dept.java
パッケージcn.zhang.entity; import java.util.hashset; import java.util.set; public class dept {private integer deptno;プライベート文字列deptname; private set <Emp> emp = new Hashset <Emp>(); @Override public String toString(){return "deptno =" + deptno + "、deptname =" + deptname + "、emp =" + emp + "]"; } public Integer getDeptno(){return deptno; } public void setdeptno(integer deptno){this.deptno = deptno; } public string getDeptName(){return deptname; } public void setDeptName(string deptname){this.deptname = deptname; } public set <Emp> getemp(){return emp; } public void setemp(set <emp> emp){this.emp = emp; }}2.Emp.java
パッケージcn.zhang.entity; public class emp {private integer empno;プライベート文字列empname; @Override public String toString(){return "emp [empno =" + empno + "、empname =" + empname + "]"; } public integer getempno(){return empno; } public void setempno(integer empno){this.empno = empno; } public string getempname(){return empname; } public void setempname(string empname){this.empname = empname; }}3.mybatisutil.java
パッケージcn.zhang.util; Import java.io.ioexception; Import java.io.reader; Import org.apache.ibatis.io.io.resources; Import org.apache.ibatis.session.squlsessess; Import org.apache.ibatis.session.session.ssessionfactory; import inmolg.apach.ibatis. org.apache.ibatis.session.sqlsessionfactorybuilder;/*** tool class**/public class mybatisutil {private static string config = "mybatis-config.xml";静的リーダーリーダー。 static {try {reader = resources.getResourceasReader(config); } catch(ioexception e){e.printstacktrace(); }} private static sqlsessionfactory Factory = new sqlsessionfactorybuilder().build(reader); //セッションを取得できるメソッドを提供しますpublic static sqlsession getsession()throws ioException {sqlsession session = factory.opensession();返信セッション。 }}4.Deptdao.java
パッケージcn.zhang.dao;インポートjava.io.ioexception;インポートcn.zhang.entity.dept; public interface deptdao { / ** *指定されたレコード * @return * @throws ioexception * / public dept findbyid(integer id)throws ioexception;};}5.Deptdao.xml
<?xml version = "1.0" encoding = "UTF-8"?> < namespace = "cn.zhang.dao.dao.deptdao"> <! - 3。従業員IDに基づく従業員情報のクエリ - > <select id = "selectempbydeptno" resulttype = "emp"> select empno、empname from empno、deptno =#{deptno} < id = "deptmapper"> <id property = "deptno" column = "deptno" /> <resputプロパティ= "deptname" column = "deptname" /> <! - 1対Many部門関連の従業員 - > <! - 選択:関連する従業員のクエリ - > <! - 列:列条件select = "selectempbydeptno" column = "deptno" /> < /resultmap> <! - 1。部門IDに基づくクエリ部門情報 - > <id = "findbyid" resultmaptmapper "> select deptno、deptno =#{deptno} </select> </mapper>6.mybatis-config.xml(怠zyなロードの構成はこちらです)
<?xml version = "1.0" encoding = "utf-8"?> <!doctype configurationpublic " - // mybatis.org//dtd config 3.0 // en" "http://mybatis.org/dtd/mybatis-3-config.dtd" falseの場合:関連するすべてが初期化され、ロードされます。 AggressivelazyLoading:デフォルトはTRUEです。 Trueに設定すると、怠zyなオブジェクトは怠zyな属性によってロードされる場合があります。それ以外の場合、各属性は必要に応じてロードされます。 - > <settings> <! - 遅延ロードスイッチをオンにします - > <name = "lazyloadingEnabled" value = "true" /> <! - 必要に応じてロードするメッセージロードにアクティブロードを変更します - > <設定= "aggressivelazyloading" value = "false" /> < /settings> <! - configuration airas->現在指定されているパッケージの下の単純なクラス名をエイリアス - > <パッケージ名= "cn.zhang.entity" /> < /typealiase> <環境= "oracle"> <環境id = "oracle"> <! - jdbcを使用したトランザクション - > <トランザクションマネージャータイプ= "jdbc" /> <データベースIを使用 - > <プロパティ名= "Driver" value = "oracle.jdbc.driver.oracledriver" /> <プロパティname = "url" value = "jdbc:oracle:@localhost:1521:orcl" /> <プロパティname = "username" value = "Study" /> </環境> <マッパーズ> <マッパーリソース= "cn/zhang/dao/deptdao.xml"/> </mappers> </configuration>
7.mytest.java(テストクラス)
パッケージcn.zhang.test; // 1-Manyインポートjava.io.ioexception; Import org.apache.ibatis.session.squlsession; Import org.junit.before; import org.junit.test; import cn.zhang.dao.deptdao; cn.zhang.entity.dept; cn.zhang.util.mybatisutil; public class mytest {deptdao dao; @before public void initdata()throws ioexception {sqlsession session = mybatisutil.getSession(); dao = session.getMapper(deptdao.class); } / ***指定されたレコードをクエリ* @throws ioexception* / @test public void findall()throws ioexception {dept dept = dao.findbyid(1); System.out.println(dept); }}テスト結果:
下のブレークポイント
状況1:mybatis-config.xmlの構成なし
状況2:mybatis-config.xmlで設定します
<settings> <! - 遅延ロードスイッチをオンにします - > <name = "lazyloadingEnabled" value = "true" /> <! - 必要に応じてロードするメッセージロードにアクティブロードを変更します - > <name = "agrissivelazyloazing" value = "false" /> < /settings>
次のステップ:
F6次のステップ:
F6次のステップ:従業員の名前を入力します
状況3:
F6次のステップ:
F6次:従業員の名前を印刷します
上記は、編集者が紹介したMybatisの遅延ロードです。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!