Mybatis中的延遲加載,以及原理分析
Mybatis延遲加載原理
Mybatis 僅支持 association 關聯(lián)對象和 collection 關聯(lián)集合對象的延遲加載,association 指的就是一對一,collection 指的就是一對多查詢。
在 Mybatis配置文件中,可以配置是否啟用延遲加載 lazyLoadingEnabled=true|false。
它的原理是:使用 CGLIB 創(chuàng)建目標對象的代理對象,當調用目標方法時,進入攔截器方法,比如調用 a.getB().getName(),攔截器 invoke()方法發(fā)現(xiàn) a.getB()是null 值,那么就會單獨發(fā)送事先保存好的查詢關聯(lián) B 對象的 sql,把 B 查詢上來,然后調用 a.setB(b),于是 a 的對象 b 屬性就有值了,接著完成 a.getB().getName()方法的調用。這就是延遲加載的基本原理。
當然了,不光是 Mybatis,幾乎所有的包括 Hibernate,支持延遲加載的原理都是一樣的。
MyBatis延遲加載(以及可能會碰到的一些問題)
剛好學了延遲加載就來做個記錄
延遲加載(懶加載) 首先需要配置Mybaits-config文件
<!-- 延遲加載設置--> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/>
1.單端關聯(lián)查詢t添加select 需要在RoleDao中添加findRoleById方法,可無參數(shù)
Role findRoleById(int roleId); //RoleDao中添加
<!-- 延遲加載(懶加載)-->
<resultMap id="lazyMap" type="com.demo.entity.User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<association property="role" column="role_id" select="com.demo.dao.RoleDao.findRoleById"> 需要在RoleDao里面添加findRoleById方法
</association>
</resultMap>
<select id="findList" resultMap="lazyMap" >
select id,
username,
password,
role_id 對應association.column
from tb_users
</select>對應的resultMap配置
<resultMap id="roleMap2" type="com.demo.entity.Role">
<id column="id" property="id"/>
<result column="role_name" property="roleName"/>
<result column="role_state" property="roleState"/>
</resultMap>
<select id="findRoleById" resultMap="roleMap2">
select id, role_name, role_state
from tb_role
where id = #{role_id}
</select>測試 正常 輸出關聯(lián)對象會出現(xiàn)多條SQL
List<User> list = mapper.findList();
for (User user : list) {
System.out.println(user.getId() + ", " + user.getUsername() + ", " + user.getPassword() );
System.out.println(user.getRole().getId() + ", "+ user.getRole().getRoleName());
}心得
使用MyBatis3.4.6版本會出現(xiàn) lazy proxy.這是MyBatis版本問題,之后我把他換成3.5.1之后可以正常運行。
如:出現(xiàn)一些其他異常對應的column值寫錯了,要一一對應 初學者設置column和property最好使用復制粘貼的方式以免出現(xiàn)其他錯誤
優(yōu)點:使用延遲加載能夠在不需要關聯(lián)數(shù)據(jù)的時候,僅執(zhí)行一條sql 提高執(zhí)行速度(我的理解,如有不對請多指點)
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringCloud zuul 網(wǎng)關如何解決跨域問題
這篇文章主要介紹了SpringCloud zuul網(wǎng)關解決跨域問題的具體實現(xiàn)方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

