mybatis中的延遲載入
阿新 • • 發佈:2018-12-04
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來實現,所以,這個東西,不用