年比較新的用戶指南附j(luò)實(shí)例_第1頁
年比較新的用戶指南附j(luò)實(shí)例_第2頁
年比較新的用戶指南附j(luò)實(shí)例_第3頁
年比較新的用戶指南附j(luò)實(shí)例_第4頁
年比較新的用戶指南附j(luò)實(shí)例_第5頁
已閱讀5頁,還剩99頁未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

1、如何更好地使用本文檔如果您發(fā)現(xiàn)這個(gè)文檔存在任何不足,或者缺少了對(duì)某個(gè)特性的描述,最好的方式是先學(xué)習(xí)它,然后寫一份文檔。我們接受公眾撰寫的文檔,并通過下列上傳:n如果您的文檔寫的很棒,人們將會(huì)喜歡您并閱讀您的文檔!關(guān)于本文本文是MyBatis3 用戶指南中文版,為學(xué)習(xí)與研究從MyBatis-3-User-Guide翻譯而來,大家參考,最權(quán)威的應(yīng)以英文文檔為準(zhǔn)。如果發(fā)現(xiàn)翻譯有錯(cuò)誤,歡迎指正,請(qǐng)郵件到 lihui.luo。翻譯過程中,直接對(duì)英文版進(jìn)行了勘誤,或者添加了一些幫助理解的注釋。同時(shí),文檔最后也增加了幾節(jié)附錄的內(nèi)容,希望對(duì)學(xué)習(xí)MyBatis3有用。本文翻譯的內(nèi)容可任意、和使用。關(guān)于從本文檔代

2、碼的警告其實(shí),這不是一個(gè)什么法律警告,這僅僅是一個(gè)提示。現(xiàn)代文字處理器做了出色的工作,以非常優(yōu)美的方式使文本具有可讀性和具有良好格式化。然而,有時(shí)看起來是一個(gè)您完全想要的代碼示例,也往往完全毀于了特殊字符。 “引號(hào)”和連字符就是一個(gè)很好的例子,在文檔中看到引號(hào)和連字符,拷貝到IDE 或編輯器中卻不能很好工作,至少不是您期望的方式。因此,閱讀這份文檔指南并享受它,希望它有助于您。當(dāng)您拷貝的代碼來自本文檔代碼示例時(shí),最好找出附帶 的例子(包括單元測(cè)試等),或是 或郵件列表的例子。ContentsMyBatis 是什么?6準(zhǔn)備開始6從XML 中創(chuàng)建 SqlSessionFactory 實(shí)例6如何不使

3、用XML 來創(chuàng)建SqlSessionFactory7從SqlSessionFactory 獲取SqlSession7探索SQL 語句8關(guān)于命名空間9作用域和生命周期10Mapper XML 配置11properties 元素12Settings 元素13typeAliases 元素14typeHandlers 元素15objectFactory 元素16Plugins 元素17Environments 元素18事務(wù)管理器20dataSource 元素21Mappers 元素23SQLXML 文件23Select 元素24Insert、 update、 delete 元素25Sql 元素28 M

