mybatis中文指南用戶_第1頁
mybatis中文指南用戶_第2頁
mybatis中文指南用戶_第3頁
mybatis中文指南用戶_第4頁
mybatis中文指南用戶_第5頁
已閱讀5頁,還剩52頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

MyBatisIDEMyBatis3nanlei1987@或/nanlei1987,愿和大家共同提高,共同進步。什么是 入 從XML中構(gòu)建 不使用XML構(gòu)建 從SqlSessionFactory中獲取 探究已映射的SQL語 命名空間的一點注 范圍和生命周 映射器實 XML映射配置文 SQL映射的XML文 高級結(jié)果映 支持的JDBC類 構(gòu)造方 關(guān) 集 鑒別 緩 使用自定義緩 參照緩 動態(tài) choose,when, trim,where, Java 應用目錄結(jié) 什么是XMLJavaPOJO(PlainOldJavaObjects,普通的Java對象)映射成數(shù)據(jù)庫中的記錄。每一個MyBatis的應用程序都以一個SqlSessionFactory對象的實例為核心。SqlSessionFactorySqlSessionFactoryBuilderSqlSessionFactoryBuilder對象可以通過XML配置文件,或從以往使用慣例中準備好的Configuration類實例中來構(gòu)建SqlSessionFactory對象。XMLReader實例,這個實例包括由文字形式的文件路徑Stringresource="org/mybatis/example/Configuration.xml";Readerreader=Resources.getResourceAsReader(resource);sqlMapper=newSqlSessionFactoryBuilder().build(reader);XML配置文件的詳細內(nèi)容可以在文檔后面找到,<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEconfigurationPUBLIC"-////DTDConfig3.0//EN"<environments<environment<transactionManager<dataSource<propertyname="driver"<propertyname="url"<propertyname="username"<propertyname="password"<mapperr

