課件手冊(cè)mybatis3.21中文_第1頁
課件手冊(cè)mybatis3.21中文_第2頁
課件手冊(cè)mybatis3.21中文_第3頁
課件手冊(cè)mybatis3.21中文_第4頁
課件手冊(cè)mybatis3.21中文_第5頁
已閱讀5頁,還剩95頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

最近更新232013|版本3.2.1-XML映射配置文件MapperXML文件動(dòng)態(tài)SQLJavaStatementBuilders 項(xiàng)目文項(xiàng)目報(bào) 什么是yatis是支持普通L查詢,過程和高級(jí)映射的優(yōu)秀持久層框架。yatis消除了幾乎所有的JDC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。yatis使用簡單的XL或注解用于配置和原始映射,將接口和Java的Js(nldJaabjecs,普通的Java對(duì)象)映射成數(shù)據(jù)庫中的記錄。Helpmakethisation如果你發(fā)現(xiàn)了本文檔的遺漏之處,或者丟失yatis特性的說明時(shí),那么最好的方法就是了解一下這個(gè)遺漏之處然后把它記錄下來。Sourcesofthismanualareavailableinxdocformatatproject's.Checkthemout,updatethemandsendyourpatchtothetracker.你也是本文檔的最佳作者,其他用戶也會(huì)來閱讀它的關(guān)于翻MyBatis3的用戶指南翻譯由南磊完成,若對(duì)翻譯質(zhì)量有任何意見和建議,請(qǐng)聯(lián)系na Copyright?2010-2013MyB.AllRights最近更新232013|版本3.2.1-XML映射配置文件 MapperXML文件 動(dòng)態(tài)SQLJavaStatementBuilders 項(xiàng)目文 項(xiàng)目報(bào) 每一個(gè)MyBatis的應(yīng)用程序都以一個(gè)SqlSessionFactory對(duì)象的實(shí)例為核心。SqlSessionFactoryXML映射配置文件 MapperXML文件 動(dòng)態(tài)SQLJavaStatementBuilders 項(xiàng)目文 項(xiàng)目報(bào) 從XML從XML文件中構(gòu)建SqlSessonFactory的實(shí)例非常簡單。這里建議你使用類路徑下的資源文件來配置,但是你可以使用任意的Reader實(shí)例,這個(gè)實(shí)例包括由文字形式的文件路徑或URL形式的文件路徑fie://來創(chuàng)建。MyBatis包含了一些工具類,稱作為資源,這些工具類包含一些方法,這些方法使得從類路徑或其他位置加載資源文件更加簡單。XML配置文件包含對(duì)MyBatis系統(tǒng)的設(shè)置,包含獲取數(shù)據(jù)庫連接實(shí)例的數(shù)據(jù)源和決定事務(wù)范圍和控制的事務(wù)管理器。關(guān)于XML配置文件的詳細(xì)內(nèi)容可以在文檔后面找到,這里給出一個(gè)簡單的示例:""當(dāng)然,XL配置文件中還有很多可以配置的,在上面的示例的則是最關(guān)鍵的部分。要注意L頭部的聲明,需要用來驗(yàn)證XL文檔正確性。environent元素體中包含對(duì)事務(wù)管理和連接池的環(huán)境配置。appers元素是包含所有apper映射器)(的列表,這些apper的XL文件包含SL代碼和映射定義信息。不使用XML構(gòu)建如果你喜歡從Java程序而不是L文件中直接創(chuàng)建配置實(shí)例,或創(chuàng)建你自己的配置構(gòu)建器,yatis也提供完整的配置類,提供所有從L文件中加載配置信息的選項(xiàng)。注意這種情況下配置是添加映射類。映射類是Java類,這些類包含SL映射語句的注解從而避免了L文件的依賴,L映射仍然在大多數(shù)高級(jí)映射(比如:嵌套Join映射)時(shí)需要。出于這樣的原因,如果存在L配置文件的話,yatis將會(huì)自動(dòng)查找和加載一個(gè)對(duì)等的L文件(這種情況下,基于類路徑下的logapper.clss類的類名,那么logapper.xl將會(huì)被加載)。后面我們會(huì)了解。SqlSessionFactory中獲取現(xiàn)在,我們已經(jīng)知道如何獲取SqlSessionFactory對(duì)象了,基于同樣的啟示,我們就可以獲得SqlSession了。Slession對(duì)象完全包含以數(shù)據(jù)庫為背景的所有執(zhí)行SL操作的方法。你可以用Slession實(shí)例來直接執(zhí)行已映射的SL語句。例如:這種方法起到的作用,和我們使用之前的yatis版本是相似的,現(xiàn)在有一種更簡潔的方法。使用合理描述參數(shù)和L語句返回值的接口(比如loapper.clas)這樣現(xiàn)在就可以至此那個(gè)更簡單,更安全的代碼,沒有容易發(fā)生的字符串文字和轉(zhuǎn)換的錯(cuò)誤。例如現(xiàn)在我們來探究一下這里到底探究已映射SQL語這里你也許想知道通過SqlSession和Mapper對(duì)象到底執(zhí)行了什么操作。已映射的SQL語句是一個(gè)很大的主題,而且這個(gè)會(huì)貫穿本文檔的大部分內(nèi)容。為了給出一個(gè)宏觀的概念,這里有一些示例。上面提到的任何一個(gè)示例,語句是通過XML或注解定義的。我們先來看看XML。使用基于XML的映射語言,在過去的幾年中使得MyBatis非常流行,他為MyBatis提供所有的特性設(shè)置。如果你以前用過MyBatis,這個(gè)概念應(yīng)該很熟悉了,但是XML映射文件也有很多的改進(jìn),后面我們會(huì)詳細(xì)來說。這里給出一個(gè)基于XML映射語句的示例,這些語句應(yīng)該可以滿足上述示例中SqlSession對(duì)象的調(diào)用。""這個(gè)簡單的例子中看起來有很多額外的東西,但是也相當(dāng)簡潔了。你可以在一個(gè)單獨(dú)的L映射文件中定義很多的映射語句,除L頭部和文檔類型之外,你可以得到很多方便之處。在文件的剩余部分是很好的自我解釋。在命名空間“co.ybatis.xaple.loaper”中,它定義了一個(gè)名為“selectlo”的映射語句,這樣它允許你使用完全限定名“or.ybatis.xaple.loaper.seectlo”來調(diào)用映射語句,我們下面示例中所有的寫法也是這樣的。要注意這個(gè)使用完全限定名調(diào)用Java對(duì)象的方法是相似的,這樣做是有原因的。這個(gè)命名可以直接給相同命名空間下的的映射類,使用一個(gè)名稱,地調(diào)用映射器接口中的方法,這和你前面看到的是一樣的,下面這個(gè)示例中它又出現(xiàn)了。第二種方式有很多有點(diǎn),首先它不是基于文字的,那就更安全了。第二,如果你的IDE有代碼補(bǔ)全功能,那么你可以利用它來已映射的SL語句。第三,不需要強(qiáng)制類型轉(zhuǎn)換,同時(shí)logapper接口可以保持簡潔,返回值類型很安全(參數(shù)類型也很安全)。命名空間的一點(diǎn)注命名空間之前版本的yatis中是可選項(xiàng),非常也沒有幫助?,F(xiàn)在,命名空間是必須的,而且有一個(gè)目的,它使用更長的完全限定名來語句。命名空間使得接口綁定成為可能,就像你看到的那樣,,那么現(xiàn)在你就會(huì)使用它們了,你應(yīng)該按照下面給出示例的來練習(xí),以免改變自己的想法。使用命名空間,aa包空間之下,變得簡潔,在很長的時(shí)間內(nèi)提高yatis的作用。命名解析:為了減少輸入,yts對(duì)所有名配置元素使用下名解析規(guī)則,包括語句,結(jié)果映,緩存直接查找完全限定名(比如“co.ypackae.yapper.eletllhins”,如果)發(fā)現(xiàn)就使用。短名(“seectAlThns” )可以用來任意含糊的對(duì)象。而如果有兩個(gè)或兩個(gè)以上的(比如“co.foo.electllhins和“co.br.seectllhins”,那么就會(huì)得到錯(cuò)誤報(bào)告,說短名稱是含糊的,因此就必須使用完全限定名。如loapper這樣的映射器類來說,還有一個(gè)妙招。它們中間映射的語句可以不需要在L中來寫,而可以使用Java注解來替換。比如,上面的XL示例可以如下來替換:對(duì)于簡單語句來說,使用注解代碼會(huì)更加清晰,然而Java注解對(duì)于復(fù)雜語句來說就會(huì),應(yīng)該限制使用。因此,如果你不得不做復(fù)雜的事情,那么最好使用L來映射語句。當(dāng)然這也取決于你和你的項(xiàng)目團(tuán)隊(duì)的決定,,也就是說,不要將自己局限在式中。你可以輕松地將注解換成XL映射語句,反之亦然。范圍和生命周理解我們目前已經(jīng)討論過的不同范圍和生命周期類是很重要的。不正確的使用它們會(huì)導(dǎo)致嚴(yán)重的并這個(gè)類可以被實(shí)例化,使用和丟棄。一旦你創(chuàng)建了Slessionactory后,這個(gè)類就不需要存在了。因此lessionactoyuildr實(shí)例的最佳范圍是方法范圍(也就是本地方法變量)。你可以重用lessionactoyuildr來創(chuàng)建多個(gè)lessionactry實(shí)例,但是最好的方式是不需要保持它一直存在來保證所有XL解析資源,因?yàn)檫€有更重要的事情要做。一旦被創(chuàng)建,lessionactry應(yīng)該在你的應(yīng)用執(zhí)行期間都存在。沒有理由來處理或重新創(chuàng)建它。使用SqlessonFactory的最佳實(shí)踐是在應(yīng)用運(yùn)行期間不要重復(fù)創(chuàng)建多次。這樣的操作將被視為是非常糟糕的。因此lessionactoy的最佳范圍是應(yīng)用范圍。有很多方法可以做到,最簡單的就是使用單例模式或者靜態(tài)單例模每個(gè)線程都應(yīng)該有它自己的Slession實(shí)例。lession的實(shí)例不能被共享,也是線程不安全的。因此最佳的范圍是請(qǐng)求或方法范圍。絕對(duì)不能將lson實(shí)例的放一個(gè)類的靜態(tài)字段甚至是實(shí)例字段中。也絕不能將Slession實(shí)例的放在任何類型的管理范圍中,比如erlvet架構(gòu)中的ttpession。如果你現(xiàn)在正用任意的Web框架,要考慮lession放在一個(gè)和TTP請(qǐng)求對(duì)象相似的范圍內(nèi)。換句話說,基于收到的HTP請(qǐng)求,你可以打開了一個(gè)lession,然后返回響應(yīng),就可以關(guān)閉它了。關(guān)閉ession很重要,你應(yīng)該確保使用finally塊來關(guān)閉它。下面的示例就是一個(gè)確保Slession關(guān)閉的基本模式:在你的代碼中一貫地使用這種模式,(閉,這會(huì)給yatis造成一種跡象表明你要自己管理連接資源)。Mapper映射器是你創(chuàng)建綁定映射語句的接口。映射器接口的實(shí)例可以從lsin中獲得。那么從技術(shù)上來說,當(dāng)被請(qǐng)求時(shí),任意映射器實(shí)例的最寬范圍和Slession是相同的。然而,映射器實(shí)例的最佳范圍是方法范圍。也就是說,它們應(yīng)該在使用它們的方法中被請(qǐng)求,然后就拋棄掉。它們不需要明確地關(guān)閉,那么在請(qǐng)求對(duì)象中保留它們也就不是什么問題了,這和SqlSession相似。你也許會(huì)發(fā)現(xiàn),在這個(gè)水平上管理太多的資源的話會(huì)失控。保持簡單,將映射器放在方法范圍內(nèi)。下面的示例就展示了這個(gè)實(shí)踐:ObjectlifecycleandDependencyInjectionDependencyInjectionframeworkscancreatethreadsafe,transactionalSqlSessionsandmappersandinjectthemdirectlyintoyourbeanssoyoucanjustforgetabouttheirlifecycle.YoumaywanttohavealookatMyBatis-SpringorMyBatis-Guicesub-projectstoknowmoreaboutusingMyBatiswithDIframeworks.Copyright?2010-2013MyB.AllRights::03/07/13/mybatis-:MyBatis-MyBatis3|XML映射配置文件 С:84807 :Sat,23Feb201307:34:36WebZIP最近更新:23二月2013|版本:3.2.1-XMLXML映射配置文 MapperXML文件動(dòng)態(tài)SQLJavaAPI StatementBuilders MyBatis的XML配置文件包含了影響MyBatis行為甚深的設(shè)置和屬性信息。XML文檔的級(jí)結(jié)構(gòu)如下configuration配置properties屬性settings設(shè)置typeAliases類型命名objectFactory對(duì)象工廠plugins插件environments環(huán)境environment環(huán)境變量dataSource數(shù)據(jù)源databaseIdProvider?mappers映射器這些是外部化的,可替代的屬性,這些屬性也可以配置在典型的Java屬性配置文件中,或者通過properties元素的子元素來傳遞。例如<properties<properties<propertyname="username"<propertyname="password"其中的屬性就可以在整個(gè)配置文件中使用,使用可替換的屬性來實(shí)現(xiàn)動(dòng)態(tài)配置。比如<dataSource<dataSource<propertyname="driver"<propertyname="url"<propertyname="username"<propertyname="password"這個(gè)例子中的username和password將會(huì)由properties元素中設(shè)置的值來替換。driver和url屬性將會(huì)從包含進(jìn)來的perties件中的值來替換。這里提供很多配置的屬性也可以被傳遞到SqlSessionBuilder.build()方法中。例如SqlSessionFactorySqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,//...orSqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,environment,如果在這些地方,屬性多于一個(gè)的話,MyBatis按照如下的順序加載它們?cè)趐roperties元素體內(nèi)指定的屬性首先被從類路徑下資源或properties元素的url屬性中加載的屬性第二被,它會(huì)覆蓋已經(jīng)存在的完全一樣的屬性作為方法參數(shù)傳遞的屬性最后被,它也會(huì)覆蓋任一已經(jīng)存在的完全一樣的屬性,這些屬性可能是從properties元素體內(nèi)和資源/url屬性中因此,最高優(yōu)先級(jí)的屬性是那些作為方法參數(shù)的,然后是資源/url屬性,最后是properties元素中指定的屬性這些是極其重要的調(diào)整,它們會(huì)修改MyBatis在運(yùn)行時(shí)的行為方式。下面這個(gè)表格描述了設(shè)置信息,它們的含義和默認(rèn)值。 這個(gè)配置使全局的映射器啟用 true| 禁用緩存 全局啟用或禁用延遲加載。當(dāng) true| 用時(shí),所有關(guān)聯(lián)對(duì)象都會(huì)即時(shí)加 當(dāng)啟用時(shí),有延遲加載屬性的 true| 象在被調(diào)用時(shí)將會(huì)完全加載任意屬性。否則,每種屬性將會(huì)按需multipleResultSe 允許或不允許多種結(jié)果集從一 true| 單獨(dú)的語句中返回(需要適合的 使用列代替列名。不同的 true| 動(dòng)在這方便表現(xiàn)不同。參考驅(qū)動(dòng)文檔或充分測(cè)試兩種方法來決 允許JDBC支持生成的鍵。 true| 要適合的驅(qū)動(dòng)。如果設(shè)置為true則這個(gè)設(shè)置強(qiáng)制生成的鍵被使用,盡管一些驅(qū)動(dòng)兼容但仍然有效(比如指定MyBatis如何自動(dòng)映射列NONE,字段/屬性。PARTIAL只會(huì)映射簡單,沒有嵌套的果。FULL會(huì)自動(dòng)映射任意復(fù)雜的結(jié)果(嵌套的或其他情況)配置默認(rèn)的執(zhí)行器。SIMPLESIMPLE行器沒有什么特別處。REUSE執(zhí)行器重用處語句。BATCH執(zhí)行器重用語和批量更設(shè)置超時(shí)時(shí)間,它決定驅(qū)動(dòng)AnypositiveNotSet一個(gè)數(shù)據(jù)庫響應(yīng)的時(shí)間AllowsusingRowBoundstrue|nestedEnablesautomatictrue|fromclassicdatabasenamesA_COLUMNtocaseclassicJavanamesMyBatisuseslocalcacheSESSIONpreventcircularreferencesspeeduprepeatedqueries.Bydefaultallqueriesexecutedduringsessionarecached.localsessionwillbeusedforstatementexecution,datawillbesharedbetweendifferentcallstotheSpecifiestheJDBCtypeforJdbcTypevalueswhennospecificMostcommontypewasprovidedforNULL,VARCHARparameter.SomerequirespecifyingtheJDBCtypebutothersworkgenericvalueslikeVARCHARorSpecifieswhichObject'smethodstriggeralazyloadAmethodnamelistseparatedbycommasSpecifiesthelanguageusedAtypealiasordefaultfordynamicqualifiedclassSpecifiesifsettersormap'strue|methodwillbecalledwhenaretrievedvalueisnull.Notethatifset,propertiesthatmayfilledwithnullvaluesneverbeSpecifiestheprefixstringAnyNotMyBatiswilladdtotheSpecifieswhichSLF4J|LOG4JNotimplementationMyBatisJDK_LOGGINGuse.Ifthissettingisnotloggingimplementationwill|STDOUT_LOGGINGSpecifies toolCGLIB|MyBatiswilluseforcreatinglazyloadingcapableobjects.一個(gè)設(shè)置信息元素的示例,完全的配置如下所示<settingname="cacheEnabled"<settingname="lazyLoadingEnabled"<setting abled"<settingname="useColumnLabel"<settingname="useGeneratedKeys"<setting Behavior"<settingname="defaultExecutorType"<settingname="defaultStatementTimeout"<settingname="safeRowBoundsEnabled"<settingname="mapUnderscoreToCamelCase"<settingname="localCacheScope"<settingname="jdbcTypeForNull"<settingname="lazyLoadTriggerMethods"類型別名是為Java類型命名一個(gè)短的名字。它只和XML配置有關(guān),只用來減少類完全限定名的多余部分。例如<typeAliasalias="Author" <typeAliasalias="Blog" <typeAliasalias="Comment" <typeAliasalias="Post" <typeAliasalias="Section" <typeAliasalias="Tag" 使用這個(gè)配置,“Blog”可以任意用來替代“.blog.Blog”所使用的地方Y(jié)oucanalsospecifyapackagewhereMyBatiswillsearchforbeans.For<packageEachbeanfoundinofthebean.Thasalias.Seetheexample

