MyBatis3官方中文文档

所需积分/C币:50 2017-12-26 10:56:55 1.25MB PDF
172
收藏 收藏
举报

MyBatis3官方中文文档高清 MyBatis3官方中文文档高清 MyBatis3官方中文文档高清 MyBatis3官方中文文档高清
诚然这种方式能够正常工作,并且对于使用旧版本 My Batis的用户来说也比较熟悉,不过现在有了一种更直白的方 式。使用对于给定语句能够合理描述参数和返回值的接口(比如说 BlogMapper class),你现在不但可以执行更清 晰和类型安全的代码,而且还不用担心易错的字符串字面值以及强制类型转换。 例如: SqlSession session sqlSessionFactory. openSession (); try t BlogMapper mapper session getMapper (BlogMapper. class); Blog blog mapper. selectBlog(101); f finally t session.C⊥ose 现在我们来探究一下这里到底是怎么执行的。 探究已映射的SQL语句 现在,或许你很想知道 SqIsession和 Mapper到底执行了什么操作,而SQL语句映射是个相当大的话题,可能会 占去文档的大部分篇幅。不过为了让你能够了解个大概,这里会给出几个例子。 在上面提到的两个例子中,一个语句应该是通过XML定义,而另外一个则是通过注解定义。先看XML定义这 个,事实上 My Batis提供的全部特性可以利用基于XML的映射语言来实现,这使得 My Batis在过去的数年间得以 流行。如果你以前用过 My Batis,这个枇念应该会比较熟悉。不过ⅩML映射文件已经有了很多的改进,随着文档 的进行会愈发清晰。这里给出一个基于XML映射语句的示例,它应该可以满足上述示例中 Sqlsession的调用。 <?xm1 version="1.8″ encoding="UTF-8”p> <!DOCTYPE mapper PUBLIC -//mybatis. org//DTD Mapper 3.0// EN http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org. mybatis. example. BlogMapper"> <select id="selectBlog" resultType="blog"> select from Blog where id #id] </select> </mapper> 对于这个简单的例子来说似乎有点小题大做了,但实际上它是非常轻量级的。在一个ⅩML映射文件中,你想定义 多少个映射语句都是可以的,这样下来,XML头部和文档类型声明占去的部分就显得微不足道了。文件的剩余部 分具有很好的自解释性。在命名空间"org. mybatis. example. BlogMapper"中定义了一个名为" select|og"的映射语 句,这样它就允许你使用指定的完全限定名 org. mybatis. example. BlogMapper. selectBlog'来调用映射语句,就像 上面的例子中做的那样: Blog blog =(Blog) session. selectone ("org. mybatis. example. BlogMapper selectBlog", 101); 你可能注意到这和使用完全限定名调用Java对象的方法是相似的,之所以这样做是有原因的。这个命名可以直接 映射到在命名空间中同名的 Mapper类,并在已映射的 select语句中的名字、参数和返回类型匹配成方法。这样你 就可以向上面那样很容易地调用这个对应 Mapper接口的方法。不过让我们再看一遍下面的例子 BlogMapper mapper session getMapper(Blog Mapper. class); Blog blog= mapper. selectBlog(101); 第二种方法有很多优势,首先它不是基于字符串常贔的,就会更安全;其次,如果你的IDE有代码补全功能,那 么你可以在有了已映射SQL语句的基础之上利用这个功能。 提示命名空间的一点注释 命名空间( Namespaces)在之前版本的 MyBatis中是可选的,容易引起混淆因此是没有益处的。现在的命名空 闫则是必须的,目的是希望能比只是简单的使用更长的完全限定名来更进一步区分语句 命名空间使得你所见到的接口绑定成为可能,尽管你觉得这些东西未必用得上,你还是应该遵循这里的规定以防哪 天你改变了主意。出于长远考虑,使用命名空间,并将它置于合适的Java包命名空间之下,你将拥有一份更加整 的代码并提高了 My Batis的可用性。 命名解析:为了减少输入量, My Batis对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命名 解析规贝! 完全限定名(比如" com.mypackage. MyMapper selectAllThings")将被直接查找并且找到即用。 短名称(比如“ selectAll Things")如果全局唯也可以作为一个单独的引用。如果不唯一,有两个或两个以上的相 同名称(比如" com foo. selectAll Things"和"com. bar. selectAll Things"),那么使用时就会收到错误报告说短名称 是不唯一的,这种情况下就必须使用完全限定名。 对于像 BlogMapper这样的映射器类( Mapper class)来说,还有另一招来处理。它们的映射的语句可以不需要用 XML来做,取而代之的是可以使用Java注解。比如,上面的ⅩML示例可被替换如下: package org. mybatis example; public interface BlogMapper t @Select("select from blog WheRE id=fid") Blog selectBlog(int id)i 对于简单语句来说,注解使代码显得更加简洁,然而Java注解对于稍微复杂的语句就会力不从心并且会显得更加 混乱。因此,如果你需要做很复杂的事情,那么最好使用ⅩML来映射语句 选择何种方式以及映射语句的定义的一致性对你来说有多重要这些完全取决于你和你的团队。换句话说,永远不要 拘泥于—种方式,你可以很轻松的在基于注解和ⅪL的语句映射方式间自由移植和切换 作用城( Scope)和生命周期 理解我们目前已经讨论过的不同作用域和生命周期类是至关重要的,因为错误的使用会导致非常严重的并发问题。 提示对象生命周期和依赖注入框架 依赖注入框架可以创建线程安全的、基于事务的Sq| Session和映射器( mapper)并将它们直接注入到你的bean 中,因此可以直接忽略它们的生命周期。如果对如何通过依赖注入框架来使用 MyBatis感兴趣可以研究-下 My Batis-Spring或 My Batis- Guice两个子项目。 Sqlsession Factory Builder 这个类可以被实例化、使用和丢弃,一旦创建了 SqIsession Factory,就不再需要它了。因此 Sqlsession Factory Builder实例的最佳作用域是方法作用域(也就是局部方法变量)。你可以重用 Sq| Session Factory Builder来创建多个 SqlSession Factory实例,但是最好还是不要让其一直存在以保证所有的 XML解析资源开放给更重要的事情。 SqlsessionFactory SqlSession Factory-旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 sq| Session Factory的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqIsessionFactory被视为_种代 码坏味道( bad smell)"。因此 Sqlsession Factory的最佳作用域是应用作用域。有很多方法可以做到,最简单的 就是使用单例模式或者静态单例模式。 Sqlsession 每个线程都应该有它自己的 Sqlsession实例。 Sqlsession的实例不是线程安全的,因此是不能被共亨的,所以它 的最佳的作用域是请求或方法作用域。绝对不能将 Sqlsession实例的引用放在一个类的静态域,甚至一个类的实 例变量也不行。也绝不能将 Sqlsession实例的引用放在任何类型的管理作用域中,比如 Servlet架构中的 Http Session。如果你现在正在使用一种web框架,要考虑 Sqlsession放在一个和HTP请求对象相似的作用域 中。换句话说,每次收到的HTTP请求,就可以打开一个Sqlsession,返回一个响应,就关闭它。这个关闭操作 是很重要的,你应该把这个关闭操作放到fnay块中以确保每次都能执行关闭。下面的示例就是一个确保 Sq| Session关闭的标准模式: SqlSession session sqlSession Factory. open Session try i do work finally i session. close(; 在你的所有的代码中—致性地使用这种模式来保证所有数据库资源都能被正确地关闭。 映射器实例( Mapper Instances) 映射器是创建用来绑定映射语句的接口。映射器接口的实例是从 SqISession中获得的。因此从技术层面讲,映射 器实例的最大作用域是和 Sqlsession相同的,因为它们都是从 SqlSession里被请求的。尽管如此,映射器实例的 最佳作用域是方法作用域。也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可废弃。并不需要 显式地关闭映射器实例,尽管在整个请求作用域( request scope)保持映射器实例也不会有什么问题,但是很快 你会发现,像 Sqlsession一样,在这个作用域上管理太多的资源的话会难于控制。所以要保持简单,最好把映射 器放在方法作用域( method scope)内。下面的示例就展示了这个实践 Sqlsession session sqlSessionFactory. openSession(); BlogMapper mapper session getMapper(BlogMapper. class) // do work f finally t session. close(; Copyrighto2009-2017Mybatis.Org(http://www.mybatis.org/).Allrightsreserved XML映射配置文件 My Batis的配旹文件包含了会深深影响 My Batis行为的设黉( settings)和属性( oroperties)信息。文档的顶层结构如下 configuration配置 o properties属性 o typeAliases类型别名 o typeHandlers类型处埋器 o objectFactory对象工厂 o plugins攉件 o environments环境 environment环境变量 transactionManager事务管理器 a data Source数据源 database ld Provider数据库厂商标识 o mappers映射器 properties 这些属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,亦可通过 properties元素的子元素来传谛。例如: e="org/mybatis/example/config. properties"> <property name="username" value="dev user"/ roperty name="pas sword"value="F2Fa3133TYyg"/> </pr。 perties 其中的属性就可以在整个配置文件中使用来替换需要动态配置的属性值。比如: <data Source type="POOLED> <property name="driver"value=$driver]"/> property name="url"valuc="Surl)"/> <property name="username"value="Username"/> <property namc="pas sword" valuc="$password"/> </dataSource> 这个例子中的 username和 password将会由 properties元素中设置的相应恒来替换。drⅳer和ur属性将会由coη fig properπes文件中对应的值来替換。这样就为配置提倛了 诸多灵活选择 属性也可以被传递到 SqISession Factory Builder. build(方法中。例如 Sqlsession Factory factory new SqlSession FactoryBuilder (.build (reader, props) or. SqlSession Factory factory new SqlSession Factory Builder(.build(reader, environment, props) 如果属性在不只—个地方进行了配置,那么 My Batis将按照下面的顺序来加载 仕 元素体内指定的性首先被读取 然后根据 properties元素中的 resource属性读取类路径下属性文件或根据uη属性指定的路径渎职属性文件,并覆盖已读取的同名属性。 最后读取作为方法参数传递的爲性,并覆盖已读取的同名属性 因此,通过方法参数传递的属性具有最高优先级, resource/u属性中扫定的配置文件次之,最低优先级的是 properties属性中指定的属性 从 My Batis34.2开始,你可以为占位符指定一个默认值。例如 <dataSource type="POOLED"> <property name="username"value="username: ut user]/><!--If 'username property not present, username become ut_user </datasource> 这个特性默认是关闭的。如果你想为占位符指定一个默认值,你应该添加一个指定的属性来开启这个特性。例如 <properties resource="org/mybatis/example/config.properties"> <property name="org. apache ibatisparsing Property Parser. enahle-default-value"value=true"/><!-- Enable this feature --) </properties) NoTE你可以使用":"作为属性键(eg.d: Username)或者你也可以在sq定义中使用OGNL表达式的三元运算符(eg.s4-ah'eame!=n112- ableName glσ bal constεnts'}),你应该通过增加一个指定的属性来改变分限键和默认值的字符。例如: properties resource="org/mybatisexample/ config. properties"? property name="org. apache ibatis parsing. Property Parser. default-valuc-scparatorvaluc="?: "/><!--Change default value of separator </properties <dataSource type="POOLED"> <property name="username"value="sidb: username?: ut </datasource> settings 这是 MyBatis中极为重要的调整设置,它们会改变 MyBatis的运行时行为。下表描述了设置中各项的意图、默认值等。 设置参数 描述 有效值 默认值 cache Enable 该配置影响的所有映射器中配置的缓存的仝局开关。 true false true lazyLoading Enabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系 true false false 中可通过设置 etch'l'ype属性来夏盖该项的开关状态 aggressiveLazyLoad ing 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需 true false false(true in $3.4.1) 加载(参考1 azyLoadTricgerMethoss) multipleResult Sets Enabled 是否允许单一语句返回多结果集(需要兼容驱动) true false true use Columnlabel 使用列标签代替列名。不同的驱动在这方面会有不同的表现,具体可参考相关true| false true 驱动文档或通过测试这两种不同的模式来观察所用驱动的结果 use GeneratedKeys 允许JDBC支持自动生成主键,需要驱动容。如果设置为true则这个设置强 true false False 制使用自动生成主鍵,尽管一些驱动不能兼容但仍可止常工作(比如 Derby)。 autoMapping Behavior 指定 My Batis应如何自动映射列到字段或属性,NONE表示取消自动映射; NONE PARTIAL FULL PARTIAL PARTIAL只会自动映射没有定义嵌套结果集映射的结果集。F∪ULL会自动映射 任意复杂的结果集(无论是否嵌套)。 autoMapping Unknown Column Behavior指定发现自动映射目标未知列(或者未知寓性类型)的行为。 NONE WARNING. NONE NoNE:不做任何反应 FAILING RIG:输出提醒日志 ('crg apache -batis. sessicn. Au-cMappiagUnknownColumnBehavior 的日志等级必须设置为wR) ·EA工LⅣG:映射失败(抛出 sqlsessionExcEp-ion) defaultEXecutor Type 配置默认的抹行器。 SIMPLE就是普通的执行器; REUSE执行器会重用预处理 SIMPLE REUSE SIMPLE 语句( prepared statements); BATCH执行器将車用语句并执行批量吏新。 BATCH default statementTimeout 设置超时时间,它决定驱动等待数据库响应的秒数。 任意正整数 Not Set (null) defaultFetch Size 为驱动的结果集获取数量( fetch Size)设置一个提示值。此参数只可以在查询任意正整数 Not Set (null) 设黉中被蓿盖 safeRow BoundsEnabled 允许在嵌套语句中使用分页( Row Bounds)。如果允许使用则设置为fase。 true false safeResultHandlerEnabled 允许在嵌套语句中使用分页( ResultHandler)。如果允许使月则设置为 false。true| false ne mapUnderscore ToCamelCase 是否开启自动驼峰命名规则( camel case)映射,即从经典数据库列名 true false False A_ COLUMN到经典Java属性名 acolumn的类似映射。 local Cache Scope My Batis利用本地线存机制( Local cache)防止循环引用( circular SESSION SESSION references)和加速重复嵌套查询。默认值为 SESSION,这种情况下会缓存- STATEMENT 个会话中执行的所有耷询。若设置值为 STATEMENT,本地会话仅用在语句执 行上,对相同 Sqlsessior的不同调用将不会共享数据 cTypeForNull 当没有为参数提供特定的JDBC类型时,为空值指定JDBC类型。某些驱动需 Jdbctype enumeration. OTHER 要指定列的JDBC羹型,多数情况直接用般类型即可,比如NULL Most common are VARCHAR或 OTHER。 NULL, VARCHAR and OTHER lazyLoad Methods 指定哪个对象的方法触发一次延迟加载。 A method name list equals, clone, hash Code, tostr default ScriptingLanguage 指定动态SQL生成的默认语言。 a type alias or fully org. apache ibatis scripting xr qualified class name defaultEnum TypeHandle Specifies the TypeHandler used by default for Enum ( Since: 3.4.5) a type alias or fully org. apache ibatis type Enum qualified class name callSetters On Nulls 指定当结果集中值为nu的时候是否调用映射对象的 setter(map对象时为tue| false fals put)方法,这对于有Map. key Seto依赖或n山值初始化的时候是有用的。注 意基本类型(int、 boolean等)是不能设置成nu的 returnInstance ForEmpty Row 当返回行的所有列都是空时, My Batis默认返回nu11。当开启这个设置时 true false false MyBatis会返回一个空实例。请注意,它也适用于嵌套的结果集(.e. collectioin and association).(从342开始) logPre 指定 My Batis増加到日志名称的前缀 Not set 设置参数 描述 有效值 默认值 指定 MyBatis所用日志的具体实现未指定时将自动查找。 SLF4J1 LOG4J I Not set JDK LOGGING I COMMONS LOGGING I STDOUT LOGGING I NO LOGGING proxy Factory 指定 Mybatis创建具有延迟加载能力的对象所用到的代理工具 CGLIB JAVASSIST JAVASSIST(My Batis 3.3 or a siMpl 指定ⅤFS的实现 自定义VFS的实现的类 Not set 全跟定名,以逗号分 隔: useActualParamName 允许使用方法签名中的名称作为语句参数名称。为了使用该特性,你的工程必 true false true 须采用Java8编译,并且加上- pararmeters选项。(从3.4.1开始) 指定一个提供C11mrat10实例的关这个被返国的cang实例是用来类型别名或者全类名 Not set 加载被反序列化对象的懶加载属性值.这个类必须包含一个签名方法 static Configuration getConfigcration(.(从3.2.3版本开始) 一个配置完整的 settings元素的示例如下 <settings> <setting name="cache Enabled"value="true"/> <setting name="lazy LoadingEnabled"valuc="truc"/> <setting name="ultipleResultSetsEnabled"value="true"/> <setting name-useColumnLabel"value-"true"/ <setting name"useGeneratedKeys"value"false"/> <setting name="autoMappingBehavior" value="PARTIAL"/ <setting name"autoMappingUnknown ColumnBehavior"value="WARNING"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="dcfaultstatcmentTimcout" valuc="25"/> <setting name="defaultFetchsize" value="100"/> <setting name="safcRowBounds Enabled"valuc="falsc"/> <setting name="mapUnderscore ToCamelCase" value=false"/> <setting name="localCacheScope"value-"SESSION"/> <setting name- jdbc Type ForNull"value=OTHER"/> <setting name="lazy LoadTriggerMethods"value="equals, clone, hashCode, tostring"/ : settings> typeAliases 类型别名是为Java类型设置一个短的名字。它只和ML配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如 <typeAliases> <typeAlias alias="Author" type="domain. blog Author" /> type="doma <typeAlias alias="Comment"type="domain. blog Comment"/ <typeAlias alias="Post. type="domain. blog. Past"/> <typeAlias alias="Scction" typc="domain. blog. Scction"/> <typeAlias alias=Tag"type="domain. blog. Tag"/> </typeAliases> 当这样配置时,Bog可以用在任何使用 do main.blog.B1og的地方。 也可以指定一个包名, My Batis会在包名下面搜索需要的 Java Bean,比如 <typeAliases> <package name-"domain. blog"/> :/typeAliases> 每一个在包 domain.blog中的 Java bean,在没有注解的情况下,会使用Bean的首字母小写的非限定类名来作为它的别名。比如 domain,k1og. A:thor的别名为 authcr;若有注解,则别名为其注解值。看下面的例子 aLias("author pub⊥ ic class Author{ 已经为许多常见的Java美型內建了相应的类型别名。它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理。 别名 映射的类型 byte byte short 别名 映射的类型 double double float string byte Byte g short double Float boolean Boolean date Date bigdecimal BigDecimal map hashmap HashMap arraylist collection Collection iterator typeHandlers 无论是 My Batis在预处理语句( PreparedStatement)中设黉一个参数时,还是从结果集中取出—一个值时,都会用类型处理器将获取的值以合适的方式转换成Java类型。下表 描述了一些默认的类型处理器。 NOTE Since version 3.4.5, The My Batis has been supported JSR-310(Date and Time APl by default 类型处理器 Java类型 JDBc类型 BooleanfypeHandler java. lang Eoolean: boolean 数据库兼容的 RyteT yne Handler java.l ang. Rye, byt e 数据库兼容的 NIIMRTO:或3YT只 ShortType Handler java. lang. Short, short 数据库兼容的 NUMERIC或3 EORT INTEGER IntecerTypeHandler Gava.lang. Integer, int 数据库兼容的 NUMERIC或 INTECER T'voeHandler jaa.1ang.⊥ong:ong 数据库兼容的 NUMERIC或LM⊥NEGs FloatType Handler java. lang Float, float 数据库兼容的 NUMERIC或FoAT DouDleTypeHandler Java. lang. Double, double 数据库兼容的 NUMERIC或3UBIE BIgDecima⊥ pahAng-ex aa.math.坦 igLecimal 数据库兼容的 NUMERIC或 LC⊥ⅣA StrirgTypeHandler java.lang.Sting HAR WARCHAR CloDReade-IypeHand_er java. io. Reader c1≈ TyoeHandle aya.⊥ang. string CLOB, LONGVARCHAR NStringTypeHandler java. lang String NUAR二FAR, NCFAT NClobTypeHandler java. lang. String

...展开详情
试读 72P MyBatis3官方中文文档
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • 分享宗师

关注 私信
上传资源赚钱or赚积分
最新推荐
MyBatis3官方中文文档 50积分/C币 立即下载
1/72
MyBatis3官方中文文档第1页
MyBatis3官方中文文档第2页
MyBatis3官方中文文档第3页
MyBatis3官方中文文档第4页
MyBatis3官方中文文档第5页
MyBatis3官方中文文档第6页
MyBatis3官方中文文档第7页
MyBatis3官方中文文档第8页
MyBatis3官方中文文档第9页
MyBatis3官方中文文档第10页
MyBatis3官方中文文档第11页
MyBatis3官方中文文档第12页
MyBatis3官方中文文档第13页
MyBatis3官方中文文档第14页
MyBatis3官方中文文档第15页

试读结束, 可继续读5页

50积分/C币 立即下载 >