欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

怎么在Mybatis中實(shí)現(xiàn)延遲加載

怎么在Mybatis中實(shí)現(xiàn)延遲加載?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

專(zhuān)注于為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)隴川免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了超過(guò)千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

一、Mybatis中的延遲加載

1、延遲加載背景:Mybatis中Mapper配置文件中的resultMap可以實(shí)現(xiàn)高級(jí)映射(使用association、collection實(shí)現(xiàn)一對(duì)一及一對(duì)多(多對(duì)多)映射),同樣的association、collection具備延遲加載功能。所謂延遲加載,就是先單表查詢,需要時(shí)再?gòu)年P(guān)聯(lián)表去關(guān)聯(lián)查詢(同樣也可能只是是單表查詢),大大單表查詢速度更快,所以可以間接的提高數(shù)據(jù)庫(kù)性能

2、在mybatis核心配置文件中配置,其中l(wèi)azyLoadingEnabled表示懶加載開(kāi)關(guān)、aggressiveLazyLoading表示非懶加載(積極加載),通過(guò)在Mybatis核心配置文件中配置這些屬性的值來(lái)使用Mybatis的懶加載,具體配置方式如下:

 <settings>
  <!--懶加載模式在Mybatis中默認(rèn)是關(guān)閉的-->
  <setting name="lazyLoadingEnabled" value="true"/>
  <!--不同于懶加載的:積極加載方式,所以在懶加載的時(shí)候設(shè)置該屬性為false-->
  <setting name="aggressiveLazyLoading" value="false"></setting>
 </settings>

3、由于是使用懶加載,所以我們顯然可以將Mapper配置文件中的查詢分為兩張單表查詢的statment,其中User表的查詢放在Order查詢配置的resultMap中,并進(jìn)行延遲加載的設(shè)置

<select id="findUserByUid" parameterType="int" resultType="cn.mybatis.po.User">
  SELECT * FROM USER WHERE uid = #{id}
 </select>

 <resultMap id="OrderAndUserByLazyLoading" type="cn.mybatis.po.Order">
  <id column="oid" property="oid"></id>
  <result column="total" property="total"></result>
  <result column="ordertime" property="ordertime"></result>
  <result column="name" property="name"></result>

  <!--
   實(shí)現(xiàn)延遲加載功能
   select:指定延遲加載需要執(zhí)行的statment的id(即根據(jù)用戶id查詢用戶信息的select的statment)
   column:關(guān)聯(lián)查詢的列信息-->
  <association property="user" javaType="cn.mybatis.po.User" select="findUserByUid" column="uid">
  </association>
 </resultMap>
 
 <select id="findOrderAndUserByLazyLoading" resultMap="OrderAndUserByLazyLoading">
  SELECT * FROM orders
 </select>

LazyLoading配置文件信息

怎么在Mybatis中實(shí)現(xiàn)延遲加載

4、在Mapper.java中添加了延遲加載的測(cè)試方法

 //延遲加載測(cè)試方法
 public List<Order> findOrderAndUserByLazyLoading() throws Exception;

5、使用Junit測(cè)試延遲加載的測(cè)試代碼

@Test
 public void testFindOrderAndUserByLazyLoading() throws Exception {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);

  List<Order> orderList= orderMapper.findOrderAndUserByLazyLoading();

  for (Order order : orderList) {
   System.out.println(order.getUser());
  }

  sqlSession.close();
 }

6、測(cè)試結(jié)果,從測(cè)試結(jié)果可以看出,我們首先只是單表查詢了order是表的信息,然后在遍歷查詢到的結(jié)果(打印User信息)的時(shí)候,又發(fā)出查詢user信息的Sql,從而實(shí)現(xiàn)了延遲加載的功能

怎么在Mybatis中實(shí)現(xiàn)延遲加載

二、Mybatis中的一級(jí)緩存