,ifnoannotationisfound,willberegisteredasanaliasusinguncapitalizednon-qualifiedclassnamewillberegisteredas .Ifthe annotationisfounditsvaluewillbeusedasanpublicclassAuthor對(duì)于普通的Java類型,有許多內(nèi)建的類型別名。它們都是大小寫不敏感的,由于重載的名字,要注意原生類型的特殊處理。 i I無論是MyBatis在預(yù)處理語句中設(shè)置一個(gè)參數(shù),還是從結(jié)果集中取出一個(gè)值時(shí),類型處理器被用來將獲取的值以合適的方式轉(zhuǎn)換成Java類類型處理Java類JDBC類java.lang.Boolean任何兼容的布爾java.lang.Byte,任何兼容的數(shù)字或字節(jié)類java.lang.Short,任何兼容的數(shù)字或短java.lang.Integer,任何兼容的數(shù)字和整java.lang.Long,任何兼容的數(shù)字或長java.lang.Float,任何兼容的數(shù)字或單精度浮點(diǎn)java.lang.Double任何兼容的數(shù)字或雙精度浮點(diǎn)任何兼容的數(shù)字或十進(jìn)制小數(shù)CHAR和VARCHAR類CLOB和LONGVARCHAR類NVARCHAR和NCHAR類 NCLOB類任何兼容的字節(jié)流類BLOB和LONGVARBINARY類TIMESTAMP類DATE類TIME類TIMESTAMP類DATE類TIME類其他或未指定類EnumerationVARCHAR-任何兼容的字符串類型作為代碼(而不是索引EnumerationAnycompatibleNUMERICor,asthepositionisstored(notthe你可以重寫類型處理器或創(chuàng)建你自己的類型處理器來處理不支持的或非標(biāo)準(zhǔn)的類型。//TODOtranslationneededTodoso,simplyextend classandoptionallymapyournew classtoaJDBCtype.例如://ExampleTypeHandler.java//ExampleTypeHandler.javapublicclassExampleTypeHandlerextendsBaseTypeHandler<String>publicvoidsetNonNullParameter(PreparedStatementps,inti,Stringparameter,JdbcTypejdbcType)throwsSQLException{ps.setString(i,publicStringgetNullableResult(ResultSetrs,StringcolumnName)throws{returnpublicStringgetNullableResult(ResultSetrs,intcolumnIndex)throws{returnpublicStringgetNullableResult(CallableStatementcs,intcolumnIndex)throws{return<!--<!--mybatis-config.xml--<typeHandler使用這樣的類型處理器將會(huì)覆蓋已經(jīng)存在的處理Java的String類型屬性和VARCHAR參數(shù)及結(jié)果的類型處理器。要注意MyBatis不會(huì)審視數(shù)據(jù)庫元信息來決定使用哪種類型,所以你必須在參數(shù)和結(jié)果映射中指定那是VARCHAR類型的字段,來綁定到正確的類型處理器上。這是因?yàn)镸yBatis直到語句被執(zhí)行都不知道數(shù)據(jù)類型的這個(gè)現(xiàn)實(shí)導(dǎo)致的。//TODOtranslationneededMyBatiswillknowthetheJavatypethatyouwanttohandlewiththisTypeHandlerbyintrospectingitsgenerictype,butyoucanoverridethisbehaviorbytwomeans:javaType="String"Adding attributetothetypeHandlerelement(forjavaType="String"Adding annotationto classspecifyingthelistofjavatypestoassociateitwith.Thisannotationbeignoredif attributeasalsobeenAssociatedJDBCtypecanbespecifiedbytwojdbcType=VARCHARAdding attributetothetypeHandlerelement(forjdbcType=VARCHARAddinga annotationtoyourTypeHandlerclassspecifyingthelistofJDBCtypestoassociateitwith.Thisannotationwillbeignoredifthe attributeasalsobeenspecified.AndfinallyyoucanletMyBatissearchforyour<!--<!--mybatis-config.xml--<packageNotethatwhenusingtheautodiscoveryfeatureJDBCtypescanonlybespecifiedwithYoucancreateagenericTypeHandlerthatisabletohandlemorethanoneclass.ForthatpurposeaddaconstructorthatreceivestheclassasaparameterandMyBatiswillpasstheactualclasswhenconstructingtheTypeHandler.publicclassGenericTypeHandler<EextendsMyObject>extends{privateClass<E>publicGenericTypeHandler(Class<E>type)if(type==null)thrownewIllegalArgumentException("Typeargumentcannotbethis.type=Handling

aregenericTypeHandlers.WewilllearnabouttheminthefollowingIfyouwanttomapanEnum,you'llneedtouseForexample,let'ssaythatweneedtostoretheroundingmodethatshouldbeusedwithsomenumberifitneedstoberounded.Bydefault,MyBatisuses toconvertthe valuestotheirnames.isspecialinthesensethatunlikeotherhandlers,itdoesnothandlejustonespecificclass,butanyHowever,wemaynotwanttostorenames.OurDBAmayinsistonanintegercodeinstead.That'sjustaseasy:to inyourconfigfile,andnow willbemappedtoanintegerusingordinal<!--<!--mybatis-config.xml--<typeHandlerhandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"Butwhatifyouwanttomapthe toastringinoneceandtointegerinTheauto-mapperwillautomaticallyuseEnumOrdinalTypeHandler,soifwewanttogobacktousinginoldEnumTypeHandler,wehavetolit,byexplicitlysettingthetypehandlertouseforthoseSQL(Mapperfilesaren'tcovereduntilthenextsection,soifthisisyourfirsttimereadingthroughtheation,youmaywanttoskipthisfornowandcomebacktoitlater.)<!DOCTYPE<!DOCTYPEPUBLIC"-////DTDMapper3.0//EN" <!DOCTYPEPUBLIC"-////DTDMapper3.0//EN" <mapper<resultMaptype="org.apache.ibatis.submitted.rounding.User"<idcolumn="id"<resultcolumn="name"<resultcolumn="funkyNumber"<resultcolumn="roundingMode"<selectid="getUser"resultMap="usermap">select*fromusers<insertid="insert"parameterType="org.apache.ibatis.submitted.rounding.User">insertintousers(id,name,funkyNumber,roundingMode)values(#{id},#{name},#{funkyNumber},<resultMaptype="org.apache.ibatis.submitted.rounding.User"<idcolumn="id"<resultcolumn="name"<resultcolumn="funkyNumber"<resultcolumn="roundingMode"property="roundingMode"<selectid="getUser2"select*from<insertid="insert2"parameterType="org.apache.ibatis.submitted.rounding.User">insertintousers2(id,name,funkyNumber,roundingMode)values(#{id},#{name},#{funkyNumber},#{roundingMode,Notethatthissustouse

insteadof inourselectMyBatis每次創(chuàng)建結(jié)果對(duì)象新的實(shí)例時(shí),它使用一個(gè)ObjectFactory實(shí)例來完成。如果參數(shù)映射存在,默認(rèn)的ObjectFactory不比使用默認(rèn)構(gòu)造方法或帶參數(shù)的構(gòu)造方法實(shí)例化目標(biāo)類做的工作多。如果你想重寫默認(rèn)的ObjectFactory,你可以創(chuàng)建你自己的。比如:////publicclassExampleObjectFactoryextends{publicObjectcreate(Classtype){returnsuper.create(type);publicObjectcreate(Classtype,List<Class>constructorArgTypes,List<Object>{returnsuper.create(type,constructorArgTypes,publicvoidsetProperties(Properties{<!--mybatis-config.xml--<objectFactory<propertyname="someProperty"OjctFcty接口很簡單。它包含兩個(gè)創(chuàng)建用的方法,一個(gè)是處理默認(rèn)構(gòu)造方法的,另外一個(gè)是處理帶參數(shù)構(gòu)造方法的。最終,stPtis方法可以被用來配置jctFctry。在初始化你的jctFcty實(shí)例后,jctFcty元素體中定義的屬性會(huì)被傳遞給stProptis方法。MyBatis允許你在某一點(diǎn)已映射語句執(zhí)行的調(diào)用。默認(rèn)情況下,MyBatis允許使用插件來方法調(diào)用Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)ParameterHandler(getParameterObject,setParameters)ResultSetHandler(handleResultSets,StatementHandler(prepare,parameterize,batch,update,這些類中方法的詳情可以通過查看每個(gè)方法的簽名來發(fā)現(xiàn),而且它們的源代碼在MyBatis的包中有。你應(yīng)該理解你覆蓋方法的行為,假設(shè)你所做的要比監(jiān)視調(diào)用要多。如果你嘗試修改或覆蓋一個(gè)給定的方法,你可能會(huì)打破MyBatis的。這是低層次的類和方法,要謹(jǐn)慎使用插使用插件是它們提供的非常簡單的力量。簡單實(shí)現(xiàn)器接口,要確定你想的指定簽名//ExamplePlugin.java//ExamplePlugin.javatype=method=args={MappedStatement.class,Object.class})})publicclassExamplePluginimplementsInterceptor{publicObjectintercept(Invocationinvocation)throwsThrowablereturnreturnpublicObjectplugin(Object{returnPlugin.wrap(target,publicvoidsetProperties(Propertiesproperties)<!--<!--mybatis-config.xml--<plugin<propertyname="someProperty"上面的插件將會(huì)在Executor實(shí)例中所有的“update”方法調(diào)用,它也是負(fù)責(zé)低層次映射語句執(zhí)行的內(nèi)部對(duì)象。除了用插件來修改MyBatis行為之外,你也可以完配置類。簡單擴(kuò)展它,然后覆蓋其中的任意方法,之后傳遞它sqlSessionFactoryBuilder.build(myConfig)方法的調(diào)用。這可能會(huì)嚴(yán)重影響MyBatis的行為,所以要MyBatis可以配置多種環(huán)境。這會(huì)幫助你將SQL映射應(yīng)用于多種數(shù)據(jù)庫之中。例如,你也許為開發(fā)要設(shè)置不同的配置,測(cè)試和生產(chǎn)環(huán)境?;蛘吣憧赡苡卸喾N生產(chǎn)級(jí)數(shù)據(jù)庫卻共享相同的模式,所以你會(huì)想對(duì)不同數(shù)據(jù)庫使用相同的SQL映射。這種用例是很多的。一個(gè)很重要的問題要記得:你可以配置多種環(huán)境,但你只能為每個(gè)SqlSessionFactory實(shí)例選擇一個(gè)所以,如果你想連接兩個(gè)數(shù)據(jù)庫,你需要?jiǎng)?chuàng)建兩個(gè)SqlSessionFactory實(shí)例,每個(gè)數(shù)據(jù)庫對(duì)應(yīng)一個(gè)。而如果是三個(gè)數(shù)據(jù)庫,你就需要三個(gè)實(shí)例,以此每個(gè)數(shù)據(jù)庫對(duì)應(yīng)一個(gè)為了明確創(chuàng)建哪種環(huán)境,你可以將它作為可選的參數(shù)傳遞 SqlSessionFactoryBuilder。可以接受環(huán)境配置的兩個(gè)方法簽名是SqlSessionFactorySqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,environment);SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,environment,properties);如果環(huán)境被忽略,那么默認(rèn)環(huán)境將會(huì)被加載,如下進(jìn)行SqlSessionFactorySqlSessionFactoryfactory=SqlSessionFactoryfactory=環(huán)境元素定義了如何配置環(huán)境<environments<environments<environment<transactionManager<propertyname="..."<dataSource<propertyname="driver"<propertyname="url"<property<propertyname="username"<propertyname="password"注意這里的鍵默認(rèn)的環(huán)境ID(比如:default=”development”)每個(gè)environment元素定義的ID(比如:id=”development”)。數(shù)據(jù)源的配置(比如:type=”POOLED”)默認(rèn)的環(huán)境和環(huán)境ID是自我解釋的。你可以使用你喜歡的名稱來命名,只要確定默認(rèn)的要匹配其中之在MyBatis中有兩種事務(wù)管理器類型(也就是JDBC–這個(gè)配置直接簡單使用了JDBC的提交和回滾設(shè)置。它依賴于從數(shù)據(jù)源得到的連接來管理事<transactionManager<propertyname="closeConnection"MANAGED–這個(gè)配置幾乎沒做什么。它從來不提交或回滾接。而它會(huì)讓容器來管理事務(wù)的整個(gè)生命周期(比如Spring或JEE應(yīng)用服務(wù)器的上下文)默認(rèn)情況下它會(huì)關(guān)閉連接。然而一些容器并不希望這樣,因此如果你需要從連接中<transactionManager<propertyname="closeConnection"IfyouarenningtouseMyBatiswithSpringthereisnoneedtoconfigureanyTransactionManagerbecausetheSpringmodulewillsetitsownoneoverridinganypreviouslysetconfiguration.這兩種事務(wù)管理器都不需要任何屬性。然而它們都是類型別名,要替換使用它們,你需要放置將你自己的類的完全限定名或類型別名,它們了你對(duì)TrsctinFctoy接口的實(shí)現(xiàn)類。publicpublicinterface{voidsetProperties(PropertiesTransactionnewTransaction(ConnectionTransactionnewTransaction(DataSourcedataSource,TransactionIsolationLevellevel,任何在XML中配置的屬性在實(shí)例化之后將會(huì)被傳遞給setProperties()方法。你的實(shí)現(xiàn)類需要?jiǎng)?chuàng)建一個(gè)事務(wù)接口的實(shí)現(xiàn),這個(gè)接口也很簡單publicpublicinterfaceTransactionConnectiongetConnection()throwsvoidcommit()throwsSQLException;voidrollback()throwsSQLException;voidclose()throwsSQLException;使用這兩個(gè)接口,你可以完全自定義MyBatis對(duì)事務(wù)的處理dataSource元素使用基本的JDBC數(shù)據(jù)源接口來配置JDBC連接對(duì)象的資源許多MyBtis的應(yīng)用程序?qū)?huì)按示例中的例子來配置數(shù)據(jù)源。然而它并不是必須的。要知道為了方便使用延遲加載,數(shù)據(jù)源才是必須的。有三種內(nèi)建的數(shù)據(jù)源類型(也就是typ=”???”):UNPOOLED–這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)是每次被請(qǐng)求時(shí)簡單打開和關(guān)閉連接。它有一點(diǎn)慢,這是對(duì)簡單應(yīng)用程序的一個(gè)很好的選擇,因?yàn)樗恍枰皶r(shí)的可用連接。不同的數(shù)據(jù)庫對(duì)這個(gè)的表現(xiàn)也是不一樣的,所以對(duì)某些數(shù)據(jù)庫來說配置數(shù)據(jù)源并不重要,這個(gè)配置也是閑置的。UNPOOLED類型的數(shù)據(jù)源僅僅用來配置以下5種屬性:這是JDBC驅(qū)動(dòng)的Java類的完全限定名(如果你的驅(qū)動(dòng)包含,它也不是數(shù)據(jù)源類)url這是數(shù)據(jù)JDBCURL地址登錄數(shù)據(jù)庫的用戶名登錄數(shù)據(jù)庫的–默認(rèn)的連接事務(wù)級(jí)別作為可選項(xiàng),你可以傳遞數(shù)據(jù)庫驅(qū)動(dòng)的屬性。要這樣做,屬性的前綴是以“driver.”開頭的,例如“UTF8”來傳遞屬性“encoding”,它是通過DriverManager.getConnection(url,driverProperties)方法傳遞給數(shù)據(jù)庫POOLED–這是JDBC連接對(duì)象的數(shù)據(jù)源連接池的實(shí)現(xiàn),用來避免創(chuàng)建新的連接實(shí)例時(shí)必要的初始連接和認(rèn)證時(shí)間。這是一種當(dāng)前Web應(yīng)除了上述(UNPOOLED)的屬性之外,還有很多屬性可以用來配置POOLED數(shù)據(jù)源在任意時(shí)間存在的活動(dòng)(也就是正在使用)連接的數(shù)量。默認(rèn)值任意時(shí)間存在的空閑連接數(shù)在被強(qiáng)制返回之前,池中連接被檢查的時(shí)間。默認(rèn)值:20000毫秒(也就是20秒這是給連接池一個(gè)打印日志狀態(tài)機(jī)會(huì)的低層次設(shè)置,還有重新嘗試獲得連接,這些情況下往往需要很長時(shí)間為了避免連接池沒有配置時(shí)靜默失敗)。默認(rèn)值:2000毫秒(也就是0秒)發(fā)送到數(shù)據(jù)的偵測(cè)查詢,用來驗(yàn)證連接是否正常工作,并且準(zhǔn)備接受請(qǐng)求。默認(rèn)是“NOQUERYSET”,這會(huì)引起許多這是開啟或禁用偵測(cè)查詢。如果開啟,你必須用一個(gè)合法的SQL語句(最好是很快速的)設(shè)置poolQuery屬性。認(rèn)值:false–這是用來配置poolQuery多次時(shí)間被用一次。這可以被設(shè)置匹配標(biāo)準(zhǔn)的數(shù)據(jù)庫連接超時(shí)時(shí)間,避免不必要的偵測(cè)。默認(rèn)值:0(也就是所有連接每一時(shí)刻都被偵測(cè)-但僅僅當(dāng)poolEnabled為true時(shí)適用)JNDI–這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)是為了使用如Spring或應(yīng)用服務(wù)器這類的容器,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個(gè)JNDI上下文的(也就是initialContext.lookup(initial——context)。這是個(gè)可選屬性,如果被忽略,那么data_source屬性將會(huì)直接以initialContext為背景再次尋找。–這是數(shù)據(jù)源實(shí)例位置的上下文的路徑。它會(huì)以由initial_context查詢返回的環(huán)境為背景來查找,如果initial_context沒和其他數(shù)據(jù)源配置相似,它也可以通過名為“env.”的前綴直接向初始上下文發(fā)送屬性。比如在初始化之后,這就會(huì)以值“UTF8”向初始上下文的構(gòu)造方法傳遞名為“encoding”的屬性MyBatisisabletoexecutedifferentstatementsdependingonyourdatabasevendor.Themulti-dbvendorsupportisbasedonthemappedstatements attribute.MyBatiswillloadallstatementswithno attributeorwitha matchesthecurrentone.Ifcasethesamestatementiffoundwithandwithout thelatterwillbediscarded.Toenablemultivendorsupportadd tomybatis-config.xmlfileas<databaseIdProvider<databaseIdProvidertype="VENDOR"TheVENDORimplementationdatabaseIdProvidersetsasadatabaseIdtheStringreturnedbyDatabaseMetaData#getDatabaseProductName().Asusuallythatstringistoolongandalso,differentversionsofthesameproductreturndifferentvalues,soyoumaywanttotranslateittoashorteronebyaddingpropertieslikefollows:<databaseIdProvider<databaseIdProvider<propertyname="SQLServer"<propertyname="DB2"<propertyname="Oracle"value="oracle"Whenpropertiesareprovided,theVENDORdatabaseIdProviderwillsearchthepropertyvaluecorrespondingtothefirstkeyfoundinreturneddatabaseproductnameor"null"ifthereisnotamatchingproperty.Inthiscase,if(DataDirect)"thedatabaseIdwillbesetto"oracle".Youcanbuildyourowndatabaseproviderbyimplementingtheinterfaceregisterinitinmybatis-config.xml:

returnspublicpublicinterface{voidsetProperties(PropertiesStringgetDatabaseId(DataSourcedataSource)throws既然MyBatis的行為已經(jīng)由上述元素配置完了,我們現(xiàn)在就要定義SQL映射語句了。但是,首先我們需要告訴MyBatis到哪里去找到這些語句。Java在這方面沒有提供一個(gè)很好的方法,所以最佳的方式是告訴MyBatis到哪里去找映射文件。你可以使用相對(duì)于類路徑的資源引用,或者字符表示,或url的完全限定名(包括file:///URLs)。例如<!--<!--Usingclasspathrelativeresources--<mapper<mapper<mapper<mapper<mapper<!--Usingurlfullyqualifiedpaths--<mapper<package這些語句簡單告訴了MyBatis去哪里找映射文件。其余的細(xì)節(jié)就是在每個(gè)SQL映射文件中了,下面的部分我們來討論SQL映射文件Copyright?2010-2013MyB.AllRights最近更新232013|版本3.2.1-XML映射XML映射配置文insert,updateanddeleteResultMapsJavaStatementBuilders 項(xiàng)目文 MyBatis真正的力量是在映射語句中。這里是發(fā)生的地方。對(duì)于所有的力量,SQL映射的XML文件是相當(dāng) 的簡單。當(dāng)然如果你將它們和對(duì)等功能的JDBC代碼來比較,你會(huì)發(fā)現(xiàn)映射文件節(jié)省了大約95%的代碼量。MyBatis的構(gòu)建就是聚焦于SQL的,使其遠(yuǎn)離于普通的方式。 映射文件有很少的幾個(gè)頂級(jí)元素(按照它們應(yīng)該被定義的順序cache–配置給定命c(diǎn)ache-ref–從其名空間緩存配置resultMap–最復(fù)雜,也是最有力量的元素,用來描述如何從數(shù)據(jù)庫結(jié)果集中來aaeeMp–已經(jīng)被廢棄了!老式風(fēng)格的參數(shù)映射。內(nèi)聯(lián)參數(shù)是首選,這個(gè)元素可能在將來被移除。這里不sql–可以重用的SQL塊,也可以被其他語句。insert映射插入語句update映射更新語句delete映射刪除語句select–映射查詢語下一部分將從語句本身開始來描述每個(gè)元查詢語句是使用yatis時(shí)最常用的元一。直到你從數(shù)據(jù)庫取出數(shù)據(jù)時(shí)才會(huì)發(fā)現(xiàn)將數(shù)據(jù)存在數(shù)據(jù)庫中是多么的有價(jià)值,所以許多應(yīng)用程序查詢要比更改數(shù)據(jù)多的多。對(duì)于每次插入,更新或刪除,那也會(huì)有很多的查詢。這是yas的一個(gè)基本原則,也是將重心和努力放到查詢和結(jié)果映射的原因。對(duì)簡單類別的查詢?cè)厥欠浅:唵蔚?。比?這個(gè)語句被稱作select,使用一個(gè)int(或Integer)類型的參數(shù),并返回一個(gè)HashMap類型的對(duì)象,其中的注意參數(shù)注釋這就告訴yatis創(chuàng)建一個(gè)預(yù)處理語句參數(shù)。使用JD,這樣的一個(gè)參數(shù)在SL中會(huì)由一個(gè)“?”來標(biāo)識(shí),并被傳遞到一個(gè)新的預(yù)處理語句中,就像這樣:當(dāng)然,這需要很多單獨(dú)的JDC的代碼來提取結(jié)果并將它們映射到對(duì)象實(shí)例中,這就是yatis節(jié)省你時(shí)間的地方。我們需要深入了解參數(shù)和結(jié)果映射。那些細(xì)節(jié)部分我們下面來了解。 元素有很多屬性允許你配置,來決定每條語句屬 描

Select在命名空間中唯一的標(biāo)識(shí)符可以被用來這條語句。將會(huì)傳入這條語句的參數(shù)類的完全限定名或別名。paerp 這是外部paraeterap的已經(jīng)被廢棄的方法。使用內(nèi)聯(lián)參數(shù)映射和paraeterype屬從這條語句中返回的期望類型的類的完全限定名或別名。注意集合情形,那應(yīng)該是集合可以包含的類型,而不能是集合本身。使用resultType或resultMap,但不能同時(shí)使用。命名外部的resultMap。返回map是MyBatis最具力量的特性,對(duì)其有一個(gè)很好的理解的話,許多復(fù)雜映射的情形就能被解決了。使用resultMap或resultType,但不能同時(shí)使用將其設(shè)置為 true,不論語句什么時(shí)候被帶哦用都會(huì)導(dǎo)致緩存被清空。默認(rèn)值:ase。將其設(shè)置為true,將會(huì)導(dǎo)致本條語句的結(jié)果被緩存。默認(rèn)值:true。這個(gè)設(shè)置驅(qū)動(dòng)程序等待數(shù)據(jù)庫返回請(qǐng)求結(jié)果,并拋出異常時(shí)間的最大等待值。默認(rèn)不設(shè)置(驅(qū)動(dòng)自行處理)這是暗示驅(qū)動(dòng)程序每次批量返回的結(jié)果行數(shù)。默認(rèn)不設(shè)置(驅(qū)動(dòng)自行處理)STATEMENT,PREPARED或CALLABLE的一種。這會(huì)讓MyBatis使用選擇使Statement,PreparedStatement或CallableStatement。默認(rèn)值:PREPAREDruttye W_L|L_II|LIIIE中的一種。默認(rèn)是不設(shè)置(驅(qū)動(dòng)自行處理)。 IncasethereisaconfigureddatabaseIdProvider,MyBatiswillloadallstatementswithnoattributeorwitha thatmatchesthecurrentone.Ifcasethefalsesamestatementiffoundwithandwithout thelatterfalseThisisonlyapplicablefornestedresultselectstatements:Ifthisistrue,itisassumedthatnestedresultsarecontainedorgroupedtogethersuchthatwhenanewmainresultrowisreturned,noreferencestoapreviousresultrowwilloccuranymore.Thisallowsnestedresultstobefilledmuchmorememoryfriendly.Default:insert,updateand數(shù)據(jù)變更語句insert,update和delete在它們的實(shí)現(xiàn)中非常相似屬 描

Insert,UpdateandDelete在命名空間中唯一的標(biāo)識(shí)符可以被用來這條語句。將會(huì)傳入這條語句的參數(shù)類的完全限定名或別名。這是外部parameterMap的已經(jīng)被廢棄的方法。使用內(nèi)聯(lián)參數(shù)映射和parameterType屬性。將其設(shè)置為true,不論語句什么時(shí)候被帶哦用,都會(huì)導(dǎo)致緩存被清空。默認(rèn)值:false這個(gè)設(shè)置驅(qū)動(dòng)程序等待數(shù)據(jù)庫返回請(qǐng)求結(jié)果,并拋出異常時(shí)間的最大等待值。默認(rèn)不設(shè)置(驅(qū)動(dòng)自行處理)。STATEMENT,PREPARED或CALLABLE的一種。這會(huì)讓MyBatis使用選擇使Statement,PreparedStatement或CallableStatement。默認(rèn)值:PREPARED(insert)這會(huì)告訴MyBatis使用JDBC的getGeneratedKeys方法來取出由數(shù)據(jù)(比如:MySQLSQLServer這樣的數(shù)據(jù)庫管理系統(tǒng)的自動(dòng)遞增字段)內(nèi)部生成(僅對(duì)insert有用標(biāo)記一個(gè)屬性MyBatis會(huì)通過getGeneratedKeys或者通過insert語句的selectKey子元素設(shè)置它的值。默認(rèn):不設(shè)置。(僅對(duì)insert有用標(biāo)記一個(gè)屬性MyBatis會(huì)通過getGeneratedKeys或者通過insert語句的selectKey子元素設(shè)置它的值。默認(rèn):不設(shè)置。 IncasethereisaconfigureddatabaseIdProvider,MyBatiswillloadallstatementswith attributeorwitha thatmatchesthecurrentone.Ifcasethesamestatementiffoundwithandwithoutthe下面就是insert,update和delete語句的示例

thelatterwill如前所述,插入語句有一點(diǎn)多,它有一些屬性和子元素用來處首先,如果你的數(shù)據(jù)庫支持自動(dòng)生成主鍵的字段(比如yL和SLerver),那么你可以設(shè)置useeneatdeys”tru”,而且設(shè)置keyroperty到你已經(jīng)做好的目標(biāo)屬性上。例如,如果上面的uthor表已經(jīng)對(duì)id使用了自動(dòng)生成的列類型,那么語句可以修改為:yts有另外法來處理數(shù)據(jù)庫不支持自動(dòng)生成類型,或者能JC驅(qū)動(dòng)不支持自動(dòng)生成主鍵時(shí)的主鍵生成問題。這里有一個(gè)簡單(甚至很傻)的示例,它可以生成一個(gè)隨機(jī)I(可能你不會(huì)這么做,但是這展示了yatis處理問題的靈活性,因?yàn)樗⒉徽娴年P(guān)心ID的生成):在上面的示例中,selectey元素將會(huì)首先運(yùn)行,uthor的id會(huì)被設(shè)置,然后插入語句會(huì)被調(diào)用。這給你了一個(gè)簡單的行為在你的數(shù)據(jù)庫中來處理自動(dòng)生成的主鍵,而不需要使你的Java代碼變得復(fù)雜。selectKey元素描述如下屬 描

selectKeyselectKey語句結(jié)果應(yīng)該被設(shè)置的目標(biāo)屬結(jié)果的類型。yatis通常可以算出來,但是寫上也沒有問題。yatis允許任何簡單類型用作主鍵的類型,包括字符串。這可以被設(shè)置為EORE或FTR。如果設(shè)置為BEO,那么它會(huì)首先選擇主鍵,設(shè)置keyroprty然后執(zhí)行插入語句。如果設(shè)置為FE,那么先執(zhí)行插入語句,然后是selectey元素-這和如racle數(shù)據(jù)庫相似,可以在插入語句中嵌入序列調(diào)用。和前面的相,MyBatis支持STATEMENTPREPAREDCALLABLE語句的映射類型,分別代表PreparedStatement和CallableStatement類型。這個(gè)元素可以被用來定義可重用的SQL代碼段,可以包含在其他語句中。比如這個(gè)SQL片段可以被包含在其他語句中,例如在之前的語句中,你已經(jīng)看到了一些簡單參數(shù)的示例。yas法,大概90%的情況,是不用太多的,比如:上面的這個(gè)示例說明了一個(gè)非常簡單名參數(shù)映射。參數(shù)類型被設(shè)置為“int”,因此這個(gè)參數(shù)可以被設(shè)置成任何內(nèi)容。原生的類型或簡單數(shù)據(jù)類型,比如整型和沒有相關(guān)屬性的字符串,因此它會(huì)完全用參數(shù)來替代。然而,如果你傳遞了一個(gè)復(fù)雜的對(duì)象,那么MyBats的處理方式就會(huì)有一點(diǎn)不同。比如:如果User類型的參數(shù)對(duì)象傳遞到了語句中,username和password屬性將會(huì)被查找,id、然后它們的值就被傳這點(diǎn)對(duì)于傳遞參數(shù)到語句中非常好。但是對(duì)于參數(shù)映射也有一些其他的特性。首先,像MyBatis的其他部分,參數(shù)可以指定一個(gè)確定的數(shù)據(jù)類型。像yatis的剩余部分,javaype通常可以從參數(shù)對(duì)象中來去頂,除非對(duì)象是一個(gè)ashap。那么javaype應(yīng)該被確定來保證使用正確類型處理器。如果null被當(dāng)作值來傳遞,對(duì)于所有可能為空的列,JDCype是需要的。以可以自己通過閱讀預(yù)處理語句的setull()方法的Javaocs文檔來研究這個(gè)。為了自定義類型處理器,你可以指定一個(gè)確定的類型處理器類(或別名 比如盡管它看起來繁瑣,但是實(shí)際上是你很少設(shè)置它們其中之對(duì)于數(shù)值類型,對(duì)于決定有多少數(shù)字是相關(guān)的,有一個(gè)數(shù)值范圍最后,mode屬性允IN,OUTINOUT參數(shù)OUTINOUT,參數(shù)對(duì)象屬性的真實(shí)值將會(huì)被改變,就像你期望你需要你個(gè)輸出參數(shù)。如果modeOUT或INOUTjdbcTypeCURSOR(也就是OracleREFCURSOR),你必須指定resultMap來映射結(jié)果集到參數(shù)類型。要注意這里的javaType屬性是可選的,如果左邊的空白是jdbcType的CURSOR類型,它會(huì)自動(dòng)地被設(shè)置為結(jié)果集。yatis也支持很多高級(jí)的數(shù)據(jù)類型,比如結(jié)構(gòu)體,但是當(dāng)out參數(shù)時(shí)你必須告訴語句類型名稱。比如(再次提示,在實(shí)際中不要像這樣換行盡管所有這些強(qiáng)大的選項(xiàng)很多時(shí)候你只簡單指定屬性名,MyBatis會(huì)自己計(jì)算剩余的。最多的情jdbcType指定可能為默認(rèn)情況下,使用#{}格式的語導(dǎo)致yatis創(chuàng)建預(yù)處理語句屬性并以它為背景設(shè)置安全的值(比如)。這樣做很安全,很迅速也是首選做法,有時(shí)你只是想直接在L語句中插入一個(gè)不改變的字符串。比如,像RDR,你可以這樣來使用:這里MyBatis不會(huì)修改或轉(zhuǎn)接受從用戶輸出的內(nèi)容并提供給語句中不變的字符串,L擊,因此你不應(yīng)該允許用戶輸入這些字段,Resultresultp元素是yatis中最重要最強(qiáng)大的元素。它就是讓你遠(yuǎn)離90的需要從結(jié)果集中取出數(shù)據(jù)的JDBC代碼的那個(gè)東西,而且在一些情形下允許你做一些JDC不支持的事情。事實(shí)上,編寫相似于對(duì)復(fù)雜語句聯(lián)合映射這些等同的代碼,也以跨過上千行的代碼。esultap的設(shè)計(jì)就是簡單語句不需要明確的結(jié)果映射,而很多復(fù)雜語句確實(shí)需要描述它們的關(guān)系。你已經(jīng)看到簡單映射語句的示例了,但沒有明確的resultMap。比如這樣一個(gè)語句簡單作用于所有列被自動(dòng)映射到ashap的鍵上,這由resultype屬性指定。這在很多情況下是有用的,但是ashap不能很好描述一個(gè)領(lǐng)域模型。那樣你的應(yīng)用程序?qū)?huì)使用Javaeans或Js(inldJavabect,普通Java對(duì)象)來作為領(lǐng)域模型。yatis對(duì)兩者都支持。這個(gè)Javaean:基于JavaBean的規(guī)范,上面這個(gè)類有3個(gè)屬性:id,username和hashedPassword。這些在select語句中會(huì)精確這樣的一個(gè)JavaBean可以被映射到結(jié)果集,就像映射到HashMap一樣簡單要記住類型別名是你的伙伴。使用它們你可以不用輸入類的全路徑。比如這些情況下,yatis會(huì)在幕后自動(dòng)創(chuàng)建一個(gè)esultap,基于屬性名來映射列到Javaean的屬性上。如果列名沒有精確匹配,你可以在列名上使用select字句的別名(一個(gè)基本的L特性)來匹配。比如:esultap最優(yōu)秀的地方你已經(jīng)了解了很多了,但是你還沒有真正的看到一個(gè)。這些簡單的示例不需要比你看到的東西。只是出于示例的原因,讓我們來看看最后一個(gè)示例外部的eltp是什么樣子,這也是解決列名不匹配的另外式它的語句使用resultMap屬性就行了(注意我們?nèi)サ袅藃esultType屬性)。比如如果世界總是這么MyBatis創(chuàng)建的一個(gè)想法:數(shù)據(jù)庫不用是你想要的或需要它們是什么樣的。而我們最喜歡的數(shù)據(jù)庫最好是第三范式或BCNF模式,但它們有時(shí)不是。如果可能有一個(gè)單獨(dú)的數(shù)據(jù)庫映射,所有應(yīng)用程序都可以使用它,這是非常好的,但有時(shí)也不是。結(jié)果映射就是MyBats提供處理這個(gè)問題的答案。比如,我們?nèi)绾斡成湎旅孢@個(gè)語句你可能想把它映射到一個(gè)智能的對(duì)象模型,包含一個(gè)作者寫的博客,有很多的博文,每篇博文有零條或多條的評(píng)論和。下面是一個(gè)完整的復(fù)雜結(jié)果映射例子(假設(shè)作者,博客,博文,評(píng)論和都是類型的別名)我們來看看,但是不用緊張,我們會(huì)一步一步來說明。當(dāng)天最初它看起來令人生畏,但實(shí)際上非常簡單resultMap元素有很多子元素和一個(gè)值得討論的結(jié)構(gòu)。下面是resultMap元素的概念視-類在實(shí)例化時(shí),用來注入結(jié)果到構(gòu)造方法-ID參數(shù);標(biāo)記結(jié)果作為ID可以幫助提高整體效-id–一個(gè)ID結(jié)果;標(biāo)記結(jié)果作為ID可以幫助提高整體效–注入到字段或JavaBean屬性的普通結(jié)一個(gè)復(fù)雜的類型關(guān)聯(lián);許多結(jié)果將包成這種類型嵌入結(jié)果映射–結(jié)果映射自身的關(guān)聯(lián),或者參考一個(gè)–復(fù)雜類型的嵌入結(jié)果映射–結(jié)果映射自身的集,或者參––嵌入結(jié)果映射–這種情形結(jié)果也映射它本身,因此可以包含很多相,或者它可以參照一個(gè)外部的結(jié)果映射。ResultMap AuniqueidentifierinthisnamespacethatcanbeusedtoreferencethisresultAfullyqualifiedJavaclassname,oratypealias(seethetableaboveforthelistofbuilt-intypealiases).Ifpresent,MyBatiswillenableordisabletheautomapforthisResultMap.ThisattributeoverridestheglobalautoMapBehavior.Default:unset. 元測(cè)試!使用該框架的缺點(diǎn)是它們有時(shí)是黑盒(是否可見源代碼)。你確定你實(shí)現(xiàn)想要的行為的最好選擇是編寫單元測(cè)試。它也可以你幫助得到提交時(shí)的錯(cuò)誤。下面一部分將詳細(xì)說明每個(gè)元id&這些是結(jié)果映射最基本內(nèi)容。id和result都映射一個(gè)單獨(dú)列的值到簡單數(shù)據(jù)類型(字符串,整型,雙精度浮點(diǎn)數(shù),日期等)的單獨(dú)屬性或字段。這兩者之間的唯一不同是d,緩存和嵌入結(jié)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論