日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

mybatis工作原理及流程 mybatis延遲加載原理

1. 目的
本文主要解讀MyBatis 延遲加載實(shí)現(xiàn)原理
2. 延遲加載如何使用
Setting 參數(shù)配置
設(shè)置參數(shù)描述有效值默認(rèn)值lazyLoadingEnabled延遲加載的全局開關(guān) 。當(dāng)開啟時(shí) , 所有關(guān)聯(lián)對象都會(huì)延遲加載 。特定關(guān)聯(lián)關(guān)系中可通過設(shè)置fetchType屬性來覆蓋該項(xiàng)的開關(guān)狀態(tài) 。true、
falsefalseaggressiveLazyLoading當(dāng)開啟時(shí) , 任何方法的調(diào)用都會(huì)加載該對象的所有屬性 。否則 , 每個(gè)屬性會(huì)按需加載(參考lazyLoadTriggerMethods).true、falsefalse (true in ≤3.4.1)lazyLoadTriggerMethods指定哪個(gè)對象的方法觸發(fā)一次延遲加載 。用逗號分隔的方法列表 。equals,clone,hashCode,toString
配置
<configuration> <settings> <!-- 開啟延遲加載 --> <setting name="lazyLoadingEnabled" value="https://www.jinnalai.com/fenxiang/true" /> <setting name="aggressiveLazyLoading" value="https://www.jinnalai.com/fenxiang/false" /> <setting name="lazyLoadTriggerMethods" value="https://www.jinnalai.com/fenxiang/equals,clone,hashCode,toString" /> </settings></configuration>Mapper 配置
<mapper namespace="org.apache.ibatis.submitted.lazy_properties.Mapper"><resultMap type="org.apache.ibatis.submitted.lazy_properties.User" id="user"> <id property="id" column="id" /> <result property="name" column="name" /> </resultMap> <!-- 結(jié)果對象 --> <resultMap type="org.apache.ibatis.submitted.lazy_properties.User" id="userWithLazyProperties" extends="user"> <!-- 延遲加載對象lazy1 --> <association property="lazy1" column="id" select="getLazy1" fetchType="lazy" /> <!-- 延遲加載對象lazy2 --> <association property="lazy2" column="id" select="getLazy2" fetchType="lazy" /> <!-- 延遲加載集合lazy3 --><collection property="lazy3" column="id" select="getLazy3" fetchType="lazy" /> </resultMap> <!-- 執(zhí)行的查詢 --> <select id="getUser" resultMap="userWithLazyProperties"> select * from users where id = #{id} </select></mapper>User 實(shí)體對象
public class User implements Cloneable { private Integer id; private String name; private User lazy1; private User lazy2; private List<User> lazy3; public int setterCounter;省略... }執(zhí)行解析:

  • 調(diào)用getUser查詢數(shù)據(jù) , 從查詢結(jié)果集解析數(shù)據(jù)到User對象 , 當(dāng)數(shù)據(jù)解析到lazy1 , lazy2 , lazy3判斷需要執(zhí)行關(guān)聯(lián)查詢
  • lazyLoadingEnabled=true , 將創(chuàng)建lazy1 , lazy2 , lazy3對應(yīng)的Proxy延遲執(zhí)行對象lazyLoader , 并保存
  • 當(dāng)邏輯觸發(fā)lazyLoadTriggerMethods 對應(yīng)的方法(equals,clone,hashCode,toString)則執(zhí)行延遲加載
  • 如果aggressiveLazyLoading=true , 只要觸發(fā)到對象任何的方法 , 就會(huì)立即加載所有屬性的加載
3. 延遲加載原理實(shí)現(xiàn)
延遲加載主要是通過動(dòng)態(tài)代理的形式實(shí)現(xiàn) , 通過代理攔截到指定方法 , 執(zhí)行數(shù)據(jù)加載 。
MyBatis延遲加載主要使用:Javassist , Cglib實(shí)現(xiàn) , 類圖展示:
mybatis工作原理及流程 mybatis延遲加載原理


4. 延遲加載源碼解析
Setting 配置加載:
public class Configuration {/** aggressiveLazyLoading: * 當(dāng)開啟時(shí) , 任何方法的調(diào)用都會(huì)加載該對象的所有屬性 。否則 , 每個(gè)屬性會(huì)按需加載(參考lazyLoadTriggerMethods). * 默認(rèn)為true * */ protected boolean aggressiveLazyLoading; /** * 延遲加載觸發(fā)方法 */ protected Set<String> lazyLoadTriggerMethods = new HashSet<String>(Arrays.asList(new String[] { "equals", "clone", "hashCode", "toString" })); /** 是否開啟延遲加載 */ protected boolean lazyLoadingEnabled = false;/** * 默認(rèn)使用Javassist代理工廠 * @param proxyFactory */ public void setProxyFactory(ProxyFactory proxyFactory) { if (proxyFactory == null) { proxyFactory = new JavassistProxyFactory(); } this.proxyFactory = proxyFactory; }//省略...}

推薦閱讀