第5章MyBatis高級特性(理論)_第1頁
第5章MyBatis高級特性(理論)_第2頁
第5章MyBatis高級特性(理論)_第3頁
第5章MyBatis高級特性(理論)_第4頁
第5章MyBatis高級特性(理論)_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第5章

MyBatis高級特性本章內(nèi)容Mybatis緩存使用存儲過程注解本章目標(biāo)理解Mybatis緩存原理掌握Mybatis調(diào)用存儲過程了解Mybatis中的注解配置Mybatis的緩存機制緩存技術(shù)是一種“以空間換時間”的設(shè)計理念,是利用內(nèi)存空間資源來提高數(shù)據(jù)檢索速度的有效手段之一。MyBatis包含一個非常強大的查詢緩存特性,可以非常方便地配置和定制。MyBatis默認沒有開啟緩存,除了局部的session緩存。要開啟二級緩存,需要在SQL映射文件中添加<cache/>。緩存作用映射語句文件中的所有select語句將會被緩存。映射語句文件中的所有insert、update和delete語句會刷新緩存。

緩存會使用LeastRecentlyUsed(LRU,最近最少使用的)算法收回。根據(jù)時間表(如noFlushInterval,沒有刷新間隔),緩存不會以任何時間順序來刷新。緩存會存儲列表集合或?qū)ο螅o論查詢方法返回什么)的1024個引用。緩存會被視為read/write(可讀/可寫)的緩存,意味著對象檢索不是共享的,而且可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改Mybatis的緩存機制添加緩存在mybatis-config.xml中配置全局緩存<settings><settingname="cacheEnabled"value="true"/>//默認為false</settings>在SQL映射文件中添加

<cache

eviction="FIFO"

flushInterval="60000"

size="512"

readOnly="true"/>該代碼創(chuàng)建了一個FIFO緩存,并每隔60秒刷新,存放結(jié)果對象或列表的512個引用,且返回的對象被認為是只讀的,因此,在不同線程中的調(diào)用者之間修改它們會導(dǎo)致沖突。屬性名稱描述eviction可用資源的回收策略,主要包括以下幾種:LRU:較少使用的、移除最長時間不被使用的對象。

FIFO(先進先出):按對象進入緩存的順序?qū)⑵湟瞥?/p>

SOFT(軟引用):移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對象。

WEAK(弱引用):積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對象。默認為LRUflushInterval刷新間隔,可以被設(shè)置為任意的正整數(shù),它們代表一個合理的毫秒形式的時間段。默認情況下不設(shè)置,即沒有刷新間隔,緩存僅在調(diào)用語句時刷新size引用數(shù)目,可以被設(shè)置為任意正整數(shù),要牢記緩存的對象數(shù)目和運行環(huán)境的可用內(nèi)存資源數(shù)目。默認值為1024readOnly只讀屬性可以被設(shè)置為true或false。只讀的緩存設(shè)置會給所有調(diào)用者返回緩存對象的相同實例。因此這些對象不能被修改。此處提供了很重要的性能優(yōu)勢??勺x寫的緩存會返回緩存對象的拷貝(通過序列化)。這樣較為緩慢,但比較安全,因此默認為false存儲過程的使用存儲過程的優(yōu)點:(1)存儲過程只在創(chuàng)造時進行編譯,以后每次執(zhí)行存儲過程都無須重新編譯,而一般SQL語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行速度。(2)當(dāng)對數(shù)據(jù)庫進行復(fù)雜操作時(如對多個表進行Update、Insert、Query和Delete時),可將此復(fù)雜操作用存儲過程封裝起來,還可與數(shù)據(jù)庫提供的事務(wù)處理一同使用。(3)存儲過程可以重復(fù)使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量。(4)安全性高,可設(shè)定只有某些用戶才具有對指定存儲過程的使用權(quán)。在Mybatis中使用存儲過程在配置中添加如下語法格式:<selectid="getBlogCountByName"statementType="CALLABLE"parameterType="java.util.HashMap">