4、yBatis 3 - User Guide參數(shù)(Parameters)28resultMap 元素30高級(jí)結(jié)果. 32id, result 元素34支持的JDBC 類型35Constructor 元素35Association 元素36Collection 元素40Discriminator 元素42Cache 元素43cache-ref 元素46SQL)46動(dòng)態(tài)SQL(Dynamicif 元素46choose, when, otherwise 元素47trim, where, set 元素48Foreach 元素50Java API52目錄結(jié)構(gòu)52SqlSessions53SqlSessio

5、nFactoryBuilder53SqlSessionFactory55SqlSession57SelectBuilder64SqlBuilder67結(jié)束語694 MyBatis 3 - User Guide附錄 1 對(duì)象模型70附錄 2 創(chuàng)建數(shù)據(jù)庫(kù)73附錄 3 MyBatis 實(shí)例77簡(jiǎn)單select77update,delete,insert84自動(dòng)生成主鍵85處理NULL 值87使用接口類88使用Constructor 元素90使用Association 元素92使用Collection 元素100XML 中的特殊字符104附錄 45 MyBatis 3 - User GuideMyBa

6、tis 是什么?MyBatis 是一款一流的支持自定義SQL、過程和高級(jí)的持久化框架。MyBatis 幾乎消除了所有的JDBC 代碼,也基本不需要手工去設(shè)置參數(shù)和獲取檢索結(jié)果。MyBatis 能夠使用簡(jiǎn)單的XML 格式或者注解進(jìn)行來配置,能夠基本數(shù)據(jù)元素、Map 接口和POJOs(普通java 對(duì)象)到數(shù)據(jù)庫(kù)中的。準(zhǔn)備開始所有的MyBatis 應(yīng)用都以SqlSessionFactory 實(shí)例為中心。SqlSessionFactory 實(shí)例通過SqlSessionFactoryBuilder 來獲得,SqlSessionFactoryBuilder 能夠從XML 配置文件或者通過自定義編寫的配置

7、類(Configuration class),來創(chuàng)建一個(gè)SqlSessionFactory 實(shí)例。從 XML 中創(chuàng)建 SqlSessionFactory 實(shí)例從XML 中創(chuàng)建SqlSessionFactory 實(shí)例非常簡(jiǎn)單。建議您使用類路徑(classpathresource)來加載配置文件,但是您也能夠使用任何方式,包括文本文件路徑或者以file:/ 開頭URL 的方式。MyBatis 包括一個(gè)叫做Resources 的工具類(utility class),其中包含了一系列方法,使之能簡(jiǎn)單地從classpath 或其它地方加載配置文件。String resource = "org/

8、mybatis/example/Configuration.xml" Reader reader = Resources.getResourceAsReader(resource); sqlMapper = new SqlSessionFactoryBuilder().build(reader);XML 配置文件包含MyBatis 框架的設(shè)置,包括獲取數(shù)據(jù)庫(kù)連接的DataSource 實(shí)例,和包括決定事務(wù)作用域范圍和的事務(wù)管理等。您將能夠在后面的章節(jié)中找到詳細(xì)的XML 配置,在這里我們先展示一個(gè)簡(jiǎn)單的例子:<?xml version="1.0" encodi

9、ng="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//DTD Config 3.0/EN" "<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/>"><dataSourc

10、e<property<property<property<propertytype="POOLED">name="driver" value="$driver"/> name="url" value="$url"/> name="username" value="$username"/> name="password" value="$password"/><

11、;/dataSource></environment></environments>6 MyBatis 3 - User Guide<mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers></configuration>雖然XML 配置文件中還有很多其它的配置細(xì)節(jié),但是,上面的示例顯示了最重要的部分。注意XML 配置文件的頭部,會(huì)使用DTD 驗(yàn)證文檔來驗(yàn)證該XML 配置文件。body 部分的environm

12、ent元素,包含了事務(wù)管理和連接池配置。Mappers 元素指定了定義的XML 文件。配置文件-包含SQL 語句和如何不使用XML 來創(chuàng)建 SqlSessionFactory如果您喜歡直接通過java 代碼而不是通過XML 創(chuàng)建配置選項(xiàng),或者想創(chuàng)建您的配置生成器。MyBatis 提供了一個(gè)完整的配置類(Configuration class),它提供了與XML 文件相同的配置選項(xiàng)。TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment =new Environme

13、nt("development", transactionFactory, dataSource); Configuration configuration = new Configuration(environment); configuration.addMapper(BlogMapper.class);SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(configuration);請(qǐng)注意,這種方式下的配置添加一個(gè)類(mapper class)。類是包含SQL注解的Java

14、 類,從而避免了使用XML。但是,由于注解的一些局限性以及MyBatis的復(fù)雜性,XML 仍然是一些高級(jí)的功能(如嵌套連接,Nested Join Mapping)所必須的方式。基于這個(gè),如果存在XML 文件,MyBatis 自動(dòng)尋找并加載這個(gè)XML 文件。在這種情況下,BlogMapper.xml 將會(huì)被類路徑下名稱為BlogMapper.class 的類加載。詳述請(qǐng)見后面章節(jié)。從 SqlSessionFactory 獲取SqlSession現(xiàn)在您已經(jīng)創(chuàng)建了一個(gè)SqlSessionFactory(指上面的sqlMapper),正如它名字暗示那樣, 您可以通過它來創(chuàng)建一個(gè)SqlSession

15、實(shí)例。SqlSession 包含了所有執(zhí)行數(shù)據(jù)庫(kù)SQL 語句的方法。您能夠直接地通過SqlSession 實(shí)例執(zhí)行SQL 語句。例如:SqlSession session = sqlMapper.openSession(); try Blog blog = (Blog) session.selectOne( "org.mybatis.example.BlogMapper.selectBlog", 101); finally session.close();雖然這種方法很有效,MyBatis 以前版本的用戶對(duì)此也可能很熟悉,但現(xiàn)在有一個(gè)更簡(jiǎn)便的方式,那就是對(duì)給定的語句,使用一

16、個(gè)正確描述參數(shù)與返回值的接口(如BlogMapper.class),您就能更清晰地執(zhí)行類型安全的代碼,從而避免錯(cuò)誤和異常。 如:7 MyBatis 3 - User GuideSqlSession session = sqlSessionFactory.openSession(); try BlogMapper mapper = session.getMapper(BlogMapper.class); Blog blog = mapper.selectBlog(101); finally session.close();現(xiàn)在,讓我們一起探索它們究竟是如何執(zhí)行的。探索SQL 語句此時(shí),您可能想知

17、道SqlSession 或者器類(Mapper class)是怎樣執(zhí)行的。SQL語句是一個(gè)很大的主題,該主題將可能占據(jù)本文檔的大部分內(nèi)容。但是,為了運(yùn)行的,這里舉兩個(gè)例子。看到它是怎樣在上面的例子中,語句已經(jīng)在XML 配置文件或注解中定義。讓我們首先來看看XML 配置文件,所有MyBatis 提供的功能特性都可以通過基于XML配置文件配置來實(shí)現(xiàn)。如果您以前使用過MyBatis,對(duì)此就會(huì)很熟悉。但許多改進(jìn)使XML于XML配置的例子,滿足上述SqlSession 的調(diào)用。文件變得更簡(jiǎn)潔清晰。下面是一個(gè)基<?xml version="1.0" encoding="

18、UTF-8" ?><!DOCTYPE mapperPUBLIC "-//DTD Mapper 3.0/EN" ""><mapper namespace="org.mybatis.example.BlogMapper"><select id="selectBlog" parameterType="int" resultType="Blog"> select * from Blog where id = #

19、id</select></mapper>這個(gè)簡(jiǎn)單的例子看起來有不少的開銷,但它確實(shí)非常地輕巧,只要您喜歡,您可以在一個(gè)映射XML 文件中定義許多語句。雖然會(huì)有一些XML 頭部和DOCTYPE,但該文件余下的部分是自解(self explanatory,可理解為不加解釋就能明白)的。它定義了語句的名稱“selectBlog”,在命名空間“org.mybatis.example.BlogMapper”,您通過指定完整類名“org.mybatis.example.BlogMapper”來上面的例子:Blog blog = (Blog) session.selectOne( &

20、quot;org.mybatis.example.BlogMapper.selectBlog", 101);這非常類似java 中通過完整類名來調(diào)用方法,而這樣做是有的。這個(gè)名稱可以直接到一個(gè)具在相同命名空間的類,這個(gè)類有一個(gè)方法的名稱、參數(shù)及返回類型都與select語句相匹配。正如您前面看到的,這使您很簡(jiǎn)單地調(diào)用例子:類里的方法,下面是另外的一個(gè)8 MyBatis 3 - User GuideBlogMapper mapper = session.getMapper(BlogMapper.class); Blog blog = mapper.selectBlog(101);第二種方

21、法有很多好處。第一,它不依賴于字符串,所以更安全。第二,如果您的IDE 有自動(dòng)完能,您可以利用這功能很快導(dǎo)航到您的SQL 語句。第三,您不需要關(guān)注返回類型,不需要進(jìn)行強(qiáng)制轉(zhuǎn)換,因?yàn)槭褂肂logMapper接口已經(jīng)限定了返回類型,它會(huì)安全地返回。關(guān)于命名空間對(duì)類還有一個(gè)更好的方法,就像前面的BlogMapper。它們的語句不需要完全在XML中配置。相反,它們可以使用Java 注解。例如上面的XML 配置可以替換為:package org.mybatis.example; public interface BlogMapper Select("SELECT * FROM blog WHE

22、RE id = #id") Blog selectBlog(int id);對(duì)簡(jiǎn)單的語句,使用注解可以顯得非常地清晰。但是java 注解本身的局限難于應(yīng)付更復(fù)雜的語句。如果您準(zhǔn)備要做某些復(fù)雜的事情,最好使用XML 文件來配置語句。9 命名空間:在以前的版本中是可選的、復(fù)雜的且沒多大用處。但在這個(gè)版本中,命名空間是 必須的,并且不僅僅是簡(jiǎn)單地使用完整類名來區(qū)分語句。正如您看到的那樣,命名空間能夠進(jìn)行接口綁定,即使您認(rèn)為現(xiàn)在 使用到它,但您應(yīng)該按照這些準(zhǔn)則來做。一旦使用了命名空間并且放入適當(dāng)?shù)?java 包命名空間中將會(huì)使您的代碼清晰,并提高M(jìn)yBatis 的長(zhǎng)期可用性。 名稱: 為了減

23、少大量地輸入, MyBatis 對(duì)所有的配置元素,包括statements、result maps、 caches 等使用下面的名稱規(guī)則:· 完整類名 :(例如: “com.mypackage.MyMapper.selectAllThings”)可用來直接查找并使用。· 短名稱: (例如: “selectAllThings”)可用來明確的實(shí)體對(duì)象。但是,如果出現(xiàn)有兩個(gè)或(例如“com.foo.selectAllThings 和com.bar.selectAllThings”)實(shí)體對(duì)象,您將收到一個(gè)錯(cuò)誤報(bào)告(短名稱含糊不清),因此,這時(shí)就必須使用完整類名。 MyBatis 3

24、 - User Guide這將由您和您的項(xiàng)目小組來確定哪種方式是適合的,以一致的方式來定義語句是非常重要的。也就是說,您被限于僅用式。您能夠非常容易地從基于注解的語句移植到XML 配置文件中,反之亦然。作用域和生命周期理解到目前為止所討論的類的作用域和生命周期是非常重要的。如果使用不當(dāng)可導(dǎo)致嚴(yán)重的并發(fā)性問題。SqlSessionFactoryBuilder這個(gè)類可以在任何時(shí)候被實(shí)例化、使用和銷毀。一旦您創(chuàng)造了SqlSessionFactory 就不需要再保留它了。所以SqlSessionFactoryBuilder 實(shí)例的最好的作用域是方法體內(nèi)(即一個(gè)本地方法變量)。您能重用SqlSessio

25、nFactoryBuilder 創(chuàng)建多個(gè)SqlSessionFactory 實(shí)例,但最好不要把時(shí)間、放在XML 文件上,而是要從中出來做最重要事情。SqlSessionFactory一旦創(chuàng)建,SqlSessionFactory 將會(huì)存在于您的應(yīng)用程序整個(gè)運(yùn)行生命周期中。很少或根本沒有理由去銷毀它或重新創(chuàng)建它。最佳實(shí)踐是不要在一個(gè)應(yīng)用中多次創(chuàng)建SqlSessionFactory。這樣做會(huì)被視為“沒品味”。所是SqlSessionFactory 最好的作用域范圍是一個(gè)應(yīng)用的生命周期范圍。這可以由多種方式來實(shí)現(xiàn),最簡(jiǎn)單的方式是使用Singleton 模式或靜態(tài)Singleton 模式。但這不是被廣泛

26、接受的最佳做法,相反,您可能更愿意使用像Guice 或Spring 的依賴注入方式。這些框架您創(chuàng)造一個(gè)管理器,用于管理SqlSessionFactory 的生命周期。SqlSession每個(gè)線程都有一個(gè)SqlSession 實(shí)例,SqlSession 實(shí)例是不被共享的,并且不是線程安全的。因此最好的作用域是request 或者method。決不要用一個(gè)靜態(tài)字段或者一個(gè)類的實(shí)例字段來保存SqlSession 實(shí)例來保存SqlSession 的。也不要用任何一個(gè)管理作用域,如Servlet 框架中的HttpSession,。如果您正在用一個(gè)WEB 框架,可以把SqlSession 的作用域看作類似

27、于HTTP 的請(qǐng)求范圍。也就是說,在收到一個(gè)HTTP 請(qǐng)求,您可以打開一個(gè)SqlSession,當(dāng)您把response 返回時(shí),就可以把SqlSession 關(guān)閉。關(guān)閉會(huì)話是非常重要的,您應(yīng)該要確保會(huì)話在一個(gè)finally 塊中被關(guān)閉。SqlSession session = sqlSessionFactory.openSession(); try / do work finally session.close();10 MyBatis 3 - User Guide在您的代碼里都使用這一模式將保證所有的數(shù)據(jù)庫(kù)被正確地關(guān)閉(假如您沒有把您的數(shù)據(jù)庫(kù)連接傳遞給MyBatis 管理,這就對(duì)MyBati

28、s 表明您希望管理連接)。Mapper 實(shí)例Mappers 是創(chuàng)建來綁定語句的接口,該Mapper 實(shí)例是從SqlSession 得到的。因此,所有mapper 實(shí)例的作用域跟創(chuàng)建它的SqlSession 一樣。但是,mapper 實(shí)例最好的作用域是method,也就是它們應(yīng)該在方法內(nèi)被調(diào)用,使用完即被銷毀。并且mapper 實(shí)例不用顯式地被關(guān)閉。雖然把mapper 實(shí)例保持在一個(gè)request 范圍(與SqlSession 相似)產(chǎn)生太大的問題,但是您可能會(huì)發(fā)現(xiàn),在這個(gè)層次上管理太多一個(gè)方法內(nèi)。下面的例子演示了這種做法。可能會(huì)失控。保持簡(jiǎn)單,就是讓Mappers 保持在SqlSession

29、session = sqlSessionFactory.openSession(); try BlogMapper mapper = session.getMapper(BlogMapper.class);/ do work finally session.close();Mapper XML 配置MyBatis 的XML 配置文件包含了設(shè)置和影響MyBatis 行為的屬性。XML 配置文件的層次結(jié)構(gòu)如下:·configurationopropertiesosettingsotypeAliasestypeHandlersooobjectFactoryopluginsoenvironm

30、entsenvironment·transactionManager·dataSource11 MyBatis 3 - User Guideo mappersproperties 元素它們都是外部化,可替代的屬性。可以配置在一個(gè)典型的Java 屬性文件中,或者通過properties 元素的子元素進(jìn)行配置。例如:<properties<property<propertyresource="org/mybatis/example/perties"> name="username" value=

31、"dev_user"/> name="password" value="F2Fa3!33TYyg"/></properties></properties>在整個(gè)配置文件中,這些屬性能夠被可動(dòng)態(tài)替換(即使用占位符)的屬性值,例如:<dataSource<property<property<property<propertytype="POOLED">name="driver" value="$driver"

32、/> name="url" value="$url"/> name="username" value="$username"/> name="password" value="$password"/></dataSource>示例中的username 和password 將會(huì)被替換為配置在properties 元素中的相應(yīng)值。driver url 屬性則會(huì)被perties 文件中的相應(yīng)值替換。這里提供了大量的配置選項(xiàng)。這

33、些屬性也可以傳遞給sqlSessionFactoryBuilder.build()方法。例如:和SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, props);/ . or .SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, props);如果一個(gè)屬性存在于多個(gè)地方,MyBatis 將使用下面的順序加載:·首先讀入properties 元素主體中指定的屬性。·然后會(huì)加載類路徑或者pr