1、一級(jí)緩存是在SqlSession 層面進(jìn)行緩存的。即在同一個(gè)SqlSession 中,多次調(diào)用同一個(gè)Mapper中的同一個(gè)statment并且是同一個(gè)參數(shù)的話,只會(huì)進(jìn)行一次數(shù)據(jù)庫(kù)查詢,然后把數(shù)據(jù)緩存到緩沖中,如果以后要查詢相同的Sql和參數(shù),就直接先從緩存中取出數(shù)據(jù),不會(huì)直接去查數(shù)據(jù)庫(kù)。 但是不同的SqlSession對(duì)象,因?yàn)椴挥玫腟qlSession都是相互隔離的,所以相同的Mapper、參數(shù)和方法,他還是會(huì)再次發(fā)送到SQL到數(shù)據(jù)庫(kù)去執(zhí)行,返回結(jié)果。(本質(zhì)上是在SqlSession作用域下面的HashMap本地緩存,當(dāng) SqlSession 刷新或關(guān)閉之后,該Session中的所有 緩存數(shù)據(jù)就將清空。)可以用下面的這張圖來(lái)表示一級(jí)緩存

怎么在Mybatis中實(shí)現(xiàn)延遲加載

2、我們來(lái)使用一級(jí)緩存進(jìn)行測(cè)試,首先通過(guò)上面一級(jí)緩存的簡(jiǎn)單定義,我們可以得到下面的這張簡(jiǎn)略圖,用以示解一級(jí)緩存。在實(shí)例圖中,第一次查詢某條記錄時(shí)候,Mybatis所做的就是將查詢到的結(jié)果放在該SqlSession的緩存中,如果期間沒(méi)有該數(shù)據(jù)的修改、刪除、或者增加操作,那么之后再讀取該數(shù)據(jù)就會(huì)直接從緩存中得到數(shù)據(jù),而不用再向數(shù)據(jù)庫(kù)發(fā)Sql請(qǐng)求,當(dāng)然,如果第一次查詢之后,對(duì)數(shù)據(jù)進(jìn)行了delete、update、insert操作,那么就會(huì)刪除緩存中的數(shù)據(jù),這樣做的目的也很顯然,保證數(shù)據(jù)的最新性,避免出現(xiàn)臟讀的情況。

怎么在Mybatis中實(shí)現(xiàn)延遲加載

3、一級(jí)緩存的測(cè)試(Mybatis中默認(rèn)開(kāi)啟的是一級(jí)緩存)

做個(gè)簡(jiǎn)單的測(cè)試:按照上面的圖中所示,我們查詢兩次id=1的User信息,并且兩次查詢期間沒(méi)有進(jìn)行會(huì)清空緩存的操作,結(jié)果應(yīng)該是只向數(shù)據(jù)庫(kù)發(fā)送一次Sql查詢

@Test
 public void testUpdateUserInfo() throws Exception {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

  User user1 = userMapper.findUserById(1);
  System.out.println(user1);

  User user2 = userMapper.findUserById(1);
  System.out.println(user2);

  sqlSession.close();
 }

4、我們通過(guò)觀察日志可以看出,只是在第一次查詢的時(shí)候發(fā)送了Sql,第二次是直接打印user信息

怎么在Mybatis中實(shí)現(xiàn)延遲加載

當(dāng)然,接下來(lái)要做的測(cè)試就是在兩次查詢期間做insert操作,然后觀察日志,結(jié)果應(yīng)該是發(fā)現(xiàn)會(huì)想數(shù)據(jù)庫(kù)發(fā)送兩次sql

@Test
 public void testUpdateUserInfo() throws Exception {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

  User user1 = userMapper.findUserById(1);
  System.out.println(user1);

  User user = new User("InsertTest","insert","insert","man");
  userMapper.insertUserInfo(user);
  sqlSession.commit();

  User user2 = userMapper.findUserById(1);
  System.out.println(user2);

  sqlSession.close();
 }

5、我們?cè)跍y(cè)試代碼中加了insert之后,通過(guò)觀察日志可以發(fā)現(xiàn),在查詢過(guò)程中,向Database發(fā)送了兩條select語(yǔ)句,可以驗(yàn)證上面的猜想

怎么在Mybatis中實(shí)現(xiàn)延遲加載

三、Mybatis中的二級(jí)緩存

