mybatis多表查詢相關_第1頁
mybatis多表查詢相關_第2頁
mybatis多表查詢相關_第3頁
mybatis多表查詢相關_第4頁
mybatis多表查詢相關_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

classA(privateStringAid;privateStringAname;getter..setter..}classB(privateStringBid;privateStringBname;privateAa;getter..setter..}查詢的sql是selecta.id,,b.id,froma,bwherea.id=b.id請指教這個具體怎么寫,實了很多種方法,都沒有辦法成功<typeAliasalias="b"type="B”/><resultMapid="getBResult"class="b"><resultproperty="bid"column="id”/><resultproperty="bname"column="name”/><resultproperty="aid"column="a.id”/><resultproperty="aname"column=""/></resultMap><selectid="getB"resultMap="getBResult">selecta.id,,b.id,froma,bwherea.id=b.id</select><typeAliasalias="b"type="B”/><resultMapid="getBResult"class="b"><resultproperty="bid"column="id”/><resultproperty="bname"column="name”/><resultproperty="aid"column="a.id”/><resultproperty="aname"column=""/></resultMap><selectid="getB"resultMap="getBResult">selecta.id,,b.id,froma,bwherea.id=b.id</select><typeAliasalias="b"type="B”/><resultMapid="getBResult"class="b"><resultproperty="bid"column="id”/><resultproperty="bname"column="name”/><resultproperty="aid"column="a.id”/><resultproperty="aname"column=""/></resultMap><selectid="getB"resultMap="getBResult">selecta.id,,b.id,froma,bwherea.id=b.id</select>從iBatis到MyBatis,你準備好了嗎?對于從事JavaEE的開發人員來說,iBatis是一個再熟悉不過的持久層框架了,在Hibernate、JPA這樣的一站式對象/關系映射(O/RMapping)解決方案盛行之前,iBaits基本是持久層框架的不二選擇。即使在持久層框架層出不窮的今天,iBatis憑借著易學易用、輕巧靈活等特點,也仍然擁有一席之地。尤其對于擅長SQL的開發人員來說,iBatis對SQL和存儲過程的直接支持能夠讓他們在獲得iBatis封裝優勢的同時而不喪失SQL調優的手段,這是Hibernate/JPA所無法比擬的。具體而言,使用iBatis框架的主要優勢主要體現在如下幾個方面:首先,iBatis封裝了絕大多數的JDBC樣板代碼,使得開發者只需關注SQL本身,而不需要花費精力去處理例如注冊驅動,創建Connection,以及確保關閉Connection這樣繁雜的代碼。其次,iBatis可以算是在所有主流的持久層框架中學習成本最低,最容易上手和掌握的框架。雖說其他持久層框架也號稱門檻低,容易上手,但是等到你真正使用時會發現,要想掌握并用好它是一件非常困難的事。在工作中我需要經常參與面試,我曾聽到過很多位應聘者描述,他們所在的項目在技術選型時選擇Hibernate,后來發現難以駕馭,不得不將代碼用JDBC或者iBatis改寫。iBatis自從在Apache軟件基金會網站上發布至今,和他的明星兄弟們(HttpServer,Tomcat,Struts,Maven,Ant等等)一起接受者萬千Java開發者的敬仰。然而在今年六月中旬,幾乎是發布3.0版本的同時,iBatis主頁上的一則“ApacheiBATIShasbeenretire聲”明在社區引起了一陣不小的波瀾。在Apache寄居六年之后,iBatis將代碼托管到GoogleCode。在聲明中給出的主要理由是,和Apache相比,GoogleCode更有利于開發者的協同工作,也更能適應快速發布。于此同時,iBatis更名為MyBatis。從iBatis到MyBatis,不只是名稱上的變化,MyBatis提供了更為強大的功能,同時并沒有損失其易用性,相反,在很多地方都借助于JDK的泛型和注解特性進行了簡化。iBatis確實該退休了,因為一個更為出色的繼任者經過10個Beta版本的蛻變已然出現在我們的面前。本文將主要針對MyBatis和iBatis的變化之處進行討論,以便于讀者順利從iBatis向MyBatis過渡。由一個MyBatis 示例開始如果讀者接觸過一些常用的JavaEE框架,應該都知道這些框架需要提供一個全局配置文件,用于指定程序正常運行所需的設置和參數信息。而針對常用的持久層框架而言(Hibernate.JPA、iBatis等),則通常需要配置兩類文件:一類用于指定數據源、事務屬性以及其他一些參數配置信息(通常是一個獨立的文件,可以稱之為全局配置文件);另一類則用于指定數據庫表和程序之間的映射信息(可能不止一個文件,我們稱之為映射文件)。MyBatis也不例外,雖然其中的一部分可以通過注解的形式進行,但是這兩部分內容本身仍是必不可少的。根據iBatis的習慣,我們通常把全局配置文件命名為sqlMapConfig.xml,文件名本身并沒有要求,在MyBatis中,也經常會將該文件命名為Configuration.xml(讀完全文后讀者也許會發現,在iBatis中經常出現的“sqlMap”在MyBatis中被逐漸淡化了,除了此處,還比如iBatis配置文件的根元素為<sqlMapConfig>,指定映射文件的元素為<sqlMap>,以及SqlMapClient等等,這個變化正說明,iBatis僅是以SQL映射為核心的框架,而在MyBatis中多以Mapper、Session.Configuration等其他常用ORM框架中的名字代替,體現的無非是兩個方面:首先是為了減少開發者在切換框架所帶來的學習成本;其次,MyBatis充分吸收了其他ORM框架好的實踐,MyBatis現在已不僅僅是一個SQL映射框架了)。在全局配置文件中可以配置的信息主要包括如下幾個方面:?properties---用于提供一系列的鍵值對組成的屬性信息,該屬性信息可以用于整個配置文件中。settings---用于設置MyBatis的運行時方式,比如是否啟用延遲加載等。typeAliases---為Java類型指定別名,可以在XML文件中用別名取代Java類的全限定名。typeHandlers---在MyBatis通過PreparedStatement為占位符設置值,或者從ResultSet取出值時,特定類型的類型處理器會被執行。objectFactory---MyBatis通過ObjectFactory來創建結果對象??梢酝ㄟ^繼承DefaultObjectFactory來實現自己的ObjectFactory類。plugins---用于配置一系列攔截器,用于攔截映射SQL語句的執行??梢酝ㄟ^實現Interceptor接口來實現自己的攔截器。environments---用于配置數據源信息,包括連接池、事務屬性等。mappers---程序中所有用到的SQL映射文件都在這里列出,這些映射SQL都被MyBatis管理。上面提及的大多數元素都不是必需的,通常MyBatis會為沒有顯式設置的元素提供缺省值。一個簡單的全局配置文件示例如下:清單1.簡單的全局配置文件示例<?xmlversion="1.0"encoding="UTF-8"?><!--iBatis和MyBatis的全局配置文件使用不同的口^約束,在將應用由iBatis升級至MyBatis時需要注意(兩者的映射文件。^約束也不相同)--><!DOCTYPEconfigurationPUBLIC"-////DTDConfig3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><!--配置數據源相關的信息--><environmentsdefault="demo">

