关闭

关闭

关闭

封号提示

内容

首页 MyBatis 3 User Guide Simplified Chinese.pdf

MyBatis 3 User Guide Simplified Chinese.pdf

MyBatis 3 User Guide Simplified…

上传者: aiheng 2011-09-19 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《MyBatis 3 User Guide Simplified Chinesepdf》,可适用于IT/计算机领域,主题内容包含MyBatis用户指南帮助我们把文档做得更好…如果你发现了本文档的遗漏之处或者丢失MyBatis特性的说明时那么最好的方法就是了解一下这个遗漏之处然符等。

MyBatis用户指南帮助我们把文档做得更好…如果你发现了本文档的遗漏之处或者丢失MyBatis特性的说明时那么最好的方法就是了解一下这个遗漏之处然后把它记录下来。我们在wiki接收公共的文档贡献:http:codegooglecompmybatiswikiWelcome你也是本文档的最佳作者其他用户也会来阅读它的。关于翻译MyBatis的用户指南翻译由南磊完成若对翻译质量有任何意见和建议请联系nanleigmailcom愿和大家共同提高共同进步。从文档中复制代码的警告对这不是一个法律上的警告但是它可以帮助你保持清醒的认识。从美学上来讲现代的文字处理工具在制作可读性强和格式良好的文本上做了大量的工作。然而它们也往往会由于插入特殊字符而完全破坏代码示例有时看起来和你想要的是一模一样的。“引号"和连字符就是一个很好的例子在IDE环境或文本编辑器中左边的那个符号就不会正常起作用至少不会是你想要的那个效果。阅读本文档就要享受它希望它能对你有帮助。当遇到代码段示例的时候可以寻找示例和下载(包括单元测试等)或是来自网站和邮件列表的示例。目录什么是MyBatis?入门从XML中构建SqlSessionFactory不使用XML构建SqlSessionFactory从SqlSessionFactory中获取SqlSession探究已映射的SQL语句命名空间的一点注释范围和生命周期SqlSessionFactoryBuilderSqlSessionFactorySqlSessionMapper实例XML映射配置文件propertiesSettingstypeAliasestypeHandlersobjectFactorypluginsenvironmentstransactionManagerdataSsourcemappersSQL映射的XML文件selectinsertupdatedeletesqlParametersresultMap高级结果映射idresult支持的JDBC类型构造方法关联集合鉴别器缓存使用自定义缓存参照缓存动态SQLifchoose,when,otherwisetrim,where,setforeachJavaAPI应用目录结构SqlSessionsSqlSessionFactoryBuilderSqlSessionFactorySqlSessionSelectBuilderSqlBuilder什么是MyBatis?MyBatis是支持普通SQL查询存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射将接口和Java的POJOs(PlanOldJavaObjects普通的Java对象)映射成数据库中的记录。入门每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得。SqlSessionFactoryBuilder对象可以从XML配置文件或从Configuration类的习惯准备的实例中构建SqlSessionFactory对象。从XML中构建SqlSessionFactory从XML文件中构建SqlSessionFactory的实例非常简单。这里建议你使用类路径下的资源文件来配置但是你可以使用任意的Reader实例这个实例包括由文字形式的文件路径或URL形式的文件路径file:来创建。MyBatis包含了一些工具类称作为资源这些工具类包含一些方法这些方法使得从类路径或其他位置加载资源文件更加简单。Stringresource="orgmybatisexampleConfigurationxml"Readerreader=ResourcesgetResourceAsReader(resource)sqlMapper=newSqlSessionFactoryBuilder()build(reader)XML配置文件包含对MyBatis系统的核心设置包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器。关于XML配置文件的详细内容可以在文档后面找到这里给出一个简单的示例:<xmlversion=""encoding=""><!DOCTYPEconfigurationPUBLIC"mybatisorgDTDConfigEN""http:mybatisorgdtdmybatisconfigdtd"><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="orgmybatisexampleBlogMapperxml"><mappers><configuration>当然在XML配置文件中还有很多可以配置的上面的示例指出的则是最关键的部分。要注意XML头部的声明需要用来验证XML文档正确性。environment元素体中包含对事务管理和连接池的环境配置。mappers元素是包含所有mapper(映射器)的列表这些mapper的XML文件包含SQL代码和映射定义信息。不使用XML构建SqlSessionFactory如果你喜欢从Java程序而不是XML文件中直接创建配置实例或创建你自己的配置构建器MyBatis也提供完整的配置类提供所有从XML文件中加载配置信息的选项。DataSourcedataSource=BlogDataSourceFactorygetBlogDataSource()TransactionFactorytransactionFactory=newJdbcTransactionFactory()Environmentenvironment=newEnvironment("development",transactionFactory,dataSource)Configurationconfiguration=newConfiguration(environment)configurationaddMapper(BlogMapperclass)SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder()build(configuration)注意这种情况下配置是添加映射类。映射类是Java类这些类包含SQL映射语句的注解从而避免了XML文件的依赖XML映射仍然在大多数高级映射(比如:嵌套Join映射)时需要。出于这样的原因如果存在XML配置文件的话MyBatis将会自动查找和加载一个对等的XML文件(这种情况下基于类路径下的BlogMapperclass类的类名那么BlogMapperxml将会被加载)。后面我们会了解更多。从SqlSessionFactory中获取SqlSession现在我们已经知道如何获取SqlSessionFactory对象了基于同样的启示我们就可以获得SqlSession的实例了。SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法。你可以用SqlSession实例来直接执行已映射的SQL语句。例如:SqlSessionsession=sqlMapperopenSession()try{Blogblog=(Blog)sessionselectOne("orgmybatisexampleBlogMapperselectBlog",)}finally{sessionclose()}这种方法起到的作用和我们使用之前的MyBatis版本是相似的现在有一种更简洁的方法。使用合理描述参数和SQL语句返回值的接口(比如BlogMapperclass)这样现在就可以至此那个更简单更安全的代码没有容易发生的字符串文字和转换的错误。例如:SqlSessionsession=sqlSessionFactoryopenSession()try{BlogMappermapper=sessiongetMapper(BlogMapperclass)Blogblog=mapperselectBlog()}finally{sessionclose()}现在我们来探究一下这里到底执行了什么。探究已映射的SQL语句这里你也许想知道通过SqlSession和Mapper对象到底执行了什么操作。已映射的SQL语句是一个很大的主题而且这个主题会贯穿本文档的大部分内容。为了给出一个宏观的概念这里有一些示例。上面提到的任何一个示例语句是通过XML或注解定义的。我们先来看看XML。使用基于XML的映射语言在过去的几年中使得MyBatis非常流行他为MyBatis提供所有的特性设置。如果你以前用过MyBatis这个概念应该很熟悉了但是XML映射文件也有很多的改进后面我们会详细来说。这里给出一个基于XML映射语句的示例这些语句应该可以满足上述示例中SqlSession对象的调用。<xmlversion=""encoding=""><!DOCTYPEmapperPUBLIC"mybatisorgDTDMapperEN""http:mybatisorgdtdmybatismapperdtd"><mappernamespace="orgmybatisexampleBlogMapper"><selectid="selectBlog"parameterType="int"resultType="Blog">select*fromBlogwhereid=#{id}<select><mapper>这个简单的例子中看起来有很多额外的东西但是也相当简洁了。你可以在一个单独的XML映射文件中定义很多的映射语句除XML头部和文档类型声明之外你可以得到很多方便之处。在文件的剩余部分是很好的自我解释。在命名空间“commybatisexampleBlogMapper”中它定义了一个名为“selectBlog”的映射语句这样它允许你使用完全限定名“orgmybatisexampleBlogMapperselectBlog”来调用映射语句我们下面示例中所有的写法也是这样的。Blogblog=(Blog)sessionselectOne("orgmybatisexampleBlogMapperselectBlog",)要注意这个使用完全限定名调用Java对象的方法是相似的这样做是有原因的。这个命名可以直接给相同命名空间下的的映射类使用一个名称参数和返回值和已映射的查询语句都一样的方法即可。这就允许你非常容易地调用映射器接口中的方法这和你前面看到的是一样的下面这个示例中它又出现了。BlogMappermapper=sessiongetMapper(BlogMapperclass)Blogblog=mapperselectBlog()第二种方式有很多有点首先它不是基于文字的那就更安全了。第二如果你的IDE有代码补全功能那么你可以利用它来操纵已映射的SQL语句。第三不需要强制类型转换同时BlogMapper接口可以保持简洁返回值类型很安全(参数类型也很安全)。命名空间的一点注释如BlogMapper这样的映射器类来说还有一个妙招。它们中间映射的语句可以不需要在XML中来写而可以使用Java注解来替换。比如上面的XML示例可以如下来替换:packageorgmybatisexamplepublicinterfaceBlogMapper{Select("SELECT*FROMblogWHEREid=#{id}")BlogselectBlog(intid)}对于简单语句来说使用注解代码会更加清晰然而Java注解对于复杂语句来说就会混乱应该限制使用。因此如果你不得不做复杂的事情那么最好使用XML来映射语句。当然这也取决于你和你的项目团队的决定看哪种更适合你来使用还有以长久方式来使用映射语句的重要性。也就是说不要将自己局限在一种方式中。你可以轻松地将注解换成XML映射语句反之亦然。范围和生命周期理解我们目前已经讨论过的不同范围和生命周期类是很重要的。不正确的使用它们会导致严重的并发问题。SqlSessionFactoryBuilder这个类可以被实例化使用和丢弃。一旦你创建了SqlSessionFactory后这个类就不需要存在了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是本地方法变量)。你可以重用SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例但是最好的方式是不需要保持它一直存在来保证所有XML解析资源因为还有更重要的事情要做。命名空间在之前版本的MyBatis中是可选项非常混乱也没有帮助。现在命名空间是必须的而且有一个目的它使用更长的完全限定名来隔离语句。命名空间使得接口绑定成为可能就像你看到的那样如果之前不了解那么现在你就会使用它们了你应该按照下面给出示例的来练习以免改变自己的想法。使用命名空间并将它放在合适的Java包空间之下将会使你的代码变得简洁在很长的时间内提高MyBatis的作用。命名解析:为了减少输入量MyBatis对所有的命名配置元素使用如下的命名解析规则包括语句结果映射缓存等。直接查找完全限定名(比如“commypackageMyMapperselectAllThings”)如果发现就使用。短名称(比如“selectAllThings”)可以用来引用任意含糊的对象。而如果有两个或两个以上的(比如“comfooselectAllThings”和“combarselectAllThings”),那么就会得到错误报告说短名称是含糊的因此就必须使用完全限定名。SqlSessionFactory一旦被创建SqlSessionFactory应该在你的应用执行期间都存在。没有理由来处理或重新创建它。使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次。这样的操作将被视为是非常糟糕的。因此SqlSessionFactory的最佳范围是应用范围。有很多方法可以做到最简单的就是使用单例模式或者静态单例模式。然而这两种方法都不认为是最佳实践。这样的话你可以考虑依赖注入容器比如GoogleGuice或Spring。这样的框架允许你创建支持程序来管理单例SqlSessionFactory的生命周期。SqlSession每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中比如Serlvet架构中的HttpSession。如果你现在正用任意的Web框架要考虑SqlSession放在一个和HTTP请求对象相似的范围内。换句话说基于收到的HTTP请求你可以打开了一个SqlSession然后返回响应就可以关闭它了。关闭Session很重要你应该确保使用finally块来关闭它。下面的示例就是一个确保SqlSession关闭的基本模式:SqlSessionsession=sqlSessionFactoryopenSession()try{dowork}finally{sessionclose()}在你的代码中一贯地使用这种模式将会保证所有数据库资源都正确地关闭(假设你没有通过你自己的连接关闭这会给MyBatis造成一种迹象表明你要自己管理连接资源)。Mapper实例映射器是你创建绑定映射语句的接口。映射器接口的实例可以从SqlSession中获得。那么从技术上来说当被请求时任意映射器实例的最宽范围和SqlSession是相同的。然而映射器实例的最佳范围是方法范围。也就是说它们应该在使用它们的方法中被请求然后就抛弃掉。它们不需要明确地关闭那么在请求对象中保留它们也就不是什么问题了这和SqlSession相似。你也许会发现在这个水平上管理太多的资源的话会失控。保持简单将映射器放在方法范围内。下面的示例就展示了这个实践:SqlSessionsession=sqlSessionFactoryopenSession()try{BlogMappermapper=sessiongetMapper(BlogMapperclass)dowork}finally{sessionclose()}XML映射配置文件MyBatis的XML配置文件包含了影响MyBatis行为甚深的设置和属性信息。XML文档的高层级结构如下:configuration配置properties属性settings设置typeAliases类型命名typeHandlers类型处理器objectFactory对象工厂plugins插件environments环境environment环境变量transactionManager事务管理器dataSource数据源映射器properties这些是外部化的可替代的属性这些属性也可以配置在典型的Java属性配置文件中或者通过properties元素的子元素来传递。例如:<propertiesresource="orgmybatisexampleconfigproperties"><propertyname="username"value="devuser"><propertyname="password"value="FFa!TYyg"><properties>其中的属性就可以在整个配置文件中使用使用可替换的属性来实现动态配置。比如:<dataSourcetype="POOLED"><propertyname="driver"value="${driver}"><propertyname="url"value="${url}"><propertyname="username"value="${username}"><propertyname="password"value="${password}"><dataSource>这个例子中的username和password将会由properties元素中设置的值来替换。driver和url属性将会从包含进来的configproperties文件中的值来替换。这里提供很多配置的选项。属性也可以被传递到SqlSessionBuilderbuild()方法中。例如:SqlSessionFactoryfactory=sqlSessionFactoryBuilderbuild(reader,props)orSqlSessionFactoryfactory=sqlSessionFactoryBuilderbuild(reader,environment,props)如果在这些地方属性多于一个的话MyBatis按照如下的顺序加载它们:在properties元素体内指定的属性首先被读取。从类路径下资源或properties元素的url属性中加载的属性第二被读取它会覆盖已经存在的完全一样的属性。作为方法参数传递的属性最后被读取它也会覆盖任一已经存在的完全一样的属性这些属性可能是从properties元素体内和资源url属性中加载的。因此最高优先级的属性是那些作为方法参数的然后是资源url属性最后是properties元素中指定的属性。Settings这些是极其重要的调整它们会修改MyBatis在运行时的行为方式。下面这个表格描述了设置信息它们的含义和默认值。设置参数描述有效值默认值cacheEnabled这个配置使全局的映射器启用或禁用缓存。true|falsetruelazyLoadingEnabled全局启用或禁用延迟加载。当禁用时所有关联对象都会即时加载。true|falsetrueaggressiveLazyLoading当启用时有延迟加载属性的对象在被调用时将会完全加载任意属性。否则每种属性将会按需要加载。true|falsetruemultipleResultSetsEnabled允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动)。true|falsetrueuseColumnLabel使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动。true|falsetrueuseGeneratedKeys允许JDBC支持生成的键。需要适合的驱动。如果设置为true则这个设置强制生成的键被使用尽管一些驱动拒绝兼容但仍然有效(比如Derby)。true|falsefalseautoMappingBehavior指定MyBatis如何自动映射列到字段属性。PARTIAL只会自动映射简单没有嵌套的结果。FULL会自动映射任意复杂的结果(嵌套的或其他情况)。NONE,PARTIAL,FULLPARTIALdefaultExecutorType配置默认的执行器。SIMPLE执行器没有什么特别之处。REUSE执行器重用预处理语句。BATCH执行器重用语句和批量更新SIMPLE,REUSE,BATCHSIMPLEdefaultStatementTimeout设置超时时间它决定驱动等待一个数据库响应的时间。AnypositiveintegerNotSet()一个设置信息元素的示例完全的配置如下所示:<settings><settingname="cacheEnabled"value="true"><settingname="lazyLoadingEnabled"value="true"><settingname="multipleResultSetsEnabled"value="true"><settingname="useColumnLabel"value="true"><settingname="useGeneratedKeys"value="false"><settingname="enhancementEnabled"value="false"><settingname="defaultExecutorType"value="SIMPLE"><settingname="defaultStatementTimeout"value=""><settings>typeAliases类型别名是为Java类型命名一个短的名字。它只和XML配置有关只用来减少类完全限定名的多余部分。例如:<typeAliases><typeAliasalias="Author"type="domainblogAuthor"><typeAliasalias="Blog"type="domainblogBlog"><typeAliasalias="Comment"type="domainblogComment"><typeAliasalias="Post"type="domainblogPost"><typeAliasalias="Section"type="domainblogSection"><typeAliasalias="Tag"type="domainblogTag"><typeAliases>使用这个配置“Blog”可以任意用来替代“domainblogBlog”所使用的地方。对于普通的Java类型有许多内建的类型别名。它们都是大小写不敏感的由于重载的名字要注意原生类型的特殊处理。别名映射的类型bytebytelonglongshortshortintintintegerintdoubledoublefloatfloatbooleanbooleanstringStringbyteBytelongLongshortShortintIntegerintegerIntegerdoubleDoublefloatFloatbooleanBooleandateDatedecimalBigDecimalbigdecimalBigDecimalobjectObjectmapMaphashmapHashMaplistListarraylistArrayListcollectionCollectioniteratorIteratortypeHandlers无论是MyBatis在预处理语句中设置一个参数还是从结果集中取出一个值时类型处理器被用来将获取的值以合适的方式转换成Java类型。下面这个表格描述了默认的类型处理器。类型处理器Java类型JDBC类型BooleanTypeHandlerBooleanboolean任何兼容的布尔值ByteTypeHandlerBytebyte任何兼容的数字或字节类型ShortTypeHandlerShortshort任何兼容的数字或短整型IntegerTypeHandlerIntegerint任何兼容的数字和整型LongTypeHandlerLonglong任何兼容的数字或长整型FloatTypeHandlerFloatfloat任何兼容的数字或单精度浮点型DoubleTypeHandlerDoubledouble任何兼容的数字或双精度浮点型BigDecimalTypeHandlerBigDecimal任何兼容的数字或十进制小数类型StringTypeHandlerStringCHAR和VARCHAR类型ClobTypeHandlerStringCLOB和LONGVARCHAR类型NStringTypeHandlerStringNVARCHAR和NCHAR类型NClobTypeHandlerStringNCLOB类型ByteArrayTypeHandlerbyte任何兼容的字节流类型BlobTypeHandlerbyteBLOB和LONGVARBINARY类型DateTypeHandlerDate(javautil)TIMESTAMP类型DateOnlyTypeHandlerDate(javautil)DATE类型TimeOnlyTypeHandlerDate(javautil)TIME类型SqlTimestampTypeHandlerTimestamp(javasql)TIMESTAMP类型SqlDateTypeHandlerDate(javasql)DATE类型SqlTimeTypeHandlerTime(javasql)TIME类型ObjectTypeHandlerAny其他或未指定类型EnumTypeHandlerEnumeration类型VARCHAR任何兼容的字符串类型作为代码存储(而不是索引)。你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。要这样做的话简单实现TypeHandler接口(orgmybatistype)然后映射新的类型处理器类到Java类型还有可选的一个JDBC类型。例如:ExampleTypeHandlerjavapublicclassExampleTypeHandlerimplementsTypeHandler{publicvoidsetParameter(PreparedStatementps,inti,Objectparameter,JdbcTypejdbcType)throwsSQLException{psset

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/11
仅支持在线阅读

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部