mybatis 3.3中文官方手冊(cè)_第1頁(yè)
mybatis 3.3中文官方手冊(cè)_第2頁(yè)
mybatis 3.3中文官方手冊(cè)_第3頁(yè)
mybatis 3.3中文官方手冊(cè)_第4頁(yè)
mybatis 3.3中文官方手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩67頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

......................................................................................................................................mybatisv.3.3.0用戶手冊(cè)......................................................................................................................................內(nèi)容.......................................................................................................................................1.主要內(nèi)容...........................................................i2.介紹.................................................................13.開始..............................................................24.配置XML..........................................................85.映射xml文件..........................................................256.動(dòng)態(tài)SQL..............................................................567.JavaAPI....................................................................628.聲明構(gòu)建........................................................809.日志.....................................................................861介紹.......................................................................................................................................1.1介紹1.1.1MyBatis是什么?MyBatis是個(gè)一流的持久化框架,支持定制sql,存儲(chǔ)過(guò)程和高級(jí)映射。MyBatis消除了幾乎所有的jdbc代碼和手工的設(shè)置參數(shù)以及訪問(wèn)結(jié)果集。MyBatis可以用xml或者注解來(lái)配置和映射原始類型,Map接口和javapojo(簡(jiǎn)單java對(duì)象)到數(shù)據(jù)庫(kù)結(jié)果。1.1.2讓這個(gè)文檔更好…如果發(fā)現(xiàn)次文檔缺少,或者丟失了一些特性,最好的方式是學(xué)習(xí)他并自己寫個(gè)文檔!這個(gè)文檔的源可以倉(cāng)庫(kù)獲得,格式為xdoc.更新他并給我們pull請(qǐng)求你想用自己的母語(yǔ)閱讀這個(gè)MyBatis文檔?給我們提供一個(gè)你母語(yǔ)的刊物補(bǔ)??!2開始2.1開始2.1.1安裝使用mybatis只要把mybatis-x.x.x.jar在項(xiàng)目的classpath中。如果使用maven,只要把下面的片段加到你的pom.xml中:<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>x.x.x</version></dependency>2.1.2從xml構(gòu)建SqlSessionFactory每一個(gè)MyBatis應(yīng)用都有一個(gè)SqlSessionFactory實(shí)例。一個(gè)SqlSessionFactory實(shí)例可以通過(guò)SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以通過(guò)xml配置文件創(chuàng)建一個(gè)SqlSessionFactory對(duì)象,或者通過(guò)一個(gè)定制的Configuration對(duì)象。通過(guò)xml創(chuàng)建一個(gè)SqlSessionFactory非常簡(jiǎn)單。推薦通過(guò)classpath資源來(lái)獲得配置文件,也可以通過(guò)使用一個(gè)InputStream對(duì)象,通過(guò)一個(gè)普通的文件路徑或者通過(guò)file://URL這種格式來(lái)創(chuàng)建(InputStream)。Mybatis包含一個(gè)工具類,叫Resources,包含數(shù)個(gè)從classpath或者其他位置加載資源簡(jiǎn)單的方法:Stringresource="org/mybatis/example/mybatis-config.xml";InputStreaminputStream=Resources.getResourceAsStream(resource);SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);Xml配置文件包含了核心的MyBatis設(shè)置,包含一個(gè)獲得數(shù)據(jù)庫(kù)連接對(duì)象的數(shù)據(jù)源,以及事務(wù)管理器用來(lái)確定事務(wù)的范圍和如何控制。完整的xml配置細(xì)節(jié)稍后可在文檔中找到,下面是個(gè)簡(jiǎn)單的例子:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-////DTDConfig3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><environmentsdefault="development"><environmentid="development"><transactionManagertype="JDBC"/><dataSourcetype="POOLED"><propertyname="driver"value="${driver}"/><propertyname="url"value="${url}"/><propertyname="username"value="${username}"/><propertyname="password"value="${password}"/></dataSource></environment></environments><mappers><mapperresource="org/mybatis/example/BlogMapper.xml"/></mappers></configuration>Xml配置還有很多細(xì)節(jié),上面的例子指出了重點(diǎn)的部分。注意那個(gè)XML頭,用來(lái)驗(yàn)證xml。Environment元素部分包含環(huán)境事務(wù)管理和連接池的配置。Mappers元素包含mappers列表-xml文件或者是注解的包含sql和映射定義的java接口2.1.3無(wú)xml構(gòu)建SqlSessionFactory如果你選擇直接通過(guò)java構(gòu)建SqlSessionFactory,而不是xml,或者創(chuàng)建你自己的配置文件構(gòu)建器,MyBatis提供了一個(gè)Configuration類,提供了和xml一樣的完整的配置選項(xiàng):DataSourcedataSource=BlogDataSourceFactory.getBlogDataSource();TransactionFactorytransactionFactory=newJdbcTransactionFactory();Environmentenvironment=newEnvironment("development",transactionFactory,dataSoConfigurationconfiguration=newConfiguration(environment);configuration.addMapper(BlogMapper.class);SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(configuration);注意這種配置下添加的是映射類。映射類是一個(gè)包含sql映射的注解的java類,不用xml.當(dāng)然,由于注解的限制和復(fù)雜性,高級(jí)映射仍然需要xml映射文件(比如嵌套查詢)。由于這個(gè)原因,Mybatis會(huì)自動(dòng)查找并且加載一個(gè)對(duì)等的xml文件,如果存在的話(上例,會(huì)從類路徑上加載BlogMapper.xml)。稍后詳細(xì)介紹。2.1.4從SqlSessionFactory獲得SqlSession現(xiàn)在你有了SqlSessionFactory,就像他的名字建議的那樣,你可以獲得一個(gè)SqlSession.SqlSession包含所有的關(guān)于數(shù)據(jù)庫(kù)執(zhí)行sql的方法。你可以通過(guò)SqlSession直接執(zhí)行映射過(guò)的sql過(guò)程。比如:SqlSessionsession=sqlSessionFactory.openSession();try{Blogblog=session.selectOne("org.mybatis.example.BlogMapper.selectBlog",101);}finally{session.close();}當(dāng)這個(gè)方法運(yùn)行,和前一個(gè)Mybatis版本非常像,這是一個(gè)非常簡(jiǎn)潔的行為。使用了一個(gè)借口(比如BlogMapper.class)正確的描述了一個(gè)確定聲明的參數(shù)和返回的值,現(xiàn)在可以以簡(jiǎn)單的執(zhí)行,更安全的代碼,沒有字面的和類型轉(zhuǎn)換的錯(cuò)誤。Whilethisapproachworks,andisfamiliartousersofpreviousversionsofMyBatis,thereisnowacleanerapproach.Usinganinterface(e.g.BlogMapper.class)thatproperlydescribestheparameterandreturnvalueforagivenstatement,youcannowexecutecleanerandmoretypesafecode,withouterrorpronestringliteralsandcasting.比如:SqlSessionsession=sqlSessionFactory.openSession();try{BlogMappermapper=session.getMapper(BlogMapper.class);Blogblog=mapper.selectBlog(101);}finally{session.close();}現(xiàn)在讓我們探索一下到底執(zhí)行了什么。2.1.5探索映射sql聲明在這一點(diǎn)上,你可能會(huì)疑惑到底什么被SqlSession或者M(jìn)apper類執(zhí)行了。映射sql聲明是個(gè)很大的主題,在這個(gè)文檔中占據(jù)了重要的角色。但是給你一個(gè)說(shuō)法現(xiàn)在在執(zhí)行什么,這里有兩個(gè)例子:AtthispointyoumaybewonderingwhatexactlyisbeingexecutedbytheSqlSessionorMapperclass.ThetopicofMappedSQLStatementsisabigone,andthattopicwilllikelydominatethemajorityofthisdocumentation.Buttogiveyouanideaofwhatexactlyisbeingrun,hereareacoupleofexamples.在上面的兩個(gè)例子中,聲明可以被定義在xml中或者是注解。我們先看xml。Mybatis實(shí)現(xiàn)的以xml作為基礎(chǔ)的映射語(yǔ)法讓Mybatis流行了多年。如果你使用過(guò)Mybatis,語(yǔ)法對(duì)你而言很熟悉,但是有多個(gè)xml映射的改進(jìn)會(huì)在后面說(shuō)清楚。這是一個(gè)關(guān)于xml映射,符合上面的sqlSession調(diào)用Ineitheroftheexamplesabove,thestatementscouldhavebeendefinedbyeitherXMLorAnnotations.Let'stakealookatXMLfirst.ThefullsetoffeaturesprovidedbyMyBatiscanberealizedbyusingtheXMLbasedmappinglanguagethathasmadeMyBatispopularovertheyears.Ifyou'veusedMyBatisbefore,theconceptwillbefamiliartoyou,buttherehavebeennumerousimprovementstotheXMLmappingdocumentsthatwillbecomeclearlater.HereisanexampleofanXMLbasedmappedstatementthatwouldsatisfytheaboveSqlSessioncalls.<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="org.mybatis.example.BlogMapper"><selectid="selectBlog"resultType="Blog">select*fromBlogwhereid=#{id}</select></mapper>看上面的這個(gè)簡(jiǎn)單的案例,他確實(shí)非常輕巧。你可以定義在一個(gè)映射文件中定義任意多的映射聲明,會(huì)導(dǎo)致這個(gè)xml有幾英里長(zhǎng)!文件的其他部分是自解釋的。他定義了映射的名字叫“selectBlog”,在“org.mybatis.example.BlogMapper”這個(gè)命名空間中,允許你通過(guò)特定的名字“org.mybatis.example.BlogMapper.selectBlog”來(lái)調(diào)用,就像我們?cè)谏厦娴睦又心菢樱築logblog=session.selectOne("org.mybatis.example.BlogMapper.selectBlog",101);注意通過(guò)確定的名字調(diào)用非常簡(jiǎn)單,也有理由這樣做。這個(gè)名字也可以直接映射給一個(gè)和命名空間名字一樣的、包含匹配的名字、參數(shù)和返回類型的映射方法的映射類。這允許你通過(guò)映射接口簡(jiǎn)單的調(diào)用那個(gè)方法,就像上面的那樣,下面的案例:BlogMappermapper=session.getMapper(BlogMapper.class);Blogblog=mapper.selectBlog(101);第二種方式有很多優(yōu)點(diǎn)。第一:他不依賴于字符串,所以更加安全。第二:如果你的IDE有代碼完成功能,在瀏覽映射聲明的時(shí)候你可以更方便。Thesecondapproachhasalotofadvantages.First,itdoesn'tdependonastringliteral,soit'smuchsafer.Second,ifyourIDEhascodecompletion,youcanleveragethatwhennavigatingyourmappedSQLstatements.命名空間的說(shuō)明.命名空間是在之前的Mybatis版本中是可選的,因?yàn)樗麤]有作用并且讓人疑惑。現(xiàn)在他是必須的并且有了超越獨(dú)立的長(zhǎng)聲明的用途。命名空間允許接口綁定,就像你看到的,如果你不打算今天使用它們,你也得遵照這個(gè)慣例,免得你改變主意。一旦使用命名空間,并且使用了合適的java包會(huì)讓你的代碼更簡(jiǎn)潔并且在將來(lái)提高M(jìn)ybatis的可用性。名稱解析:為了減少類型,Mybatis未所有的配置元素使用了如下的名稱解析規(guī)則,包括statements,resultmaps,caches,等等:?全限定名(比如:“com.mypackage.MyMapper.selectAllThings”)會(huì)直接查找并且使用—如果找到的話。?短名(比如:“selectAllThings”)可以引用任何含糊的入口。盡管如此,如果有超過(guò)兩個(gè)(比如:“com.foo.selectAllThings和com.bar.selectAllThings”),會(huì)報(bào)告一個(gè)短名稱不確定的錯(cuò)誤,因此必須使用全名。這里還有另外一個(gè)陷阱關(guān)于BlogMapper這個(gè)映射類。映射的聲明不一定全部是xml,也可以使用java注解。比如上面的xml配置可以用被如下的代替:packageorg.mybatis.example;publicinterfaceBlogMapper{@Select("SELECT*FROMblogWHEREid=#{id}")BlogselectBlog(intid);}簡(jiǎn)單的聲明注解十分簡(jiǎn)潔,但是,復(fù)雜的聲明,注解有缺陷,令人厭煩。因此,如果做任何復(fù)雜的,你最好用xml映射聲明。你和你的團(tuán)隊(duì)要做出決定,什么最合適你們,更重要的是,映射的方式要要一致。也就是說(shuō),不能鎖定在一種方式上。你可以輕松的遷移注解為基礎(chǔ)的映射到xml方式上,反之亦然。2.1.6返回和生命周期理解各種我們目前討論的類的范圍和生命周期類型是非常重要的。不正確的使用它們會(huì)導(dǎo)致嚴(yán)重的并發(fā)問(wèn)題。注意對(duì)象的生命周期和依賴注入框架的依賴注入可以產(chǎn)生線程安全的對(duì)象,事務(wù)型的SqlSession和Mappers可以直接注入你的beans中,所以可以不用理他們的生命周期,你可能想通過(guò)了解一下MyBatis-spring或者M(jìn)yBatis-Guice這兩個(gè)子項(xiàng)目來(lái)了解如何在依賴注入框架中使用MyBatis。SqlSessionFactoryBuilder這個(gè)對(duì)象可以實(shí)例化,用過(guò)后就可以扔掉了。創(chuàng)建SqlSessionFactory后這個(gè)對(duì)象沒必要保留。因此SqlSessionFactoryBuilder的范圍最好是方法內(nèi)(比如:一個(gè)方法的本地變量)。你可以重用SqlSessionFactoryBuilder來(lái)創(chuàng)建多個(gè)SqlSessionFactory對(duì)象,但最好不要保持這個(gè)對(duì)象,來(lái)確保xml資源的釋放。Thisclasscanbeinstantiated,usedandthrownaway.Thereisnoneedtokeepitaroundonceyou'vecreatedyourSqlSessionFactory.ThereforethebestscopeforinstancesofSqlSessionFactoryBuilderismethodscope(i.e.alocalmethodvariable).YoucanreusetheSqlSessionFactoryBuildertobuildmultipleSqlSessionFactoryinstances,butit'sstillbestnottokeepitaroundtoensurethatalloftheXMLparsingresourcesarefreedupformoreimportantthings.SqlSessionFactorySqlSessionFactory對(duì)象一旦創(chuàng)建,應(yīng)當(dāng)在你的應(yīng)用執(zhí)行期間存在。沒有理由銷毀并重建這個(gè)對(duì)象。最好不要在一個(gè)應(yīng)用運(yùn)行期間建立SqlSessionFactory多次。這樣做被稱為“不好的”。因此SqlSessionFactory最好的范圍是應(yīng)用范圍。這個(gè)可以通過(guò)多種方式實(shí)現(xiàn)。最簡(jiǎn)單的是使用單例模式或者靜態(tài)單例模式。Oncecreated,theSqlSessionFactoryshouldexistforthedurationofyourapplicationexecution.Thereshouldbelittleornoreasontoeverdisposeofitorrecreateit.It'sabestpracticetonotrebuildtheSqlSessionFactorymultipletimesinanapplicationrun.Doingsoshouldbeconsidereda“badsmell”.ThereforethebestscopeofSqlSessionFactoryisapplicationscope.Thiscanbeachievedanumberofways.ThesimplestistouseaSingletonpatternorStaticSingletonpattern.SqlSession每一個(gè)線程應(yīng)該有自己的SqlSession實(shí)例。SqlSession對(duì)象不能被共享,也不是線程安全的。因此最好的范圍是請(qǐng)求或者方法返回。永遠(yuǎn)不要用靜態(tài)的方式引用一個(gè)SqlSession對(duì)象,或者作為一個(gè)對(duì)象的類的屬性;永遠(yuǎn)不要引用SqlSession在受管理的域內(nèi)。比如serlvlet的HttpSession。如果你在用某種形式的web框架,建議把SqlSession的范圍遵從Http請(qǐng)求的范圍。也就是說(shuō),當(dāng)你收到一個(gè)Http請(qǐng)求,打開一個(gè)SqlSession,當(dāng)返回response(響應(yīng))時(shí),關(guān)閉它。關(guān)閉session是非常關(guān)鍵的。必須確保seesion在一個(gè)finally塊中被關(guān)閉。SqlSessionsession=sqlSessionFactory.openSession();try{//dowork}finally{session.close();}使用這個(gè)代碼格式保證在你的代碼中,數(shù)據(jù)庫(kù)資源被正確關(guān)閉。Mapper對(duì)象Mappers是一系列綁定到映射上下文的接口。從SqlSession中獲得。因此,任何mappers對(duì)象的范圍最大應(yīng)該和SqlSession對(duì)象一致。最好的范圍是方法范圍。那就是說(shuō),他們?cè)诜椒▋?nèi)請(qǐng)求,在方法內(nèi)被丟棄。他不需要顯式關(guān)閉。在一個(gè)請(qǐng)求內(nèi)保持這個(gè)對(duì)象,就像SqlSession一樣,也是沒有問(wèn)題的;但是在這個(gè)層次管理太多對(duì)象很快就會(huì)讓你忙不過(guò)來(lái)。保持簡(jiǎn)潔,保持Mappers在方法范圍內(nèi)。下面的例子演示了這種方式。SqlSessionsession=sqlSessionFactory.openSession();try{BlogMappermapper=session.getMapper(BlogMapper.class);//dowork}finally{session.close();}3配置XML.......................................................................................................................................3.1配置MyBaits配置影響MyBatis行為的多種設(shè)置和屬性。最頂層的文檔節(jié)點(diǎn)如下:?configuration?properties?settings?typeAliases?typeHandlers?objectFactory?plugins?environments?environment?transactionManager?dataSource?databaseIdProvider?mappers3.1.1properties這些是可擴(kuò)展、可替換的屬性,可以通過(guò)一個(gè)java的Properties對(duì)象,或者通過(guò)一個(gè)有子元素的properties配置。比如:<propertiesresource="org/mybatis/example/perties"><propertyname="username"value="dev_user"/><propertyname="password"value="F2Fa3!33TYyg"/></properties>這些屬性用在整個(gè)配置中,用來(lái)代替那些需要?jiǎng)討B(tài)設(shè)置的屬性,比如:<dataSourcetype="POOLED"><propertyname="driver"value="${driver}"/><propertyname="url"value="${url}"/><propertyname="username"value="${username}"/><propertyname="password"value="${password}"/></dataSource>這個(gè)例子中的username和password會(huì)被properties子節(jié)點(diǎn)中的值代替,url和driver屬性會(huì)被perties中對(duì)應(yīng)的值代替。這提供了非常多的配置選擇。Properties對(duì)象也可以作為SqlSessionBuilder.build()方法的參數(shù).比如:SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,props);//...or...SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,environment,properties);如果多個(gè)地方存在配置文件,MyBatis采用如下的順序加載:Properties配置中指定的文件首先讀取,Propertiesspecifiedinthebodyofthepropertieselementarereadfirst,?從classpath中或者url屬性中指定的屬性文件第二個(gè)讀取,并覆蓋任何已經(jīng)指定的同名的屬性,?Properties對(duì)象傳遞給方法作為參數(shù)的最后讀取,并覆蓋任何之前指定的同名參數(shù)。因此,優(yōu)先級(jí)最高的是作為參數(shù)傳遞給方法的,其次是resource/url屬性指定的properties文件,最后properties部分指定的屬性。3.1.2settings這是修改MyBatis的運(yùn)行方式時(shí)非常重要的部分。下面的表格描述了設(shè)置值,他們的含義以及默認(rèn)值。Setting描述可取值默認(rèn)cacheEnabled全局的禁用或者啟用任何緩存配置true|falsetruelazyLoadingEnabled全局的啟用或者禁用延遲加載。如果啟用,所有的關(guān)聯(lián)都會(huì)延遲加載。對(duì)于特定的關(guān)聯(lián),這個(gè)值可以被fetchType屬性覆蓋。.true|falsefalseaggressiveLazyLoading啟用時(shí),一個(gè)有懶加載屬性的對(duì)象會(huì)在首次訪問(wèn)懶加載屬性時(shí)加載相關(guān)的屬性;否則,則會(huì)在每個(gè)屬性訪問(wèn)時(shí)加載。true|falsetruemultipleResultSetsEnabled允許或者禁用一個(gè)上下文(Statement)返回多結(jié)果集(需要合適的驅(qū)動(dòng)).true|falsetrueuseColumnLabel使用列的標(biāo)題而不是列的名稱。不同的驅(qū)動(dòng)表現(xiàn)不同。參考驅(qū)動(dòng)文檔或者測(cè)試兩種模式來(lái)確定你的驅(qū)動(dòng)行為true|falsetrueuseGeneratedKeys允許jdbc支持生成的主鍵。需要一個(gè)合適的驅(qū)動(dòng),如果設(shè)置為true,合適的驅(qū)動(dòng)會(huì)強(qiáng)制產(chǎn)生主鍵,有些驅(qū)動(dòng)拒絕兼容但是仍然可以工作(比如derby)true|falseFalseautoMappingBehavior指定MyBatis如何自動(dòng)映射列到屬性。NONE禁用自動(dòng)映射;PARTIAL只在沒有嵌套結(jié)果集的時(shí)候自動(dòng)映射結(jié)果集;FULL會(huì)自動(dòng)映射任何的復(fù)雜結(jié)果集(包含或者不包含嵌套)NONE,PARTIAL,FULLPARTIALdefaultExecutorType配置默認(rèn)的執(zhí)行器(executor),SIMPLE執(zhí)行器不做任何特殊的行為。REUSE執(zhí)行器重用預(yù)編譯的結(jié)果集。BATCH執(zhí)行器重用上下文和批處理更新SIMPLEREUSEBATCHSIMPLEdefaultStatementTimeout設(shè)置驅(qū)動(dòng)等待數(shù)據(jù)庫(kù)響應(yīng)的時(shí)間任何正整數(shù)沒有設(shè)置(null)safeRowBoundsEnabled允許在嵌套上下文中使用行綁定true|falseFalsemapUnderscoreToCamelCase啟用數(shù)據(jù)庫(kù)到類的自動(dòng)的駝峰規(guī)則映射,列A_COLUMN映射成經(jīng)典類中的aColumn屬性true|falseFalselocalCacheScopeMyBatis使用本地緩存防止循環(huán)引用并加速重復(fù)查詢。默認(rèn)設(shè)置(SESSION)所有的查詢?cè)趕ession緩存的時(shí)候執(zhí)行,如果設(shè)置為STATEMENT,本地session只會(huì)在上下文執(zhí)行的時(shí)候使用,同一個(gè)SqlSession的不同調(diào)用不會(huì)緩存數(shù)據(jù)SESSION|STATEMENTSESSIONjdbcTypeForNull指定在沒有確定的jdbc類型指定的時(shí)候如何處理null值。部分驅(qū)動(dòng)需要確定的列的jdbc類型,部分可以用默認(rèn)值比如為VARCHAR指定NULLJdbcType枚舉值.常用的有NULL,VARCHAR或者OTHEROTHERlazyLoadTriggerMethods指定什么方法觸發(fā)延遲加載。逗號(hào)隔開的方法名列表equals,clone,hashCode,toStringdefaultScriptingLanguage指定默認(rèn)的語(yǔ)言用于動(dòng)態(tài)sql產(chǎn)生類型別名或者全名org.apache.ibatis.scripting.xmltags.XMLDynamcallSettersOnNulls指定如果讀取的值是null,setter或者map的put方法是否被調(diào)用。當(dāng)使用Map.keySet或者null值初始化的時(shí)候特別有用。注意,原始類型(int,boolean等)不會(huì)被設(shè)置成nulltrue|falsefalselogPrefix指定MyBatis添加到日志中的前綴任意字符串沒有設(shè)置logImpl指定Mybatis使用那種日志實(shí)現(xiàn)。如果指定的不是當(dāng)前日志實(shí)現(xiàn),會(huì)被自動(dòng)查找SLF4J|LOG4J|LOG4J2|JDK_LOGGING|COMMONS_LOGGING|STDOUT_LOGGING|NO_LOGGING沒有設(shè)置proxyFactory指定MyBatis使用的代理工具,用來(lái)創(chuàng)建合適的代理對(duì)象.CGLIB|JAVASSISTCGLIB.一個(gè)settings元素的配置例子如下:<settings><settingname="cacheEnabled"value="true"/><settingname="lazyLoadingEnabled"value="true"/><settingname="multipleResultSetsEnabled"value="true"/><settingname="useColumnLabel"value="true"/><settingname="useGeneratedKeys"value="false"/><settingname="autoMappingBehavior"value="PARTIAL"/><settingname="defaultExecutorType"value="SIMPLE"/><settingname="defaultStatementTimeout"value="25"/><settingname="safeRowBoundsEnabled"value="false"/><settingname="mapUnderscoreToCamelCase"value="false"/><settingname="localCacheScope"value="SESSION"/><settingname="jdbcTypeForNull"value="OTHER"/><settingname="lazyLoadTriggerMethods"value="equals,clone,hashCode,toString"/></settings>3.1.3typeAliases一個(gè)類型別名就是一個(gè)java類型的簡(jiǎn)稱。在xml配置中非常方便,避免輸入類的全名,比如:<typeAliases><typeAliasalias="Author"type="domain.blog.Author"/><typeAliasalias="Blog"type="domain.blog.Blog"/><typeAliasalias="Comment"type="domain.blog.Comment"/><typeAliasalias="Post"type="domain.blog.Post"/><typeAliasalias="Section"type="domain.blog.Section"/><typeAliasalias="Tag"type="domain.blog.Tag"/></typeAliases>通過(guò)這個(gè)配置,Blog可以在任意地方使用代替domain.blog.Blog.也可以指定一個(gè)包名讓MyBatis搜索類。比如:<typeAliases><packagename="domain.blog"/></typeAliases>每一個(gè)在domain.blog中發(fā)現(xiàn)的類,如果沒有發(fā)現(xiàn)注解,都會(huì)被注冊(cè)為一非大寫的非全限定的個(gè)別名。比如domain.blog.Author會(huì)被注冊(cè)為author.如果有@Alias注解,他的值會(huì)被作為別名??聪旅娴睦樱篅Alias("author")publicclassAuthor{...}很多常用的java類型都有內(nèi)置的別名。都是小寫,注意原始類型的包裝類型的特殊處理。3.1.4typeHandlers當(dāng)MyBatis設(shè)置PreparedStatement的一個(gè)參數(shù)或者訪問(wèn)ResultSet中的一個(gè)值,一個(gè)TypeHandler被使用來(lái)確定合適的java類型.如下的表格描述了默認(rèn)的TypeHandlers。TypeHandlerJavaTypesJDBCTypesBooleanTypeHandlerjava.lang.Boolean任意兼容的boolean類型ByteTypeHandlerjava.lang.Byte,byte任意兼容的NUMERIC或者BYTEShortTypeHandlerjava.lang.Short,short任意兼容的NUMERIC或者ShortIntegerIntegerTypeHandlerjava.lang.Integer,int任意兼容的NUMERIC或者IntegerLongTypeHandlerjava.lang.Long,long任意兼容的NUMERIC或者LONGIntegerFloatTypeHandlerjava.lang.Float,float任意兼容的NUMERIC或者FloatDoubleTypeHandlerjava.lang.Double,double任意兼容的NUMERIC或者DOUBLEBigDecimalTypeHandlerjava.math.BigDecimal任意兼容的NUMERIC或者DECIMALStringTypeHandlerjava.lang.StringCHAR,VARCHARClobTypeHandlerjava.lang.StringCLOB,LONGVARCHARNStringTypeHandlerjava.lang.StringNVARCHAR,NCHARNClobTypeHandlerjava.lang.StringNCLOBByteArrayTypeHandlerbyte[]任意兼容的流類型BlobTypeHandlerbyte[]BLOB,LONGVARBINARYDateTypeHandlerjava.util.DateTIMESTAMPDateOnlyTypeHandlerjava.util.DateDATETimeOnlyTypeHandlerjava.util.DateTIMESqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMPSqlDateTypeHandlerjava.sql.DateDATESqlTimeTypeHandlerjava.sql.TimeTIMEObjectTypeHandler任意其他,或者未指定的EnumTypeHandler枚舉類型VARCHAR或者其他兼容String的類型(不是索引)EnumOrdinalTypeHandler枚舉類型任意兼容NUMBERIC或者double,存儲(chǔ)的是索引(不是索引值本身)可以重寫或者定義自己的類型處理器來(lái)處理不收支持的或者非標(biāo)準(zhǔn)的類型。只要實(shí)現(xiàn)org.apache.ibatis.type.TypeHandler接口或者繼承org.apache.ibatis.type.BaseTypeHandler,并且映射到一個(gè)jdbc類型。例如://ExampleTypeHandler.java@MappedJdbcTypes(JdbcType.VARCHAR)publicclassExampleTypeHandlerextendsBaseTypeHandler<String>{@OverridepublicvoidsetNonNullParameter(PreparedStatementps,inti,Stringparameter,Jdps.setString(i,parameter);}@OverridepublicStringgetNullableResult(ResultSetrs,StringcolumnName)throwsSQLExceptreturnrs.getString(columnName);}@OverridepublicStringgetNullableResult(ResultSetrs,intcolumnIndex)throwsSQLExceptioreturnrs.getString(columnIndex);}@OverridepublicStringgetNullableResult(CallableStatementcs,intcolumnIndex)throwsSQLreturncs.getString(columnIndex);}}<!--mybatis-config.xml--><typeHandlers><typeHandlerhandler="org.mybatis.example.ExampleTypeHandler"/></typeHandlers>使用這樣的類型處理器會(huì)覆蓋已經(jīng)存在的javaString類型以及VARCHAR類型的參數(shù)和結(jié)果集的處理器。注意,MyBatis不會(huì)內(nèi)省數(shù)據(jù)庫(kù)的元信息來(lái)確定類型,所以必須明確指定他是一個(gè)VARCHAR域的類型轉(zhuǎn)換器,并用在參數(shù)和結(jié)果集映射中。這是因?yàn)閷?shí)際上,Statement不執(zhí)行,MyBatis無(wú)法確定數(shù)據(jù)類型。MyBatis通過(guò)內(nèi)省他的泛型確定此類型處理器要處理的類型,也可通過(guò)如下兩種方式重新定義:?給typeHandler元素加上一個(gè)javaType屬性(比如:javaType="String")?為你的TypeHandler加個(gè)@MappedTypes的注解,確定一個(gè)關(guān)聯(lián)的java類型的集合。如果配置了javaType屬性,這個(gè)注解會(huì)被忽略關(guān)聯(lián)的JDBC類型通過(guò)如下的兩種方式指定:?給typeHandler元素加上jdbcType屬性(比如:jdbcType="VARCHAR").?為TypeHandler增加@MappedJdbcTypes注解,確定一個(gè)關(guān)聯(lián)的JDBC類型的集合。如果配置了jdbcType屬性,此注解會(huì)被忽略。最后,讓MyBatis找到你的類型轉(zhuǎn)換器:<!--mybatis-config.xml--><typeHandlers><packagename="org.mybatis.example"/></typeHandlers>注意:使用JDBC類型的自動(dòng)發(fā)現(xiàn)特性,必須使用注解。可以創(chuàng)建一個(gè)TypeHandler處理多個(gè)類型。為了這個(gè)目的,可以增加一個(gè)接受一個(gè)類型作為構(gòu)造方法的參數(shù),實(shí)際創(chuàng)建TypeHandler的時(shí)候給他傳遞真正的類型。//GenericTypeHandler.javapublicclassGenericTypeHandler<EextendsMyObject>extendsBaseTypeHandler<E>{privateClass<E>type;publicGenericTypeHandler(Class<E>type){if(type==null)thrownewIllegalArgumentException("Typeargumentcannotbenull”);this.type=type;}...EnumTypeHandler和EnumOrdinalTypeHandler就是通用的類型處理器。會(huì)在后面的章節(jié)學(xué)習(xí)他們。.3.1.5處理枚舉如果要映射一個(gè)枚舉,你可以使用EnumTypeHandler或者EnumOrdinalTypeHandler.比如,我們來(lái)看,現(xiàn)在需要存儲(chǔ)數(shù)字的四舍五入模式。默認(rèn),MyBatis使用EnumTypeHandler轉(zhuǎn)換枚舉值到他們的名字。注意,EnumTypeHandler相對(duì)于其他轉(zhuǎn)換器,比較特殊,他不光是接受某一個(gè)類,而是任意的繼承于Enum的類型。盡管如此,我們可能不想存儲(chǔ)名字。數(shù)據(jù)庫(kù)管理員可能堅(jiān)持要用一個(gè)數(shù)字。那是很容易的:在配置文件中增加EnumOrdinalTypeHandler到typeHandlers元素下,現(xiàn)在每一個(gè)RoundingMode都會(huì)被映射成一個(gè)順序的數(shù)字。<!--mybatis-config.xml--><typeHandlers><typeHandlerhandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"javaType="java.lang.Enum”/></typeHandlers>但是如果想映射同一個(gè)Enum,有時(shí)到String,另一些時(shí)候用到integer,怎么處理呢?自動(dòng)映射器會(huì)自動(dòng)使用EnumOrdinalTypeHandler,所以如果想使用EnumTypeHandler,必須在sql上下文中明確設(shè)置類型轉(zhuǎn)換器。.(映射文件在下一章涉及,可以先跳過(guò)此段等以后再回頭看)<!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="org.apache.ibatis.submitted.rounding.Mapper"><resultMaptype="org.apache.ibatis.submitted.rounding.User"id="usermap"><idcolumn="id"property="id"/><resultcolumn="name"property="name"/><resultcolumn="funkyNumber"property="funkyNumber"/><resultcolumn="roundingMode"property="roundingMode"/></resultMap><selectid="getUser"resultMap="usermap">select*fromusers</select><insertid="insert">insertintousers(id,name,funkyNumber,roundingMode)values(#{id},#{name},#{funkyNumber},#{roundingMode})</insert><resultMaptype="org.apache.ibatis.submitted.rounding.User"id="usermap2"><idcolumn="id"property="id"/><resultcolumn="name"property="name"/><resultcolumn="funkyNumber"property="funkyNumber"/><resultcolumn="roundingMode"property="roundingMode"typeHandler="org.apache.ibatis.type.EnumTypeHandler”/></resultMap><selectid="getUser2"resultMap="usermap2">select*fromusers2</select><insertid="insert2">insertintousers2(id,name,funkyNumber,roundingMode)values(#{id},#{name},#{funkyNumber},#{roundingMode,typeHandler=org.apache.ibatis..type.EnumTypeHandler})</insert></mapper>注意,此處的結(jié)果類型強(qiáng)制使用resultMap而不是resultType.3.1.6objectFactory每次MyBatis創(chuàng)建一個(gè)新的結(jié)果對(duì)象,它會(huì)使用ObjectFactory(對(duì)象工廠)來(lái)做這個(gè)工作。默認(rèn)的ObjectFactory調(diào)用默認(rèn)的構(gòu)造方法實(shí)例了一個(gè)對(duì)象,或者-如果參數(shù)映射存在的話,用一個(gè)參數(shù)化的構(gòu)造方法,除此之外,基本上什么也沒有做??梢詣?chuàng)建自己的ObjectFactory改寫ObjectFactory默認(rèn)的行為.比如://ExampleObjectFactory.javapublicclassExampleObjectFactoryextendsDefaultObjectFactory{publicObjectcreate(Classtype){returnsuper.create(type);}publicObjectcreate(Classtype,List<Class>constructorArgTypes,List<Object>constructorArgs)returnsuper.create(type,constructorArgTypes,constructorArgs);}publicvoidsetProperties(Propertiesproperties){super.setProperties(properties);}public<T>booleanisCollection(Class<T>type){returnCollection.class.isAssignableFrom(type);}}<!--mybatis-config.xml--><objectFactorytype="org.mybatis.example.ExampleObjectFactory"><propertyname="someProperty"value="100"/></objectFactory>ObjectFactory接口非常簡(jiǎn)單,只包含兩個(gè)create方法,一個(gè)處理默認(rèn)的構(gòu)造方法,另一個(gè)處理有參數(shù)的構(gòu)造方法,最后setProperties方法可以用來(lái)配置ObjectFactory.定義在objectFactory內(nèi)的屬性會(huì)在ObjectFactory實(shí)例化后傳遞給setProperties方法。3.1.7pluginsMyBatis允許攔截映射的上下文的調(diào)用。.默認(rèn),MyBatis允許plug-ins攔截如下的方法調(diào)用:?Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)?ParameterHandler(getParameterObject,setParameters)?ResultSetHandler(handleResultSets,handleOutputParameters)?StatementHandler(prepare,parameterize,batch,update,query)這些方法的細(xì)節(jié)可以通過(guò)查看各個(gè)類的方法簽名獲得,并且各個(gè)版本的源代碼也是可以獲得的。你要明白你重寫的方法的行為,假設(shè)你不光只是監(jiān)控方法的執(zhí)行。如果嘗試修改或者重寫一個(gè)給定的方法,你可能破壞了MyBatis的核心。這些是底層的方法和對(duì)象,所以使用plug-ins務(wù)必小心。相比plug-ins的強(qiáng)大,使用非常容易。只需要實(shí)現(xiàn)攔截接口,一定要指定要攔截的方法簽名。//ExamplePlugin.java@Intercepts({@Signature(type=Executor.class,method="update",args={MappedStatement.class,Object.class})})publicclassExamplePluginimplementsInterceptor{publicObjectintercept(Invocationinvocation)throwsThrowable{returnceed();}publicObjectplugin(Objecttarget){returnPlugin.wrap(target,this);}publicvoidsetProperties(Propertiesproperties){}}<!--mybatis-config.xml--><plugins><plugininterceptor="org.mybatis.example.ExamplePlugin"><propertyname="someProperty"value="100"/></plugin></plugins>上面的plug-in會(huì)攔截Executor的”update”調(diào)用,那是一個(gè)內(nèi)部的對(duì)象,專為映射上下文的執(zhí)行服務(wù)的。小心,除了使用插件修改mybatis的行為,還可以通過(guò)重寫Configuration類來(lái)實(shí)現(xiàn)同樣的目的。只要簡(jiǎn)單的繼承Configuration,重寫任一方法,并把他作為sqlSessionFactoryBuilder.build(myConfig)方法的參數(shù)。再次提醒,這個(gè)可能對(duì)MyBatis的行為產(chǎn)生嚴(yán)重的影響,務(wù)必小心。3.1.8environmentsMyBatis可以通過(guò)很多環(huán)境參數(shù)來(lái)配置。這會(huì)幫助你的sql映射兼容不同的數(shù)據(jù)庫(kù),因?yàn)楦鞣N理由。比如,你可能在開發(fā),測(cè)試,產(chǎn)品環(huán)境下會(huì)有不同的數(shù)據(jù)庫(kù)配置。或者,你可能有多個(gè)數(shù)據(jù)庫(kù),使用相同的模式,你想他們使用同樣的sql映射。有很多這樣的案例。提醒你一個(gè)重要的事情:你可以配置多個(gè)環(huán)境,但是一個(gè)SqlSessionFactory對(duì)象只能使用一個(gè)。所以如果你想連接兩個(gè)數(shù)據(jù)庫(kù),必須創(chuàng)建兩個(gè)SqlSessionFactory對(duì)象,每個(gè)數(shù)據(jù)庫(kù)一個(gè);三個(gè)數(shù)據(jù)庫(kù),則需要三個(gè)對(duì)象,依次類推。非常好記:?一個(gè)SqlSessionFactory對(duì)象對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)為了指定確定的環(huán)境,需要傳一個(gè)可選的參數(shù)給SqlSessionFactoryBuilder。兩個(gè)接受環(huán)境的方法是:SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,environment);SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,environment,properties);如果environment參數(shù)被忽略,加載默認(rèn)的。如下:SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader);SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,properties);environments元素定了environment(環(huán)境)如何配置的<environmentsdefault="development"><environmentid="development"><transactionManagertype="JDBC"><propertyname="..."value="..."/></transactionManager><dataSourcetype="POOLED"><propertyname="driver"value="${driver}"/><propertyname="url"value="${url}"/><propertyname="username"value="${username}"/><propertyname="password"value="${password}"/></dataSource></environment></environments>核心的配置如下:Noticethekeysectionshere:?默認(rèn)的ID(比如default="development").?每一個(gè)environment的id(比如id="development").?TransactionManager配置(比如type="JDBC")?DataSource(數(shù)據(jù)源)配置(比如:type="POOLED")默認(rèn)的environment和environmentID是不言自明的。隨意明名,只要確保默認(rèn)的是其中一個(gè)就可以。transactionManagerMyBatis包含兩個(gè)TransactionManager(事務(wù)管理器)類型(i.e.type="[JDBC|MANAGED]"):?JDBC–這個(gè)配置簡(jiǎn)單的直接使用了jdbc的commit和rollback能力。它依賴于從數(shù)據(jù)源獲得的連接來(lái)管理事務(wù)范圍。?MANAGED–這個(gè)配置幾乎什么沒有做,從不提交,也不回滾。它讓容易管理事務(wù)的生命周期(比如:一個(gè)JEE應(yīng)用上下文)。默認(rèn),他會(huì)關(guān)閉連接。部分容器不期望這個(gè)特性,可以阻止它關(guān)閉連接,設(shè)置closeConnection屬性為false.比如:<transactionManagertype="MANAGED"><propertyname="closeConnection"value="false"/></transactionManager>注意如果在spring中使用MyBatis,沒有必要配置TransactionManager,因?yàn)閟pring會(huì)設(shè)置自己的管理器并覆蓋之前的設(shè)置。任一TransactionManager類型的配置都不需要屬性。盡管如此,他們都是類型別名,可以用全限定的實(shí)現(xiàn)TransactionFactory接口的類名來(lái)代替他。publicinterfaceTransactionFactory{voidsetProperties(Propertiesprops);TransactionnewTransaction(Connectionconn);TransactionnewTransaction(DataSourcedataSource,TransactionIsolationLevellevel}Xml中配置的屬性都會(huì)在實(shí)例化后被傳給setProperties()方法。你的實(shí)現(xiàn)仍然需要?jiǎng)?chuàng)建一個(gè)事務(wù)實(shí)現(xiàn),也是一個(gè)非常簡(jiǎn)單的接口:publicinterfaceTransaction{ConnectiongetConnection()throwsSQLException;voidcommit()throwsSQLException;voidrollback()throwsSQLException;voidclose()throwsSQLException;}使用這兩個(gè)接口,就可以完整的定制MyBatis處理事務(wù)的方式。dataSource(數(shù)據(jù)源)dataSource元素配置了標(biāo)準(zhǔn)的jdbc連接源。數(shù)據(jù)源接口.?多數(shù)的MyTabtis應(yīng)用配置了案例中的數(shù)據(jù)源。這是非必須的。意識(shí)到這個(gè),如果實(shí)現(xiàn)了延遲加載,這個(gè)dataSource是必須的。有內(nèi)置的數(shù)據(jù)源類型(比如:type="[UNPOOLED|POOLED|JNDI]"):UNPOOLED–這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)簡(jiǎn)單的打開連接,每次關(guān)閉被請(qǐng)求的時(shí)候,會(huì)有點(diǎn)慢,對(duì)于不需要立即獲得連接的應(yīng)用,這是個(gè)好主意。不同的數(shù)據(jù)庫(kù)性能表現(xiàn)差異很大,有時(shí)候池化是非常重要的,這個(gè)配置有點(diǎn)理想化。UNPOOLED數(shù)據(jù)源you個(gè)配置:?driver–jdbc驅(qū)動(dòng)類的全名(不是DataSource類,有的驅(qū)動(dòng)包含)?url–jdbc實(shí)例的URL?username–數(shù)據(jù)庫(kù)用戶名.?password–數(shù)據(jù)庫(kù)登錄密碼.?defaultTransactionIsolationLevel–默認(rèn)的連接事務(wù)隔離級(jí)別可選的,可以傳一個(gè)properties對(duì)象給數(shù)據(jù)庫(kù)驅(qū)動(dòng)。為此,要給properties加上driver.的前綴,比如:?driver.encoding=UTF8它通過(guò)DriverManager.getConnection(url,driverProperties)方法,把encoding屬性設(shè)置成UTF8。POOLED–這個(gè)jdbc的連接池實(shí)現(xiàn)避免了初始化連接以及創(chuàng)建新連接的認(rèn)證。對(duì)于高并發(fā)、快速響應(yīng)的web應(yīng)用,這是一個(gè)趨勢(shì)。POOLED數(shù)據(jù)源除了UNPOOLED擁有的屬性外,還有很多其他的配置屬性:?poolMaximumActiveConnections–任一時(shí)刻的活動(dòng)連接數(shù)(比如:在使用)默認(rèn):10?poolMaximumIdleConnections–任一時(shí)刻的空閑連接數(shù)。?poolMaximumCheckoutTime–這是一個(gè)連接在被強(qiáng)制返回前,被檢查的間隔時(shí)間。默認(rèn):20000毫秒?poolTimeToWait–這是一個(gè)底層的設(shè)置,給連接池一個(gè)機(jī)會(huì),打印日志并且重新獲得連接-假如那個(gè)連接使用時(shí)間過(guò)長(zhǎng)(避免池因?yàn)殄e(cuò)誤的設(shè)置導(dǎo)致的失?。DJ(rèn)20000毫秒(20秒)?poolPingQuery–PingQuery是發(fā)送到數(shù)據(jù)庫(kù)來(lái)驗(yàn)證連接可用并可接受請(qǐng)求,默認(rèn)是“NOPINGQUERYSET”(不設(shè)置ping查詢),會(huì)導(dǎo)致多數(shù)數(shù)據(jù)庫(kù)驅(qū)動(dòng)輸出得體的錯(cuò)誤信息并退出。?poolPingEnabled–是否允許pingquery.如果允許,必須設(shè)置poolPingQuery屬性,用一個(gè)合法的sql(選擇一個(gè)快速的)。默認(rèn):false.?poolPingConnectionsNotUsedFor–這個(gè)設(shè)置poolPingQuery的使用頻率。典型的,可以設(shè)置成數(shù)據(jù)庫(kù)連接的超時(shí)時(shí)間,避免不必要的連接驗(yàn)證(ping),默認(rèn)0(比如:所有的連接每次都ping:驗(yàn)證—當(dāng)然只在poolPingEnabled為true時(shí)有效)。JNDI–這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)為使用容器的連接而準(zhǔn)備,比如EJB或者應(yīng)用服務(wù)器,集中或者擴(kuò)展地配置了數(shù)據(jù)源,并通過(guò)JNDI上下文引用。這個(gè)數(shù)據(jù)源配置只需要兩個(gè)屬性:?initial_context–此屬性用在InitialContext上下文查找中(比如:initialContext.lookup(initial_context)),此屬性可選,如果忽略,InitialContext會(huì)直接查找data_source屬性。?data_source–這是找到DataSource的上下文路徑。它會(huì)被initial_context上下文查找獲得,或者如果initial_context沒有配置,直接使用InitialContext查找返回上下文直接查找。和其他的數(shù)據(jù)源類似,可以發(fā)送直接發(fā)送帶env前綴的屬性給InitialContext對(duì)象,比如?env.encoding=UTF8這回把encoding屬性設(shè)置UTF8并作為InitialContext的構(gòu)造參數(shù)。可以通過(guò)實(shí)現(xiàn)接口org.apache.ibatis.datasource.DataSourceFactory插入任何的第三方DataSource實(shí)現(xiàn):publicinterfaceDataSourceFactory{voidsetProperties(Propertiesprops);DataSourcegetDataSource();}org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory可以作為超類來(lái)構(gòu)建數(shù)據(jù)源適配器。比如如果需要插入c3p0:importorg.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;impor

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論