34、operties 元素中指定的url 的經(jīng)讀入的重復(fù)屬性。文件屬性。它會(huì)覆蓋前面已·通過方法參數(shù)來傳遞的屬性將最后(即通過sqlSessionFactoryBuilder.build),同樣也會(huì)覆蓋從properties 元素指定的和resource/url 指定的重復(fù)屬性。因此最優(yōu)先的屬性是通過方法參數(shù)來傳遞的屬性,然后是通過resource/url 配置的屬性,最后是在MyBatis 的Mapper 配置文件中,properties 元素主體中指定的屬性。12 MyBatis 3 - User GuideSettings 元素Setting 元素下是些非常重要的設(shè)置選項(xiàng),用于設(shè)置

35、和改變MyBatis 運(yùn)行中的行為。下面的表格列出了Setting 元素支持的屬性、默認(rèn)值及其功能。一個(gè)Settings 元素完整的配置例子如下:<settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="true"/>13設(shè)置選項(xiàng)描述可用值默認(rèn)值cacheEnabled全局性地啟用或禁用所有在mapper 配置文件中配置的緩存。true | fals

36、etruelazyLoadingEnabled全局性地啟用或禁用延遲加載。當(dāng)禁用時(shí),所有關(guān)聯(lián)的配置都會(huì)立即加載。true | falsetrueaggressiveLazyLoading當(dāng)啟用后,一個(gè)有延遲加載屬性的對(duì)象的任何一個(gè)延遲屬性被加載時(shí),該對(duì)象的所有的屬性都會(huì)被加載。否則,所有屬性都是按需加載。true | falsetruemultipleResultSetsEnabled或從單一的語句返回多個(gè)結(jié)果集(需要驅(qū)動(dòng)程序兼容)。true | falsetrueuseColumnLabel使用列的而不是列的名稱。在這方面,不同的驅(qū)動(dòng)程序可能有不同的實(shí) 現(xiàn)。參考驅(qū)動(dòng)程序的文檔或者進(jìn)試來確定您