<environmentid="demo"><transactionManagertype="JDBC”/><dataSourcetype="POOLED"><propertyname="driver"value=.../><propertyname="url"value=.../><propertyname="username"value="root"/><propertyname="password"value="root"/></dataSource></environment></environments><!--列出映射文件--><mappers><mapperresource="footmark/mybatis/demo/UserInfoMapper.xml"/></mappers></configuration>有了這些信息,MyBatis便能夠和數據庫建立連接,并應用給定的連接池信息和事務屬性。MyBatis封裝了這些操作,最終暴露一個SqlSessionFactory實例供開發者使用,從名字可以看出來,這是一個創建SqlSession的工廠類,通過SqlSession實例,開發者能夠直接進行業務邏輯的操作,而不需要重復編寫JDBC相關的樣板代碼。根據全局配置文件生成SqlSession的代碼如下:Readerreader=Resources.getResourceAsReader("Configuration.xml");SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(reader);

SqlSessionsqlSession=sqlSessionFactory.openSession();可以把上面的三行代碼看做是MyBatis創建SqlSession的樣板代碼。其中第一行代碼在類路徑上加載配置文件,Resources是MyBatis提供的一個工具類,它用于簡化資源文件的加載,它可以訪問各種路徑的文件,不過最常用的還是示例中這種基于類路徑的表示方式。如果讀者對Hibernate有所了解,一定會發現MyBatis不論是使用風格還是類名都和Hibernate非常相像,筆者曾今多次在國內外Java社區看到有人說MyBatis在向Hibernate/JPA靠攏。暫且不論這是否屬實,持久化技術在經過一番蓬勃的競爭和發展,最終在社區形成統一的認識并被廣泛接受,這對開發者而言未必不是一件好事,MyBatis在這一點上只是向事實上的標準靠近了一步。在完成全局配置文件,并通過MyBatis獲得SqlSession對象之后,便可以執行數據訪問操作了。對于iBatis/MyBatis而言,要執行的操作其實就是在映射文件中配置的SQL語句。兩者的配置基本相同,如下所示:清單2.在映射文件中配置SQL語句<?xmlversion="1.0"encoding="UTF-8”?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="mybatis.demo.UserInfoMapper"><selectid="selectUser"parameterType="int"resultType="mybatis.demo.UserInfo">select*fromUserInfowhereuserid=#{userid}</select></mapper>在iBatis中,namespace不是必需的,且它的存在沒有實際的意義。在MyBatis中,namespace終于派上用場了,它使得映射文件與接口綁定變得非常自然。關于接口綁定,后面會有篇幅專門描述。使用SqlSession執行SQL的方式如下:清單3.使用SqlSession執行映射文件中配置的SQL語句tryUserInfouserinfo=(UserInfo)sqlSession.selectOne("mybatis.demo.UserInfoMapper.getUser",2);System.out.println(userinfo);}finally需要注意的是,SqlSession的使用必需遵守上面的格式,即在finally塊中將其關閉。以保證資源得到釋放,防止出現內存泄露!以上就是一個簡單而完整的MyBatis程序。其中涉及了全局配置文件,映射文件,構建SqlSession對象,執行數據訪問操作等四個步驟。下面將針對除構建SqlSession對象之外的三塊內容進行分解。MyBatis全局配置文件的改變MyBatis全局配置文件的各主要元素基本和iBatis相同,只是在用法和個別名稱上做了調整。元素的意義就不再描述,下面主要講述針對iBatis和MyBatis配置文件的主要區別之處。首先,兩個版本的DTD約束不同,MyBatis的DTD文件已經包含在發布包下的mybatis-3.0.x.jar包中。這直接影響到的是,iBatis配置文件的根元素是<sqlMapConfig>,而MyBatis使用的是〈configuration〉。其次,<settings>的用法發生了改變,之前的格式為:清單4.在iBatis中設置屬性的方式I <settingsprops1="value1"props2="value2”.../>要設置的屬性直接以鍵值對的形式作為<settings>的屬性。而在MyBatis中調整為略顯復雜但卻更有條理的方式:清單5.在MyBatis中設置屬性的方式<settings><settingname="props1"value="value1"/><settingname="props2"value="value2"/></settings>另外,之前配置事務管理器和數據源的方式如下:清單6.在iBatis中配置事務管理器和數據源的方式<transactionManagertype="JDBC”><dataSourcetype="SIMPLE"><propertyname="JDBC.Driver"value="$(driver}"/><!--其他數據源信息省略--></dataSource></transactionManager>在MyBatis中調整為如下的方式:清單7.在MyBatis中配置事務管理器和數據源的方式