1、二級(jí)緩存的實(shí)現(xiàn)機(jī)制基本上和一級(jí)緩存機(jī)制相同,不同的作用域不一樣,二級(jí)緩存區(qū)域在一個(gè)個(gè)的mapper中。顯然,由于多個(gè)SqlSession可以操作同一個(gè)mapper,所以二級(jí)緩存比一級(jí)緩存域更大。二級(jí)緩存按照mapper劃分,簡(jiǎn)而言之,也可說(shuō)成按照mapper中的namespace進(jìn)行劃分,這樣看來(lái),每一個(gè)namespace下面都有一個(gè)二級(jí)緩存區(qū)域,而如果兩個(gè)mapper的namespace相同,那么數(shù)據(jù)會(huì)緩存在相同的緩存區(qū)域中。當(dāng)然,類(lèi)似于一級(jí)緩存的特點(diǎn),如果不同的SqlSession進(jìn)行數(shù)據(jù)的insert、delete、update操作的話,也會(huì)清空二級(jí)緩存中的數(shù)據(jù)

2、開(kāi)啟二級(jí)緩存后,進(jìn)行測(cè)試。具體使用二級(jí)緩存在配置文件中的配置為:

首先在Mybatis的核心配置文件中配置二級(jí)緩存(本項(xiàng)目中的SQLMapConfig.xml)

 <!--settings配置二級(jí)緩存 -->
 <settings>
  <setting name="cacheEnabled" value="true"></setting>
 </settings>

然后在需要配置二級(jí)緩存的特定mapper配置文件中進(jìn)行添加二級(jí)緩存的配置

怎么在Mybatis中實(shí)現(xiàn)延遲加載

3、編寫(xiě)測(cè)試程序并運(yùn)行

@Test
 public void testCache() throws Exception {
  SqlSession sqlSession1 = sqlSessionFactory.openSession();
  UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
  User user1 = userMapper1.findUserById(1);
  System.out.println(user1);
  //需要將SqlSession關(guān)閉才能將數(shù)據(jù)寫(xiě)入緩存
  sqlSession1.close();


  SqlSession sqlSession2 = sqlSessionFactory.openSession();
  UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
  User user2 = userMapper2.findUserById(1);
  System.out.println(user2);
  sqlSession2.close();
 }

在運(yùn)行的時(shí)候出現(xiàn)了下面的異常,原因就是沒(méi)有實(shí)現(xiàn)序列化接口,由于緩存數(shù)據(jù)可能再本地內(nèi)存中,也可能在其他存儲(chǔ)介質(zhì)上,所以存在對(duì)象的序列化和反序列化

怎么在Mybatis中實(shí)現(xiàn)延遲加載

所以在實(shí)現(xiàn)序列化接口之后,再次運(yùn)行,得到下面的結(jié)果

怎么在Mybatis中實(shí)現(xiàn)延遲加載

四、Mybatis和ehcache整合

1、首先說(shuō)明ehcache是一個(gè)分布式的緩存框架,而使用Mybatis和ehcache進(jìn)行整合的時(shí)候,首先就需要導(dǎo)入ehcache的jar包和mybatis與ehcache整合的jar包,如下圖所示

怎么在Mybatis中實(shí)現(xiàn)延遲加載

2、下面是mybatis-ehcache整合jar包中的Cache接口實(shí)現(xiàn)類(lèi)

怎么在Mybatis中實(shí)現(xiàn)延遲加載

3、然后我們?cè)贛apper配置文件中配置二級(jí)緩存

 <!--關(guān)于cache標(biāo)簽的一些屬性說(shuō)明:
  type:指定Mybatis中默認(rèn)實(shí)現(xiàn)的cache接口的實(shí)現(xiàn)類(lèi)類(lèi)型,Mybatis中默認(rèn)使用PerpetualCache
  如果和ehcache整合,需要將type配置為ehcache實(shí)現(xiàn)cache的實(shí)現(xiàn)類(lèi)類(lèi)型
 -->
 <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

4、下面是mybatis和ehcache整合之后的測(cè)試結(jié)果

怎么在Mybatis中實(shí)現(xiàn)延遲加載

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

網(wǎng)頁(yè)題目:怎么在Mybatis中實(shí)現(xiàn)延遲加載
標(biāo)題網(wǎng)址:http://chinadenli.net/article22/goegjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)網(wǎng)站導(dǎo)航商城網(wǎng)站網(wǎng)站設(shè)計(jì)App開(kāi)發(fā)電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)