37、所使用的驅(qū)動(dòng)程的行為true | falsetrueuseGeneratedKeysJDBC 自動(dòng)生成主鍵。需要驅(qū)動(dòng)程序兼容。如果設(shè)置為true 則會(huì)強(qiáng)行自動(dòng)生成主鍵,然而有些則 自動(dòng)生成主鍵(驅(qū)動(dòng)程序不兼容),但依舊會(huì)工作(如Derby)。true | falseFalseautoMappingBehavior指定MyBatis 是否以及如何自動(dòng)將列映射到字段/屬性。PARTIAL: 只是自動(dòng)簡(jiǎn)單、非嵌套的結(jié)果集。FULL: 將會(huì)自動(dòng)任何復(fù)雜的(嵌套或非嵌套)的結(jié)果集。NONE, PARTIAL, FULLPARTIALdefaultExecutorType配置默認(rèn)的執(zhí)行器(executor

38、)。SIMPLE :簡(jiǎn)單的執(zhí)行器。REUSE :重用prepared statements 的執(zhí)行器。BATCH:重用statements 并且進(jìn)行批量更新的執(zhí)行器。SIMPLE REUSE BATCHSIMPLEdefaultStatementTimeout設(shè)置數(shù)據(jù)庫(kù)超時(shí)時(shí)間。任何正整數(shù)Not Set (null) MyBatis 3 - User Guide<setting<setting<setting<setting<setting<settingname="multipleResultSetsEnabled" value=&qu