//該方法的參數(shù)為map集合 <![CDATA[ {callproc_getBlogCountByAuthor( #{username,//與傳遞到后臺的集合中的key同名 mode=IN,

//注意:mode和jdbcType的值為大寫 jdbcType=VARCHAR }, #{blogCount,//輸出型參數(shù)名稱可以隨意些,但順序要一致 mode=OUT,//表示輸出型參數(shù) jdbcType=INTEGER} )} ]]> </select>在Mybatis中使用存儲過程接口中調(diào)用方法:publicvoidgetBlogCountByName(HashMapmap);調(diào)用的方法:HashMapmap=newHashMap();//聲明一個 map.put("name","襄");//第一個參數(shù),由于第二個參數(shù)是輸出型,所以不設(shè)置 cm.callProc(map);//調(diào)用時傳參

Stringout=map.get("countnum").toString();//countnum為select中配置的名字,而不是存儲過程的輸出參數(shù)屬性名注意調(diào)用輸出型存儲過程的方法不能使用緩存,如果你在mapper中設(shè)置的有全局緩存,可以在<select>節(jié)點中設(shè)置useCache="false"表示此查詢不使用緩存。在Mybatis中使用存儲過程(1)在SQLSERVER中創(chuàng)建如下存儲過程:createprocedureproc_getBlogCountByAuthor(@usernamevarchar(50),@blogCountintoutput)asbegin declare@author_idint; select@author_id=IDfromauthorwhereusername=@username; select@blogCount=COUNT(ID)fromblogwhereauthor_id=@author_id;end;在Mybatis中使用存儲過程(2)在BlogMapper.xml文件中添加如下配置信息: <selectid="getBlogCountByName"statementType="CALLABLE"parameterType="java.util.HashMap"> <![CDATA[ {callproc_getBlogCountByAuthor( #{username, mode=IN, jdbcType=VARCHAR }, #{blogCount, mode=OUT, jdbcType=INTEGER} )} ]]> </select>在Mybatis中使用存儲過程在Mybatis中編寫Java代碼調(diào)用存儲過程,代碼如下: publicstaticvoidmain(String[]args){ SqlSessionsqlSession=MyBatisUtil.getSqlSessionFactory().openSession(); //創(chuàng)建map類型參數(shù) Map<String,Object>params=newHashMap<String,Object>(); params.put("username","張偉杰"); //調(diào)用存儲過程 sqlSession.selectOne("getBlogCountByName",params); intcount=(Integer)params.get("blogCount"); System.out.println(count);}注解配置MyBatis3構(gòu)建在基于全面且強大的Java配置API上。該配置API是基于XML的MyBatis配置的基礎(chǔ),也是新的基于注解配置的基礎(chǔ)。注解提供了一種簡單的方式來實現(xiàn)簡單映射語句,而不會引入大量的開銷。mybatis注解:注解目標(biāo)對應(yīng)的XML標(biāo)簽@CacheNamespace類<cache>@CacheNamespaceRef類<cacheRef>@Results方法<resultMap>@Result方法<result><id>@One方法<association>@Many方法<collection>@Insert@Update@Delete方法<insert><update><delete>注解配置Mybatis中常用的注解注解目標(biāo)對應(yīng)的XML標(biāo)簽@InsertProvider@UpdateProvider@DeleteProvider@SelectProvider方法<insert><update><delete><select>允許創(chuàng)建動態(tài)SQL@Param參數(shù)N/A@Options方法映射語句的屬性在MyBatis中使用注解@CacheNamespace(size=512):定義在該命名空間內(nèi)允許使用內(nèi)置緩存@Options(useCache=true,flushCache=false,timeout=10000):一些查詢的選項開關(guān)@Param("id"):全局限定別名,定義查詢參數(shù)在sql語句中的位置不再是順序下標(biāo)0,1,2,3......的形式,而是對應(yīng)名稱,該名稱在此處定義。

