1. 程式人生 > >mybatis中的延遲載入

mybatis中的延遲載入

Mybatis中的延遲載入

  • 概念:
在查詢資料時,並不立即發起查詢,只有在真正的要使用到資料的時候,才查詢. 不用的時候不查詢。按需載入(懶載入)適用與多表查詢時.
  • 優點:
節省記憶體,提高程式執行效率.
mybatis的延遲載入可以提高開發效率(程式碼寫的少了)
  • 缺點:
因為只有當需要用到資料時,才會進行資料庫查詢,這樣在大批量資料查詢時,因為查詢工作也要消耗時間,所以可能造成使用者等待時間變長,造成使用者體驗下降。
  • 配置:
	//在SqlMapConfig.xml配置檔案中開啟延遲載入.
	<settings>
		<setting name="lazyLoadingEnabled" value="true"/>
		<setting name="aggressiveLazyLoading" value="false"/>
	</settings>

實體類程式碼

public User{
    private Integer id;
    private String username;
    private String address;
    private String sex;
    private Date birthday;
    private List<Account> accounts;
    
    set...get...
}

public Account{
    private Integer id;
    private Integer uid;
    private Double money;
    private User user;  
   
   set...get... 
}

Mybatis中的延遲載入-(1對1,多對1)

  • 1.sql語句
AccountDao.xml

	<select id="findAll" resultMap="accountUserMap">
		select * from account
	</select>
	
UserDao.xml
    <select id="findById" resultMap="user" parameterType="int">
		select * from user where id = #{id}
	</select>
  • 2.AccountDao.xml中的resultMap標籤
<resultMap id="accountUserMap" type="account">
	<id property="id" column="id"></id>
	<result property="uid" column="uid"></result>
	<result property="money" column="money"></result>
	<association property="user" column="uid" javaType="user" select="com.huyang.dao.UserDao.findById"></association>
</resultMap>
/**
 *	注意:
 *		1. result標籤和id標籤,仍然封裝"主表"屬性
 *		2. association標籤仍然指定"從表"的相關資訊.
 *				property="user"	:表示把"從表"資料封裝到"主表"的user屬性中.
 *				select="com.huyang.dao.UserDao.findById"	:表示延遲載入通過UserDao的findById方法獲取"從表"資料
 *				column="uid"	:表示呼叫findById方法時,把"主表"uid屬性作為引數,傳遞給該方法
 *				javaType="user" :表示呼叫findById方法得到的結果封裝為User型別
 *		3. 有了延遲載入後,
 *				不需要自己配置"從表"的對映資訊
 *				不需要多表操作語句. 也就是說,即使是多表操作,sql也按照單標操作的語句來寫就可以.
 *		
 */

Mybatis中的延遲載入-(1對多,多對多)

  • 1.sql語句
UserDao.xml:

	<select id="findAll" resultMap="userAccountMap">
		select * from user
	</select>
	
AccountDao.xml:
    <select id="findAccountByUid" resultMap="account" parameterType="int">
		select * from account where uid = #{uid}
	</select>
  • 2.UserDao.xml中resultMap標籤
	<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>
		<collection property="accounts" ofType="account" select="com.huyang.dao.AccountDao.findAccountByUid" column="id"></collection>
	</resultMap>
	/**
	 *	注意:
	 *		1. result標籤和id標籤,仍然封裝"主表"屬性
	 *		2. association標籤仍然指定"從表"的相關資訊.
	 *				property="accounts"	:表示把"從表"資料封裝到"主表"的accounts屬性中.
	 *				select="com.huyang.dao.AccountDao.findAccountByUid"	:表示延遲載入"從表"資料時,呼叫的方法
	 *				column="id"	:表示呼叫findAccountByUid方法時,把"主表"id屬性作為引數,傳遞給該方法
	 *				ofType="account" :表示呼叫findAccountByUid方法得到的結果封裝為List集合時,集合中的資料的資料型別為account
	 *		3. 有了延遲載入後,
	 *				不需要自己配置"從表"的對映資訊
	 *				不需要多表操作語句. 也就是說,即使是多表操作,sql也按照單標操作的語句來寫就可以.
	 *		
	 */

Mybatis的快取

  • 快取
什麼是快取:

    存在於記憶體中的臨時資料
    
為什麼使用快取:

    減少和資料庫的互動次數,提高執行效率
    
什麼樣的資料能使用快取,什麼樣的資料不能使用快取:

    適用於快取:
        經常查詢並且不經常改變的
        資料的正確與否對最終結果影響不大的
        
    不使用與快取:
        經常改變的資料
        資料的正確與否對最終結果影響大的
        例如:商品的庫存,銀行的匯率,股市的牌價
  • mybatis中的快取
一級快取:

	預設支援,他是SqlSession級別的快取. 只要SqlSession不銷燬,則快取就一直有效.
	如果,在SqlSession呼叫增刪改和commit(),close()等方法的時候,快取會被自動清空.
	
二級快取(不常用):

	使用步驟:
		第1步:讓Mybatis框架支援二級快取(在SqlMapConfig.xml中配置)
			<settings>
				<setting name="cacheEnabled" value="true"/>
			</settings>
		第2步:讓當前的對映檔案支援二級快取(在IUserDao.xml中配置)
			//<!--開啟user支援二級快取,每個類要單獨開啟 -->
			<cache/>
		第3步:讓當前的操作支援二級快取(在select標籤中配置)
			//useCache="true",讓當前方法,支援二級快取,每個方法要單獨設定	
			<select id="findById" parameterType="INT" resultType="user" useCache="true">
				select * from user where id = #{uid}
			</select>
結論:
	Mybatis的二級快取,用起來非常麻煩,而且已經有一級快取,並且,這種快取,其實還有redis來實現,所以,這個東西,不用