39、ot;true"/> name="useColumnLabel" value="true"/> name="useGeneratedKeys" value="false"/> name="enhancementEnabled" value="false"/> name="defaultExecutorType" value="SIMPLE"/> name="defaultStatemen

40、tTimeout" value="25000"/></settings>typeAliases 元素別名是一個(gè)較短的Java 類型的名稱。這只是與XML 配置文件相關(guān)聯(lián),減少輸入多余的完整類名。例如:<typeAliases><typeAlias<typeAlias<typeAlias<typeAlias<typeAlias<typeAliasalias="Author" type="domain.blog.Author"/> alias="B

41、log" type="domain.blog.Blog"/> alias="Comment" type="domain.blog.Comment"/> alias="Post" type="domain.blog.Post"/> alias="Section" type="domain.blog.Section"/> alias="Tag" type="domain.blog.Tag"

42、;/></typeAliases>在這個(gè)配置中,您就可以在想要使用"domain.blog.Blog"的地方使用別名“Blog”了。對(duì)常用的java 類型,已經(jīng)內(nèi)置了一些別名支持。這些別名都是不區(qū)分大小寫的。注意java的基本數(shù)據(jù)類型,它們進(jìn)行了特別處理,加了“_”前綴。14別名對(duì)應(yīng)的java 類型_bytebyte_longlong_shortshort_intint_integerint_doubledouble_floatfloat_booleanbooleanstringStringByteByteLongLongshortShortIntInte