<environmentsdefault="demo“><environmentid="demo”><transactionManagertype="JDBC”/><dataSourcetype="POOLED"><propertyname="JDBC.Driver"value="$(driver}"/><!--其他數據源信息省略--></dataSource></environment></environments>通過<environments>來進行數據源管理,主要是為了簡化在多套數據源配置之間的切換,比如開發和發布使用不同的配置。最后,在iBatis中指定映射文件的方式如下:清單8.在iBatis中指定映射文件的方式<sqlMapresource=.../><sqlMapresource=.../><sqlMapresource=.../>在MyBatis中調整為如下方式:清單9?在MyBatis中指定映射文件的方式<mappers><mapperresource=.../>

<mapperresource=.../></mappers>上面的這些調整,主要出發點其實并不是使得MyBatis功能更為強大,而是使配置更為合理,讓開發者更容易閱讀和理解。到目前為止,我們主要討論了XML形式的全局配置,其實這也不是唯一選擇,MyBatis還提供了通過代碼來進行配置的方式:清單10.在MyBatis中使用代碼進行配置DataSourceds 獲取一個DataSourceTransactionFactorytxFactory=newJdbcTransactionFactory();Environmentenv=newEnvironment("demo",txFactory,ds);Configurationcfg=newConfiguration(env);cfg.addMapper(UserInfoMapper.class);SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(cfg);結合前面的配置文件,很容易理解這段代碼的意思,故不再贅述。不過,需要注意的是Configuration的addMapper()方法,該方法的參數通常是一個接口,可以在接口里面定義若干方法,在方法上使用注解來指定映射的SQL語句。一個典型的接口定義以及對應的數據訪問方法如下:清單11.將映射的SQL語句與接口中的方法綁定//映射SQL綁定接口p……

@Select("select*fromuserinfowhereuserid=#{userid}'')publicUserInfogetUserInfo(intuserid);}〃接口綁定對應的數據訪問方法try{//UserInfouserinfo=(UserInfo)sqlSession.selectOne("mybatis.demo.UserInfoMapper.selectUser",2);UserInfoMapperuserinfoMapper=sqlSession.getMapper(UserInfoMapper.class);UserInfouserinfo=userinfoMapper.getUserInfo(1);System.out.println(userinfo);}finally{sqlSession.close();}MyBatis 映射文件的改變MyBatis針對映射文件進行格式調整的地方很多,但大部分僅僅只是名稱上的變化,現代的IDE都支持聯想功能,可以很方便的獲取到當前位置可以有哪些元素、哪些屬性等。所以這基本不會給開發者造成什么麻煩。針對映射文件,首先是一系列的屬性名稱的改變,這些僅僅是名稱的改變,用法和含義并沒有發生變化:

和全局配置文件一樣,由于DTD約束發生變化,根元素也由原來的<sqlMap>調整為<mapper>。<select>等元素的parameterclass屬性改為了parameterType屬性。<select>等元素的resultClasss屬性改為了resultType屬性。<parameterMap>等元素的class屬性改為了type屬性。<result>元素的columnindex屬性被移除了。嵌套參數由#value#改為了#{value}。<parameter>等元素的jdbcType屬性取值中,原來的"ORACLECURSOR"取值改為了現在的"CURSOR","NUMBER"取值改為了"N

溫馨提示

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

評論

0/150

提交評論