@Results是以@Result為元素的數(shù)組,@Result表示單條屬性——字段的映射關(guān)系,id=true表示該id字段是主鍵,查詢時mybatis會給予必要的優(yōu)化。數(shù)組中所有的@Result組成了單個記錄的映射關(guān)系,而@Results則是單個記錄的集合。另外,還有一個非常重要的注解@ResultMap,其與@Results類似@Select("查詢語句")、@Insert("增加語句")、@Update("更新語句")和@Delete("刪除語句")表示對數(shù)據(jù)進行查詢、添加、更新和刪除的操作。在MyBatis中使用注解//添加作者@Insert("InsertintoAuthor(username,password,email,address,phone)"+"values(#{username},#{password},#{email},#{address},#{phone})")@Options(useGeneratedKeys=true,flushCache=false,timeout=10000)publicvoidaddAuthor(Authorauthor);

//刪除作者@Delete("deletefromauthorwhereid=#{id}")@Options(flushCache=false,timeout=10000)publicvoiddeleteAuthor(@Param("id")intid);

常規(guī)注解使用(不需要自定義map的操作):調(diào)用方法前需要注冊映射器:sessionFactory.getConfiguration().addMapper(TestInteger.class);或者在mapper.xml中配置<mapperclass="映射器接口路徑"></mapper>注冊之后再獲取mapper接口正常調(diào)用

在MyBatis中使用注解//查詢所有作者信息@Select("select*fromauthor")@Options(flushCache=false,timeout=10000,useCache=true)@Results( value={ @Result(id=true,column="id",property="id"), @Result(property="username",column="username"), @Result(property="password",column="password"), @Result(property="email",column="email"), @Result(property="address",column="address"), @Result(property="phone",column="phone") })publicList<Author>findAuthors();

有需要自定義map的情況可以使用Results注解:在MyBatis中使用注解//查詢某作者信息@Select("select*fromauthorwhereid=#{id}")@Options(flushCache=false,timeout=10000,useCache=true)@Results( value={ @Result(id=true,column="id",property="id"), @Result(property="username",column="username"), @Result(property="password",column="password"), @Result(property="email",column="email"), @Result(property="address",column="address"), @Result(property="phone",column="phone") })publicAuthorfindAuthorById(@Param("id")intid);

在MyBatis中使用注解如果多個查詢返回的結(jié)果集結(jié)構(gòu)都一樣,可以使用@ResultMap定義返回結(jié)構(gòu),使用該注解,你將不得不在你的映射文件中配置你的resultMap,而@ResultMap(value="名")即為映射文件中的resultMapID如此一來,你需要在<mapper>中注冊你的配置文件,在接口中使用@ResultMap來引用配置文件中的resultMapID如下:SelfMapper.xml<resultMaptype="java.util.HashMap"http://每行記錄是一個hashmap id="selfMap"> <resultproperty="n"column="city_name"/>...............</resultMap>SelfMapper.java:@Select("selecta.id,,c.statefrom...........") @ResultMap(value="selfMap") publicList<HashMap>sel();//注意,返回的是List集合在MyBatis中使用注解使用注解時,如何動態(tài)構(gòu)建SQL語句?在MyBatis中使用注解使用注解構(gòu)造動態(tài)SQL需要借助一個繼承了SqlBuilder自定義類,在類中自定義方法,但要求方法返回String類型,返回的是構(gòu)造之后的完整SQL語句:例如:publicclassAuthorSqlBuilderextendsSqlBuilder{ //返回修改的sql語句 publicStringupdateAuthorSql(){

BEGIN();

UPDATE("author");

SET("username=#{username}");//#{}中的還是參數(shù)的key或則屬性

SET("password=#{password}");

SET("email=#{email}");

SET("address=#{address}");

SET("phone=#{phone}");

WHERE("id=#{id}"); returnSQL(); }}定義之后在接口方法上用UpdateProvider注解引用:@UpdateProvider(type=AuthorSqlBuilder.class,method="updateAuthorSql")其實在自定類中無非是定義一個字符串傳遞到后臺執(zhí)行,那么如果對update(),set()這些內(nèi)置的方法不熟悉,完全可以自定義SQL語句,例如Stringsql="update........";returnsql測試注解使用//獲取SqlSession工廠SqlSessi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論