43、gerintegerIntegerdoubleDoubleFloatFloatbooleanBooleanDateDatedecimalBigDecimal MyBatis 3 - User GuidetypeHandlers 元素每當(dāng)MyBatis 設(shè)置參數(shù)到PreparedStatement 或者從ResultSet 結(jié)果集中取得值時(shí),就會(huì)使用TypeHandler 來處理數(shù)據(jù)庫(kù)類型與java 類型之間轉(zhuǎn)換。下表描述了默認(rèn)的TypeHandlers。15Type HandlerJava TypesJDBC TypesBooleanTypeHandlerBoolean, boolean任何兼

44、容的 BOOLEANByteTypeHandlerByte, byte任何兼容的NUMERIC 或BYTEShortTypeHandlerShort, short任何兼容的NUMERIC 或 SHORT INTEGERIntegerTypeHandlerInteger, int任何兼容的NUMERIC 或 INTEGERLongTypeHandlerLong, long任何兼容的NUMERIC 或 LONG INTEGERFloatTypeHandlerFloat, float任何兼容的NUMERIC 或 FLOATDoubleTypeHandlerDouble, double任何兼容的NUM

45、ERIC 或 DOUBLEBigDecimalTypeHandlerBigDecimal任何兼容的NUMERIC 或 DECIMALStringTypeHandlerStringCHAR, VARCHARClobTypeHandlerStringCLOB, LONGVARCHARNStringTypeHandlerStringNVARCHAR, NCHARNClobTypeHandlerStringNCLOBByteArrayTypeHandlerbyte任何兼容的byte stream typeBlobTypeHandlerbyteBLOB, LONGVARBINARYDateTypeHan