建器,MyBatis也提供完整的配置類,提供所有從XML文件中加載配置信息的選項。DataSourcedataSource=BlogDataSourceFactory.getBlogDataSource();TransactionFactorytransactionFactory=newEnvironmentenvironment=newEnvironment("development",transactionFactory,dataSource);Configurationconfiguration=newConfiguration(environment);SqlSessionFactorysqlSessionFactorynewXML文件的依賴,XML映射仍然在大多數(shù)高級映射(Join映射)XML配置文件的話,MyBatis將會自動查找和XML文件(BlogMapper.class類的類名,那么BlogMapper.xml將會被加載。后面我們會了解更多。SqlSessionFactory方法。你可以用SqlSession實例來直接執(zhí)行已映射的SQL語句。例如:SqlSessionsession=sqlMapper.openSession();try{Blogblog=session.selectOne("org.mybatis.example.BlogMapper.selectBlog",101);}finally}ogappe.cassSqlSessionsession=sqlSessionFactory.openSession();try{BlogMappermapper=session.getMapper(BlogMapper.class);Blogblog=mapper.selectBlog(101);}finally}SQL語句SqlSessionMapper對象到底執(zhí)行了什么操作。已映射的SQLXMLXML。使MyBatisXML映射文件也應該可以滿足上述示例中SqlSession對象的調(diào)用。<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN"<mapper<selectid="selectBlog"parameterType="int"resultType="Blog">select*fromBlogwhereid=#{id}XMLXML頭部和文檔類型聲明之外,你可以得到很多方便之處。在文件的剩余部分是很好的自我解釋。在命名空間Blogblog=session.selectOne("org.mybatis.example.BlogMapper.selectBlog",BlogMappermapper=session.getMapper(BlogMapper.class);Blogblog=mapper.selectBlog(101);型轉(zhuǎn)換,同時高MyBatis的作用。命名解析:為了減少輸入量,MyBatis對所有的命名配置元素使用如下的命名解析規(guī)com.mypckg.pp.sctlThgsseectAlThngs)com.b.sctlThngs),BlogMapper這樣的映射器類來說,還有一個妙招。它們中間映射的語句可以不需要packageorg.mybatis.example;publicinterfaceBlogMapper{@Select("SELECT*FROMblogWHEREid=#{id}")BlogselectBlog(intid);}Java注解對于復雜語句來說就會成XML映射語句,反之亦然。這個類可以被實例化,使用和丟棄。一旦你創(chuàng)建了SqlSessionFactory后,這個類就不需SqlSessionFactoryBuilderSqlSessionFactory實例,但是最好的方式是不需要保持它一直存在來保證所有XML解析資源,因為還有更重要的事情要做。一旦被創(chuàng)建,SqlSessionFactory實例應該在你的應用程序執(zhí)行期間都存在。沒有理由來的框架允許你創(chuàng)建支持程序來管理單例SqlSessionFactory的生命周期。SqlSession實例。SqlSession的實例不能共享使用,它也是SerlvetHttpSessionWeb框架,要考慮SqlSessionHTTPHTTP請求,SqlSessionSession很重要,你應該確保使用finally塊來關(guān)閉它。下面的示例就是一個確保SqlSession關(guān)閉的基本模式:SqlSessionsession=sqlSessionFactory.openSession();try{//do}finally}有通過你自己的連接關(guān)閉,這會給MyBatis造成一種跡象表明你要自己管理連接資源。SqlSession相似。你也許會發(fā)現(xiàn),在這個水平上管理太多的資源的話會失控。保持簡單,將SqlSessionsession=sqlSessionFactory.openSession();try{BlogMappermapper=//do}finally}XMLconfigurationpropertiessettingstypeHandlersobjectFactorypluginsenvironmentsdataSource者通過properties元素的子元素來傳遞。例如: <propertyname="username"<propertyname="password"<dataSource<propertyname="driver"<propertyname="url"<propertyname="username"<propertyname="password"屬性也可以被傳遞到SqlSessionBuilder.build()方法中。例如:SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,props);//...or...SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,environment,propertiesurl屬性中加載的屬性第二被讀取,它會屬性,這些屬性可能是從properties元素體內(nèi)和資源/url屬性中加載的。true|true|true|的語句中返回(需要適合的驅(qū)動true|true|Derbytrue|MyBatis如何自動映射列到字段/屬性。PARTIAL只會自動映射簡單,有什么特別之處。REUSE執(zhí)行器重用預處理語句。BATCHBATCH任何正整數(shù)Not<settingname="cacheEnabled"<settingname="lazyLoadingEnabled"<settingname="multipleResultSetsEnabled"<settingname="useColumnLabel"<settingname="useGeneratedKeys"<settingname="enhancementEnabled"<settingname="defaultExecutorType"<settingname="defaultStatementTimeout"<typeAliasalias="Author"<typeAliasalias="Blog"<typeAliasalias="Comment"<typeAliasalias="Post"<typeAliasalias="Section"<typeAliasalias="Tag".Java類型。下面這個表格描述了默認的類型處JavaJDBCTIMETIME作為代碼存儲(而不是索引(org.mybts.typeJava類型,還有可選的一個JDBC類型。例如://ExampleTypepublicclassExampleTypeHandlerimplementsTypeHandlerpublicvoidsetParameter(PreparedStatementps,inti,parameter,JdbcTypejdbcType)throwsSQLExceptionps.setString(i,(String)}publicObjectgetResult(ResultSetrs,StringcolumnName)throwsSQLException{return}publicObjectgetResult(CallableStatementcs,intcolumnIndex)throwsSQLException{return}}//<typeHandlerjavaType="String"jdbcType="VARCHAR"JavaStringVARCHARVARCHAR類型的字段,來綁定到正確的類型處理器上。這是因為MyBatis直到語句被執(zhí)行都不知道數(shù)據(jù)類型的這個現(xiàn)實導致的。ObjectFactory不比使用默認構(gòu)造方法或帶參數(shù)的構(gòu)造方法實例化目標類做的工作多。如果你想重寫默認的ObjectFactory,你可以創(chuàng)建你自己的。比如://ExamplepublicclassExampleObjectFactoryextends{publicObjectcreate(Classtype){returnsuper.create(type);}publicObjectcreate(Classtype,List<Class>constructorArgTypes,List<Object>constructorArgs){returnsuper.create(type,constructorArgTypes,}publicvoidsetProperties(Properties{}}// <propertyname="someProperty"一個是處理帶參數(shù)的構(gòu)造方法。最終,setPropertiesObjectFactory。在MyBatis允許你在某一點攔截已映射語句執(zhí)行的調(diào)用。默認情況下,MyBatis允許使用(update,query,flushStatements,commit,rollback,getTransaction,close,(handleResultSets,(prepare,parameterize,batch,update,MyBatis的發(fā)行包中。你應該理解你所覆蓋方法的行為,假設你所做的要比監(jiān)視調(diào)用要多。//@Intercepts({@Signature(type=Executor.class,method="update",args={MappedStatement.class,Object.class})})publicclassExamplePluginimplementsInterceptorpublicObjectintercept(Invocationinvocation)throws{return}publicObjectplugin(Object{returnPlugin.wrap(target,}publicvoidsetProperties(Propertiesproperties)}}//<plugininterceptor="org.mybatis.example.Example<propertyname="someProperty"然后覆蓋其中的任意方法,之后傳遞它到sqlSessionFactoryBuilder.build(myConfig)方法的調(diào)用。這可能會嚴重影響然后覆蓋其中的任意方法,之后傳遞它到sqlSessionFactoryBuilder.build(myConfig)方法的調(diào)用。這可能會嚴重影響MyBatis的行為,所以要小心。MyBatisSQL映射應用于多種數(shù)據(jù)庫之中。例如,相同的模式,所以你會想對不同數(shù)據(jù)庫使用相同的SQL映射。這種用例是很多的。SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,environment); SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader);<environments<environment<transactionManager<propertyname="..."<dataSource<propertyname="driver"<propertyname="url"<propertyname="username"<propertyname="password"dfutdvepmntddveopmnttypJtyp=”PEtype=”[JDC|MANGD]”JDBC–這個配置直接簡單使用了JDBC的提交和回滾設置。它依賴于從數(shù)據(jù)源得MANAGED–這個配置幾乎沒做什么。它從來不提交或回滾一個連接。而它會讓它,將closeConnection屬性設置為false。例如:<transactionManager<propertyname="closeConnection"publicinterface{voidsetProperties(PropertiesTransactionnewTransaction(Connectionconn,boolean}publicinterface{Connectionvoidcommit()throwsSQLException;voidrollback()throwsSQLException;voidclose()throwsSQLException;}type=”???”UNPOOLED–這個數(shù)據(jù)源的實現(xiàn)是每次被請求時簡單打開和關(guān)閉連接。它有一點慢,UNPOOLED類型的數(shù)據(jù)源僅僅用來配置以下5種屬性:driver–JDBCJava類的完全限定名(如果你的驅(qū)動包含的有,它也url–這是數(shù)據(jù)庫的JDBCURLusername–password–defaultTransactionIsolationLevel–UTF8encoding”屬性,它是通過POOLED–這是JDBC連接對象的數(shù)據(jù)源連接池的實現(xiàn),用來避免創(chuàng)建新的連接實例Web應用程序用來快速響應請求很流行的方poolMaximumActiveConnections–在任意時間存在的活動(也就是正在使用)連poolMaximumIdleConnections–poolMaximumCheckoutTime在被強制返回之前,池中連接被檢查的時間。默認值:20000毫秒(也就是20秒)poolTimeToWait–這是給連接池一個打印日志狀態(tài)機會的低層次設置,還有重新敗。默認值:20000毫秒(也就是20秒)poolPingQuery–發(fā)送到數(shù)據(jù)的偵測查詢,用來驗證連接是否正常工作,并且準備poolPingEnabled–poolPingConnectionsNotUsedFor–這是用來配置poolPingQuery多次時間被用一但僅僅當JNDISpring或應用服務器這類的容器,容器可以集initial_context(initialContext.lookup(initial——context。這是個可選屬性,如果被忽略,那么data_source屬性將會直接以initialContext為背景再次尋找。data_source–initial_contextinitial_context沒有返回結(jié)果時,直接以初始MyBatisSQL映射語句了。資源引用,或者字符表示,或url引用的完全限定名(包括fileURLs。例如:// <mapper<mapper<mapper<mapper<mapperMyBatisSQL映射文件中了,下面的部分我們來討論SQL映射文件。SQLXML文件MyBatis真正的力量是在映射語句中。這里是奇跡發(fā)生的地方。對于所有的力量,SQL95%的代碼量。MyBatisSQL的,使其遠離于SQL映射文件有很少的幾個頂級元素(按照它們應該被定義的順序cache-cache-ref–resultMap–最復雜,也是最有力量的元素,用來描述如何從數(shù)據(jù)庫結(jié)果集中來加 sql–SQLinsert–update–delete–select–MyBatis時最常用的元素之一。直到你從數(shù)據(jù)庫取出數(shù)據(jù)時才會發(fā)現(xiàn)將于每次插入,更新或刪除,那也會有很多的查詢。這是MyBatis的一個基本原則,也是將<selectid=”selectPerson”parameterType=”int”resultType=”hashmap”SELECT*FROMPERSONWHEREID=tIntgr//相似的JDBC代碼,不是MyBatisStringselectPerson=“SELECT*FROMPERSONWHEREID=?”;PreparedStatementps=conn.prepareStatement(selectPerson);>命名引用外部的resultMap。返回map是MyBatis最具力量的特性,將其設置為最大等待值。默認不設置(驅(qū)動自行處理自行處理中的一種。默認是不設置(驅(qū)動自行處理parameterMap將其設置為大等待值。默認不設置(驅(qū)動自行處理(僅對insert)MyBatis使用JDBC的getGeneratedKeys方法來取出由數(shù)據(jù)(比如:像MySQL和SQLServer這樣的數(shù)據(jù)庫管理系統(tǒng)的自動遞增字段)內(nèi)部生成的主鍵。<insertid="insertAuthor"insertintoAuthor(id,username,password,email,bio)values(#{id},#{username},#{password},#{email},#{bio})<updateid="updateAuthor"parameterupdateAuthorsetusername=#{username},password=#{password},email=#{email},bio=#{bio}whereid=#{id}<deleteid="deleteAuthor”parameterdeletefromAuthorwhereid=useGeneratedKeys=”true”keyProperty到你已經(jīng)做好的目標屬性<insertid="insertAuthor"parameterType="domain.blog.Author"useGeneratedKeys=”true”keyProperty=”id”>insertintoAuthor(username,password,email,bio)values這里有一個簡單(甚至很傻)ID(可能你不會這么做,但是這展示了MyBatis處理問題的靈活性,因為它并不真的關(guān)心ID的生成<insertid="insertAuthor"<selectKeykeyProperty="id"resultType="int"selectCAST(RANDOM()*1000000asINTEGER)afrominsertinto(id,username,password,email,bio,favourite_section)(#{id},#{username},#{password},#{email},#{bio},)在上面的示例中,selectKey元素將會首先運行,Authorid會被設置,然后插入語句的Java代碼變得復雜。AFTER,那么先執(zhí)行插入語句,然后是selectKey元素-和前面的相同,MyBatis支持STATEMENT,PREPAREDCALLABLE語句的映射類型,分別代表PreparedStatement<sqlid=”userColumns”>id,username,password<selectid=”selectUsers”parameterType=”int”resultType=”hashmap”>select<includerefid=”userColumns”/>fromsome_tablewhereid=#{id}元素。對于簡單的做法,大概90%的情況,是不用太多的,比如:<selectid=”selectUsers”parameterType=”int”selectid,username,passwordfromuserswhereid=<insertid=”insertUser”parameterType=”User”>insertintousers(id,username,password)values(#{id},#{username},#{password})首先,像MyBatis的其他部分,參數(shù)可以指定一個確定的數(shù)據(jù)類型。MyBatis的剩余部分,javaType以通過閱讀PreparedStatement.setNull()方法的JavaDocs文檔來研究它。最后,modeIN,OUTINOUTOUTINOUT,參數(shù)對象屬性的真實值將會被改變,就像你期望你需要你個輸出參數(shù)。如果mode為INOTRFCURSOR的空白是jdbcType的CURSOR類型,它會自動地被設置為結(jié)果集。盡管所有這些強大的選項很多時候你只簡單指定屬性名,MyBatis會自己計算剩余的。最多的情況是你為jdbcType指定可能為空的列名。默認情況下,使用#{}MyBatis創(chuàng)建預處理語句屬性并以它為背景設語句中插入一個不改變的字符串。比如,像ORDERBY,你可以這樣來使用:ORDERBYSQL注入攻擊,因此你不應該允許用戶輸入這些字段,或者通常自行轉(zhuǎn)義并檢resultMapMyBatis90%的需要從結(jié)果ResultMap的設計就是簡單語句不需要明確的結(jié)果映射,而很多復雜語句確實需要描述它們<selectid=”selectUsers”parameterType=”int”selectid,username,hashedPasswordfromsome_tablewhereid=HashMapresultType屬性HashMap不能很好描述一個領域模型。那樣你的應JavaBeansPOJOs(PlainOldJavaObjects,普通Java對象)來作為領域模型。MyBatis對兩者都支持。看看下面這個JavaBean:packagecom.someapp.model;publicclassUser{privateintprivateStringusername;privateStringhashedPassword;publicintgetId(){return}publicvoidsetId(int{this.id=}publicString{return}publicvoidsetUsername(String{this.username=}publicString{return}publicvoidsetHashedPassword(String{this.hashedPassword=}}在select語句中會精確匹配到列名。<selectid=”selectUsers”parameterType=”int”selectid,username,hashedPasswordfromsome_tablewhereid=<!--在XML配置文件中<typeAliastype=”com.someapp.model.User”alias=”<!--在SQL映射的XML文件中<selectid=”selectUsers”parameterType=”int”resultType=”User”>selectid,username,hashedPasswordfromsome_tablewhereid=這些情況下,MyBatis會在幕后自動創(chuàng)建一個ResultMap,基于屬性名來映射列到JavaBean的屬性上。如果列名沒有精確匹配,你可以在列名上使用select字句的別名(一個標準的SQL特性)來匹配標簽。比如:<selectid=”selectUsers”parameterType=”int”resultType=”user_idas“id”,user_nameas“userName”,hashed_passwordas“hashedPassworfromwhereid=ResultMap最優(yōu)秀的地方你已經(jīng)了解了很多了,但是你還沒有真正的看到一個。這些簡外部的resultMap是什么樣子的,這也是解決列名不匹配的另外一種方式。<resultMapid="userResultMap"<idproperty="id"column="user_id"<resultproperty="username"<resultproperty="password"<selectid=”selectUsers”parameterType=”int”selectuser_id,user_name,fromsome_tablewhereid=#{id}MyBatis創(chuàng)建的一個想法:數(shù)據(jù)庫不用永遠是你想要的或需要它們是什么樣的。而我們BCNF范式,但它們有時不是。如果可能有一個單獨的MyBatis提供處理這個問題的答案。B.idasblog_id,B.titleasblog_title,A.idasauthor_id,A.usernameasauthor_username,A.passwordasauthor_password,A.emailasauthor_email,A.bioasauthor_bio,P.idasP.blog_idaspost_blog_id,P.author_idaspost_author_id,P.created_onaspost_created_on,P.sectionaspost_section,P.draftasdraft,C.idascomment_id,C.post_idascomment_post_id,C.nameascomment_name,C.commentascomment_text,T.idastag_id,T.nameastag_namefromBlogBleftouterjoinAuthorAonB.author_id=A.idleftouterjoinPostPonB.id=P.blog_idleftouterjoinCommentConP.id=C.post_idleftouterjoinPost_TagPTonPT.post_id=P.idleftouterjoinTagTonPT.tag_id=T.idwhereB.id=<idArgcolumn="blog_id"<associationproperty="author"column="blog_author_id"javaType="<idproperty="id"<resultproperty="bio"<idproperty="id"<idproperty="id"<collectionproperty="tags"column="post_id"ofType="Tag"<idproperty="id"<casevalue="1"constructor–idArgIDIDarg–id–一個ID結(jié)果;標記結(jié)果作為IDresult–注入到字段或JavaBeanassociation––collection––discriminator–case––這種情形結(jié)果也映射它本身,因此可以包含很多相<idproperty="id"以這樣映射一些東西:“username”,或者映射到一些復雜的東西:“drssstr.nubrJava類的完全限定名,或一個類型別名(參加上面內(nèi)建類型別名的列表JavaBean,MyBatis通??梢詳喽愋汀ashMapjavaType僅需要對插入,更新和刪除操作可能為空的列進行處理。這是JDBC支持的JDBC類型<idArgcolumn="id"<argcolumn=”username”對于大多數(shù)數(shù)據(jù)傳輸對象(DataTransferObject,DTO)類型,屬性可以起作用,而且像類設置屬性的值,而不用暴露出公有方法。MyBatisJavaBeans屬性publicclassUserpublicUser(intid,Stringusername)}}為了向這個構(gòu)造方法中注入結(jié)果,MyBatis需要通過它的參數(shù)的類型來標識構(gòu)造方法。<idArgcolumn="id"<argcolumn=”username”來自數(shù)據(jù)庫的類名,或重命名的列標簽。這和通常傳遞給在這個表格之前的所支持的JDBC類型列表中的類型。JDBC類型是僅僅MyBatisJDBC編程,你需要指定這個類型-<idproperty="id"username“drssstr.nubr注意:要處理復合主鍵,你可以指定多個列名通過column在這個表格之前的所支持的JDBC類型列表中的類型。JDBC類型是僅僅MyBatisJDBC編程,你需要指定這個類型-select語句作為參數(shù)。表格后面注意:要處理復合主鍵,你可以指定多個列名通過columnjavaType="Author"select=”selectAuthor”/>SELECT*FROMBLOGWHEREID=<selectid=”selectAuthor”parameterType=”int”resultType="Author">SELECT*FROMAUTHORWHEREID=#{id}述了“selectAuthor”語句應該被用來加載它的author屬性?!癗+1查詢問題”。概括地講,N+1查詢問題可以是這樣引起的:這個問題會導致成百上千的SQL語句被執(zhí)行。這通常不是期望的。MyBatis能延遲加載這樣的查詢就是一個好處,因此你可以分散這些語句同時運行的消<selectid="selectBlog"parameterType="int"resultMap="blogResult">B.idasblog_id,B.titleasblog_title,A.idasauthor_id,A.usernameasauthor_username,A.passwordasauthor_password,A.emailasauthor_email,A.bioasauthor_bioFromBlogBleftouterjoinAuthorAonB.author_id=AwhereB.id=<resultMapid="blogResult"<idproperty=”blog_id”column="id"javaType="Author"resultMap=”authorResult”/><resultMapid="authorResult"<idproperty="id"<resultproperty="bio"非常重要id元素扮演了非常重要的角色。應該通常指定一個或多個屬性,它們可以用來唯一標識結(jié)果。實際上就是如果你不使用它(id元素,但是會產(chǎn)生<resultMapid="blogResult"<idproperty=”blog_id”column="id"<idproperty="id"<resultproperty="bio"<idproperty="id"<resultproperty="body"privateList<Post><resultMapid=”blogResult”ofType="Post"select=”selectPostsForBlog”/>SELECT*FROMBLOGWHEREID=<selectid=”selectPostsForBlog”parameterType=”int”resultType="Author">SELECT*FROMPOSTWHEREBLOG_ID=#{id}該注意我們使用的是集合元素。然后要注意那個新的“ofType”屬性。這個屬性用來區(qū)分ofType="Post"select=”selectPostsForBlog”/><collectionproperty="posts"column="blog_id"ofType="Post"<selectid="selectBlog"parameterType="int"resultMap="blogResult">B.idasblog_id,B.titleasblog_title,P.idaspost_id,P.bodyaspost_body,fromBlogleftouterjoinPostPonB.id=P.blog_idwhereB.id=#{id}<resultMapid="blogResult"<idproperty=”id”column="blog_id"<collectionproperty="posts"<idproperty="id"<resultproperty="body"<resultMapid="blogResult"<idproperty=”id”column="blog_id"<collectionproperty="posts"ofType="Post"<resultMapid="blogPostResult"<idproperty="id"<resultproperty="body"測試。好在myBatis讓你后來可以改變想法,而不對你的代碼造成很小(或任何)影響。<casevalue="1"解,因為它的表現(xiàn)很像Java語言中的switch語句。<idproperty=”id”column="id"<resultproperty="vin"<resultproperty="year"<resultproperty="make"<casevalue="1"<casevalue="2"<casevalue="3"<casevalue="4"<resultMapid="carResult"doorCount屬性會被加載。這步完成后完整地允許鑒別器實例的獨立組,盡管CarVehicle實例。因此,我們想要剩余的屬性也被加載。我們設置的結(jié)果映射的<resultMapid="carResult"type="Car"<idproperty=”id”column="id"<resultproperty="vin"<resultproperty="year"<resultproperty="make"<casevalue="1"<casevalue="2"<casevalue="3"column="power_sliding_door"<casevalue="4"依賴也是必須的。要開啟二級緩存,你需要在你的SQL映射文件中添加一行:根據(jù)時間表(noFlushInterval,沒有刷新間隔,緩存不會以任何時間順序緩存會存儲列表集合或?qū)ο螅o論查詢方法返回什么)1024個引用LRU–FIFO––WEAK–弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對象。默認的是LRU。可用內(nèi)存資源數(shù)目。默認值是1024。readOnly(只讀)truefalse。只讀的緩存會給所有調(diào)用者返回緩會返回緩存對象的拷貝(通過序列化。這會慢一些,但是安全,因此默認是false。<cache這個示例展示了如何使用一個自定義的緩存實現(xiàn)。type屬性指定的類必須實現(xiàn)org.mybatis.cache.CacheMyBatis框架中很多復雜的接口之一,但是簡單publicinterface{StringgetId();intgetSize();voidputObject(Objectkey,ObjectObjectgetObject(Objectkey);booleanhasKey(Objectkey);ObjectremoveObject(Objectkey);voidclear();ReadWriteLock}<cache<propertyname=”cacheFile”value=”/tmp/my-custom-SQL映射文件的命名空間是很重要的。因此,所有<select...flushCache=”false”<insert...<update...<delete...flushCacheuseCache屬性。比如,在一些情況下你也許想排除況下你可以使用cache-ref元素來引用另外一個緩存。 SQL字符串在一起是多么的痛苦,確保不能忘了空格或在列表的最后省略逗號。動態(tài)SQL可以徹底處理這種痛苦。SQL不可能是獨立的一部分,MyBatisSQL語言來改進這種情形,這種語言可以被用在任意映射的SQL語句中。SQL元素和使用JSTLXMLMyBatis之前的版本中,有很多的元素需要來了解。MyBatis3大大提升了它們,現(xiàn)在用不到原先一半的元素就能工作了。MyBatis采用功能強大的基于OGNL的表達式來消除其他元素。SQL中所做的最通用的事情是包含部分where<selectid=”findActiveBlogWithTitleLike”parameterType=”Blog”resultType=”Blog”>SELECT*FROMBLOGWHEREstate=<iftest=”title!=ANDtitleliketitleauthor呢?首先,要改變語句的名稱讓它有意義。然后<selectid=”findActiveBlogLike”parameterType=”Blog”resultType=”Blog”>SELECT*FROMBLOGWHEREstate=<iftest=”title!=ANDtitlelike<iftest=”author!=!=ANDtitlelikechoose,when,語句相似,MyBatischoosetitletitleauthor提<selectid=”findActiveBlogLike”parameterType=”Blog”resultType=”Blog”>SELECT*FROMBLOGWHEREstate=<whentest=”title!=ANDtitlelike<whentest=”author!=!=ANDtitlelikeANDfeatured=trim,where,例后會發(fā)生什么,但是這次我們將“ACTIVE=1”也設置成動態(tài)的條件。<selectid=”findActiveBlogLike”parameterType=”Blog”resultType=”Blog”>SELECT*FROMBLOG<iftest=”state!=state=<iftest=”title!=ANDtitlelike<iftest=”author!=!=ANDtitlelikeSELECT*FROMBLOGSELECT*FROMBLOGANDtitlelike<selectid=”findActiveBlogLike”parameterType=”Blog”resultType=”Blog”>SELECT*FROM<iftest=”state!=state=<iftest=”title!=ANDtitlelike<iftest=”author!=!=ANDtitlelike果以“AND”或“OR”開頭的內(nèi)容,那么就會跳過WHERE不插入。wheretrim<trimprefix="WHERE"prefixOverrides="AND|OR…在overrides屬性中指定的內(nèi)容,插入在with屬性中的內(nèi)容。<updateid="updateAuthorIfNecessary"update<iftest="username!=<iftest="password!=<iftest="email!=<iftest="bio!=where<trimprefix="SET"…<selectid="selectPostIn"resultType="domain.blog.Post">SELECT*FROMPOSTPWHEREID<foreachitem="item"index="index"collection="list"open="("separator=","close=")">foreach元素是非常強大的,它允許你指定一個集合,聲明集合項和索引變量,它們可候,MyBatisMap中,用名稱作為鍵。List實例將會以“l(fā)ist”Java既然你已經(jīng)知道如何配置MyBatis和創(chuàng)建映射文件,你就已經(jīng)準備好來提升技能了。MyBatisJavaAPIJDBC相比,MyBatis很大程度簡化了你的代碼而且保持簡潔,很容易理解和維護。MyBatis3已經(jīng)引入了很多重要的改進來使得SQL映射更加優(yōu)秀。 ←MyBatis*.jar MyBatisJava接口就是SqlSession。盡管你可以使用這個接口執(zhí)行命令,獲SqlSession實例。SqlSessionsSqlSessionFactory實例創(chuàng)建的。SqlSessionFactory對SqlSessionSqlSessionFactorySqlSessionFactoryBuilder創(chuàng)建的,它可以從XML配置,注解或手動配置Java來創(chuàng)建SqlSession實例。SqlSessionFactorybuild(ReaderSqlSessionFactorybuild(Readerreader,Stringenvironment)SqlSessionFactorybuild(Readerreader,Propertiesproperties)SqlSessionFactorybuild(Readerreader,Stringenv,Propertiesprops)SqlSessionFactorybuild(Configurationconfig)第一種方法是最常用的,它使用了一個參照了XML<environmentsdefault="de<environmentid="de<transactionManager…<dataSource…<environmentid="<transactionManager…<dataSource…如果你調(diào)用了一個使用environment參數(shù)的build方法,那么MyBatis將會使用默認的environment(在上面的示例中就會指定為defaut=”deveopment”。作為方法參數(shù)傳遞的屬性最后被讀取,可以覆蓋已經(jīng)從properties元素體和后是在properties元素體中指定的屬性。Stringresource="org/mybatis/builder/MapperConfig.xml";Readerreader=Resources.getResourceAsReader(resource);SqlSessionFactoryBuilderbuilder=newSqlSessionFactoryBuilder();SqlSessionFactoryfactory=builder.build(reader);webURL加載資源文件??匆幌逻@個類的源代碼或者通過你的IDE來查看,就會看到一整套有用的方法。這里給出一個簡表:URLgetResourceURL(StringURLgetResourceURL(ClassLoaderloader,Stringresource)InputStreamgetResourceAsStream(Stringresource)InputStreamgetResourceAsStream(ClassLoaderloader,Stringresource)PropertiesgetResourceAsProperties(Stringresource)PropertiesgetResourceAsProperties(ClassLoaderloader,StringReadergetResourceAsReader(StringReadergetResourceAsReader(ClassLoaderloader,Stringresource)FilegetResourceAsFile(Stringresource)FilegetResourceAsFile(ClassLoaderloader,Stringresource)InputStreamgetUrlAsStream(StringurlString)ReadergetUrlAsReader(StringurlString)PropertiesgetUrlAsProperties(StringurlString)ClassclassForName(StringclassName)SQL映射(不推薦使用,因為應用正接收請求。configuration類有所有配置的開關(guān),這些你已經(jīng)了解了,只在JavaAPI中露出來。這里有一個簡單的示例,如何手動配置configuration實例,然后將它傳遞給build()方法來創(chuàng)建SqlSessionFactory。DataSourcedataSource=BaseDataTest.createBlogDataSource();TransactionFactorytransactionFactory=newJdbcTransactionFactory();Environmentenvironment=newEnvironment("development",transactionFactory,dataSource);Configurationconfiguration=newConfiguration(environment);SqlSessionFactoryBuilderbuilder=newSqlSessionFactoryBuilder();SqlSessionFactoryfactory=builder.build(configuration);數(shù)據(jù)庫和/或JDBC驅(qū)動沒有事務)?Connection(連接MyBatis獲得來自配置的數(shù)據(jù)源的連接還是提供你自己SqlSessionSqlSessionopenSession(booleanautoCommit)SqlSessionopenSession(Connectionconnection)SqlSessionopenSession(TransactionIsolationLevellevel)SqlSessionopenSession(ExecutorTypeexecType,TransactionIsolationLevellevel)SqlSessionopenSession(ExecutorTypeexecType)SqlSessionopenSession(ExecutorTypeexecType,booleanautoCommit)ConfigurationgetConfiguration();Connectionconnection參數(shù)。注意沒有覆蓋同時設置ConnectionautoCommitMyBatisconnection對象提供的設否則它們按預期的方式來工作,并有JDBC支持的5級SELECT在它們中間執(zhí)行還會標定它們是個方法會返回一個Configuration實例,在運行時你可以使用它來自檢MyBatis的配置。注意MyBatissession,transaction是原生類型(自動裝箱或包裝類,JavaBean,POJO或Map。ObjectselectOne(Stringstatement,Objectparameter)ListselectList(Stringstatement,Objectparameter)intinsert(Stringstatement,Objectparameter)intupdate(Stringstatement,Objectparameter)intdelete(Stringstatement,Objectparameter)1ObjectselectOne(Stringstatement)ListselectList(Stringstatement)intinsert(Stringstatement)intupdate(Stringstatement)intdelete(Stringstatement)List(Stringstatement,Objectparameter,RowBoundsvoid(Stringstatement,Objectparameter,ResultHandlerhandler)voidselect(Stringstatement,Objectparameter,RowBoundsrowBounds,ResultHandlerhandler)RowBoundsMyBatisintoffset=100;intlimit=25;RowBoundsrowBounds=newRowBounds(offset,FORRD_ONYResultHandlerList中,創(chuàng)MapSe那就是MyBatis內(nèi)部創(chuàng)建結(jié)果集列表。packageorg.mybatis.executor.result;publicinterfaceResultHandler{voidhandleResult(ResultContext}爾返回值的stop()方法來停止MyBatis加載更多的結(jié)果。JDBCConnection實voidvoidcommit(booleanforce)voidrollback()voidrollback(booleantruecommit了外部事務管理器時。很多時候你不用調(diào)用rollback(),因為如果你沒有調(diào)用commit時MyBatissession的細粒度控void明確地關(guān)閉它(獲取打算做更多的工作clearCache()。void你必須保證的最重要的事情是你要關(guān)閉所打開的任何session。保證做到這點的最佳方SqlSessionsession=sqlSessionFactory.openSession();try{//下面3行pseudocod}finally}Configuration<T>TgetMapper(Class<T>IDE也沒有幫助,還有可能的單元測試。在上面的入門章節(jié)中我們已經(jīng)看到如何映射到SqlSession的。publicinterfaceAuthorMapper//(Author)AuthorselectAuthor(int//(List<Author>)List<Author>//insert(“insertAuthor”,voidinsertAuthor(Author//updateAuthor(“updateAuhor”,voidupdateAuthor(Author//voiddeleteAuthor(int}相反,方法名必須匹配映射語句的ID。型,Map,POJO和JavaBean。在參數(shù)列表中的位置來命名,比如:#{1},#{2}等。如果你想改變參數(shù)的名稱(因為最初設計時,MyBatisXMLXML的,而且XMLMyBatis3,有新的可用的選擇了。MyBatis3構(gòu)建JavaAPIAPIXMLMyBatis配置的MyBatis映射不能用注解來構(gòu)建,那并不可笑。C#屬性(做示例)就沒MyBatis.NETXMLJava注解類flushInterval,sizereadWrite類單獨的構(gòu)造方法參數(shù),是ConstructorArgs集合的一部分。屬性:id屬性是布爾值,來標識用于比較的屬一組實例值被用來決定結(jié)果映射的表olumavyedcye,tpeHandler,cases。aes果數(shù)組,因此這個注解和實際的ResultMap很相似,由下面的Results在列和屬性或字段之間的單獨結(jié)果映射。屬性:id,columnproperty,javaType,jdb

溫馨提示

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

評論

0/150

提交評論