46、dlerDate (java.util)TIMESTAMPDateOnlyTypeHandlerDate (java.util)DATETimeOnlyTypeHandlerDate (java.util)TIMESqlTimestampTypeHandlerTimestamp (java.sql)TIMESTAMPSqlDateTypeHadlerDate (java.sql)DATESqlTimeTypeHandlerTime (java.sql)TIMEObjectTypeHandlerAnyOTHER, or unspecifiedEnumTypeHandlerEnumeration

47、TypeVARCHAR 任何與string 兼容的類型,儲(chǔ)存的是編碼而不是索引。bigdecimalBigDecimalobjectObjectMapMaphashmapHashMapListListarraylistArrayListcollectionCollectioniteratorIterator MyBatis 3 - User Guide您能夠重寫類型處理器(type handlers),或者創(chuàng)建您的類型處理器去處理沒有被支持的或非標(biāo)準(zhǔn)的類型。要做到這一點(diǎn),只要實(shí)現(xiàn)TypeHandler 接口(org.mybatis.type),并且將您的TypeHandler 類到j(luò)ava 類

48、型和可選的JDBC 類型即可。例如:/ ExampleTypeHandler.javapublic class ExampleTypeHandler implements TypeHandler public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType throws SQLException ps.setString(i, (String) parameter);public Object getResult(ResultSet rs, String columnName) throws S

49、QLException return rs.getString(columnName);public Object getResult(CallableStatement cs, int columnIndex) throws SQLException return cs.getString(columnIndex);jdbcType)/ MapperConfig.xml<typeHandlers><typeHandler javaType="String" jdbcType="VARCHAR" handler="org.my

50、batis.example.ExampleTypeHandler"/></typeHandlers>使用上面的TypeHandler 將會(huì)重寫已經(jīng)存在的用來處理java 的String 屬性、VARCHAR 參數(shù)和結(jié)果集的類型處理器。注意,MyBatis 并通過數(shù)據(jù)庫(kù)的元數(shù)據(jù)來確認(rèn)類型,所以您必須指定它的一個(gè)類型處理器,用于將VARCHAR 字段的參數(shù)和結(jié)果到正確的類型上。這是因?yàn)镸yBatis 在語句的執(zhí)行之前都不知道它要處理的數(shù)據(jù)類型是什么。objectFactory 元素MyBatis 每次創(chuàng)建一個(gè)結(jié)果對(duì)象實(shí)例都會(huì)使用ObjectFactory 實(shí)例。使用默認(rèn)

51、的ObjectFactory 與使用默認(rèn)的構(gòu)造函數(shù)(或含參數(shù)的構(gòu)造函數(shù))來實(shí)例化目標(biāo)類沒什么差別。如果您想重寫ObjectFactory 來改變其默認(rèn)行為,那您能通過創(chuàng)造您到。看下面的例子:的ObjectFactory 來做/ ExampleObjectFactory.javapublic class ExampleObjectFactory extends DefaultObjectFactory public Object create(Class type) return super.create(type);public Object create(16 MyBatis 3 - Use

52、r GuideClass type,List<Class> constructorArgTypes, List<Object> constructorArgs) return super.create(type, constructorArgTypes, constructorArgs);public void setProperties(Properties properties) super.setProperties(properties);/ MapperConfig.xml<objectFactory type="org.mybatis.exa

53、mple.ExampleObjectFactory"><property name="someProperty" value="100"/></objectFactory>ObjectFactory 接口非常簡(jiǎn)單,它包含兩個(gè)create 的方法,一個(gè)是默認(rèn)構(gòu)造器,還有一個(gè)是含參數(shù)的構(gòu)造器。最后的setProperties 方法用來配置ObjectFactory。在初始化您的ObjectFactory 實(shí)例之后,定義在objectFactory 元素主體中的屬性會(huì)以參數(shù)的形式傳遞給setProperties 方法。P

54、lugins 元素MyBatis您在語句執(zhí)行的某些點(diǎn)方法調(diào)用。默認(rèn)情況下,MyBatis插件(plug-ins)下面的方法:·Executor(update, query, flushStatements, commit, rollback, getTransaction, close,isClosed)·ParameterHandler(getParameterObject, setParameters)·ResultSetHandler(handleResultSets, handleOutputParameters)·StatementHandle

55、r(prepare, parameterize, batch, update, query)通過尋找完整的方法特征能夠發(fā)現(xiàn)這些類方法的細(xì)節(jié),以及在每個(gè)MyBatis 發(fā)布版本中的源代碼中找到。假如您要做的不僅僅是監(jiān)視方法的調(diào)用情況,您就應(yīng)該清楚您將重寫的方法的行為動(dòng)作。如果您試圖修改或者重寫給定的方法,您很可能會(huì)改變MyBatis 的行為。這些都是比較底層的類和方法,所以要使用插件。/ ExamplePlugin.java Intercepts(Signature(type= Executor.class, method = "update",17 MyBatis 3 -

56、User Guideargs = MappedStatement.class,Object.class) public class ExamplePlugin implements Interceptor public Object intercept(Invocation invocation) throws Throwable return ceed();public Object plugin(Object target) return Plugin.wrap(target, this);public void setProperties(Properties

57、 properties) / MapperConfig.xml<plugins><plugin interceptor="org.mybatis.example.ExamplePlugin"><property name="someProperty" value="100"/></plugin></plugins>上面定義的插件將會(huì)所有對(duì)Executor 實(shí)例update 方法的調(diào)用。Executor 實(shí)例是一個(gè)負(fù)責(zé)底層語句執(zhí)行的內(nèi)部對(duì)象。重寫配置類(Configuration Class)Environments 元素MyBatis 能夠配置多套運(yùn)行環(huán)境,這有助于將您的SQL到多個(gè)數(shù)據(jù)庫(kù)上。例如,在您的開發(fā)、測(cè)試、生產(chǎn)環(huán)境中,您可能有不同的配置。或者您可能有多個(gè)共享同一schema 的生產(chǎn)用數(shù)據(jù)庫(kù),或者您想將相同的SQL應(yīng)用到兩個(gè)數(shù)據(jù)庫(kù)等等許多用例。但是請(qǐng)記住:雖然您可以配置多個(gè)運(yùn)行環(huán)境,但是每個(gè)SqlSessionFactory 實(shí)例只能選擇一個(gè)運(yùn)行環(huán)境。因此,如果您想連接兩個(gè)數(shù)據(jù)庫(kù),就需要?jiǎng)?chuàng)建兩個(gè)SqlSessionFactory 實(shí)例,一個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)SqlSessionFactory 實(shí)例。如果是三個(gè)數(shù)據(jù)庫(kù),那

溫馨提示

  • 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. 人人文庫(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)論