Mybatis 3官方中文文档

所需积分/C币:38 2018-05-23 13:55:20 20.61MB PDF
61
收藏 收藏
举报

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 官方文档地址:http://www.mybatis.org/mybatis-3/zh/index.html 此文档是个人整理出来的PDF 文档日期:2018年3月12日
</mapper> 对于这个简单的例子来说似乎有点小题大做了,但实际上它是非常轻量级的。在一个XM映射文件中,你想定义多少个映射语句都是可以 的,这样下来ⅩML头部和文档类型声明占去的部分就显得微不足道了。文件的剩余部分具有很好的自解释性。在命名空 叵 org.mybatis. example. BlogMapper中定义了一个名为' selectBlog的映射语句,这样它就允许你使用指定的完全張定 名 org. mybatis. example, BlogMapper. selectBlog来调用映射语句,就像上面的例子中做的那张样 Blog blog 0CBl0g0 session .selectone ("org. mybatis. example. BlDgMapper. selectBlDg01010: 你可能注意到这和使用亢全限定名调用Java对象的方法是相以的,之所以这样做是有原因的。这个命名可以直接欥射刭在命名空间中同名 的 Mapper类,并将已映射的 select语句中的名字、参数和返回类型匹配成方法。这样你就可以像上面那样很容易地调用这个对应 Mapper接口的方法。不过让我们再看一遍下面的例子 BlogMapper mapper= session. getMapper(BlogMapper class B-og blog= mapper. selectBlog (101) 第二种方法有很多优势,首先它不是基于字符串常量的,就会更安全;其次,如昊你的IDE有代码补全功能,那么你可以在有了已射 SQL语句的基础之上利月这个功能。 是示命名空间的一点注释 命名空闾( Namespaces)在之前版本的 My Batis中是可选的,这样容易引起混淆因此毫无益处。现在命名空间则是必须的,且意于简单 地用更长的完全艰定名来隔离语句 命名空间使得你听见到的接匚绑定成为可能,尽笆你觉得这些东匹未必用得上,你还是应该遵循这里的规定以防哪天你改变了主意。出于 长远考虑,使用命名空间,并将它置于合适的Java包命名空间之下,你将拥有一份更加整洁的代码并提高了 MyBatis的可用性。 命名解析:为了减少瑜入量, My Batis对所有的命名配置元素(包括语句,结果映射,绥存等)使用了如下的命名解析规则 完全定名(比如" com mypackage. My Mapper. selectAllThings")将被直接查找并且找到即用。 ·短名称(比如 selectAlIThings")如果全局唯一也可以作为一个单独的引用。如果不唯一,有两个或两个以上的相同名称(比 如" com. foo. selectAllThings'和" com. bar. selectAlIThings"),那么使用时就会收到错误报告说短名称是不唯的,这种情况下就必须使用 完仝限定名 对于像 BlogMapper这样的映射器类( Mapper class)来说,还有另一招来处理。它们的映射的语句可以不需要用ⅩML来做,取而代之的 是可以使用Java注解。比如,上面的XML示例可被替换如下 ackage org. mybatis. example: oublic interface BlogMapper sElect( " sELECT FROM blog WHERE id = #(id") B_og selectBlog(int id); } 对于笥单语句来说,注解使代码显得更加简洁,然而Java注解对于稍微复永的语句就会力不从心并且会显得更加混乱。因此,如果你需要 做很复杂的事情,那么最好使用XML来映射语句。 先择何种方式以及映射语勺的定义的一致性对你来说有多重要这些完全取决于你和你的团队。换句话说,永远不要拘泥于一种方式,你可 以很轻松的在基于注解和ⅫML的诌句映射方式自由移和切换。 作用域( Scope)和生命周期 理解我们目前已经讨论过的不同作用域和生命周期类是至关重要的,因为错误的使用会导致非常严重的并发问题。 是示对象生命周期和依赖注入框架 依赖注入框架可以创建线安全的、基于事努的 SqIsession和玦射器( mapper)并将它们直接注入到你的bean中,因此可以直接忽略它 们的生命周期。如果对如何通过依赖注入框架来使用 My Batis感兴可以研究一下 My Batis-Spring或 My Batis-Guice两个子项目。 SqlsessionFactory Builder 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSession Factory,就不再需要它了。因此 Sqlsession Factory Builder实例的最佳作用域 是方法作用域(七就是局部方法变量)。你可以重用 SqlSession Factory Builder来创建多个 SqlSessionFactory实例,但是最好还是不要 让其一直存在以保讧所有的ⅪML解析资源开放给更重要的事情。 SqlSession Factory SqISessionFactαy一旦被创建就应该在用的运行期间一直存在,没有任何理由对它进行清除或重建。使用Sq| Session Factory的最佳实 践是在应用运行期间个要重复创建多次,多次重建 SqISessionFactory被视为一种代码“坏味道( bad sme)"。因此 SqlSession Factory的 最佳作用或是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式 Salsession 毎个线程都应该有它自己的 SqISossion实例。 Sqlsossion的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请狡 或方法作用域。绝对不能将 SqlSession实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession实例的 引用放在任何类型的管理作用域中,比如 Servlet架构中的Htφ Session。如果你现在正在使一种web框架,要考虑Sq丨 Sessioη放在一 个和HTTP请求对象相似的作用域中。换句话说,每次收到的HTP请求,就可以打开一个Sqlsession,返回一个响应,就关它。这个 关闭操作是很重要的,你应该把这个关闭操作放到inay块中以确保毎次都能行关闭。下面的示例就是一个确保 Sqlsession关闭的标准 模式 qlSession session= sqlSession Factory, open Session(j ) finally i ession, close(; 在你的所有的代码中—致性地使用这种模来保证所有数据库资源都能被正确地关闭 映射器实例( Mapper Instances) 映射器是一个你创建来绑定你映射的语句的接口,映射器接口的实何是从 Sqlsession中获得的。因此从技术层面讲,任何呋射器实例的最 大作用琙是和请求它们的 Sqlsession相同的。尽管如此,映射器实例的最佳怍用域是方法作用域。也就是说,玦射器实例应该在调用它们 的方法中破请求,用过之后即可废弃。并不需要显式地关闭映射器实例,尽管在整个请求作用域( request scope)保持殃射器实例也不会 勻什么问题,但是很快你会发现,像 Sqlsession一样,在这个作用或上管理太多的资源的话会难于控制。所以要保芍简单,最好把欥封器 放在方法作用域( method scope)内。下面的示例就展示了这个实践 Sqlsession session= sqlSessionFactory open Session(); ry i B-ogMapper mapper= session. getMapper (BlogMapper c-ass); //do work )finally i session.close(); XML映射配置文件 My Batis的配置文件包含了会深深影响 MYBatis行为的设置( settings)和属性( oroperties)信息。文档的顶层结构如下 configuration 配 o properties屈性 ° settings设苣 o typeAliases类型别名 o typeHandlers类型处理器 o obiectFactory对象工厂 plugins插件 o environments环境 environment环境变量 transactionManager事务管坦器 data source数据源 databased Provider数据库厂商标识 0 mappers映射器 properties 这些属性都是可外部配置且可动态换的,既可以在典型的Java属性文件中配置,亦可通过 properties元素的子元素来传递。例如 <properties resource="org/mybatis/example/config. properties"> <property name="username"value=dev_user"/> <property name="password"value="F2Fa3133TYyg"/> </properties> 然后其中的属性就可以在整个配置文件中被用来替换需要动态配置的属性值。比如 dataSource type-"POOLED> <property name="driver" value="sidriver'/> <property name-"url"value-"s(url)"/ <property name="username"value="stusernane)"/> property name="password"value=password)"/> </dataSource> 这个例子中的 username和 password将会由 properties元素中设置的相应值来替换。 driver和u属性将会由 config. properties文件中对 应的值来替换。这样就为配貲提供了诸多灵活诜择 屣性也可以被传递到 SqlSessian Factory Builder. build(方法中。例如 SqlSessionFactory factory =new SqlSessionFactoryBuilder().build(reader,props SqlSession Factory factory-new SqlSessionFactoryBuilder().build(reader, environment, props 如果属性在不只一个地方进行了配置,那么 My Batis将按照下面的顺序来加载 在 properties元索体內指定的属性首先被读取 然后根据 properties元素中的 resource属性读取类路径下属性文件或棖据ur属性指定的径读取属性文件,并獨盖已读取的同名属 ·最后读取作为方法参数传递的属性;并覆盖已读取的司名禹性。 因此,通讨方法参数传递的属性有最高先级, resource/url属性中指定的醺文件次之,最低优先级的是 properties属性中指定的属 从 MyBatis34.2开始,你可以为占位符指定一个默认值。例如 dataSource type="POOLED"> <property name="username"value="sfusernane: ut_user]"/><!-- If username property not present, username become ' ut_use </dataSource> 这个特性默认是关闭的。如果你想为占位符指定一个默认值,你应该添加一个指定的属性来开启这个特性。例如 <properties resource="org/mybatis/example/config. properties"> <property name="org. apacheibatis parsing. PropertyParser enable-default-value"value=true"/><!-- Enable this featur </properties> 是云你可以使用":"作为属性键(eg.ch: username)或者你也可以在sq啶义屮使用GNL表达式的三元运算符(e.g.s{ tab eName!- nulll? tahleName:" g_chal const ants}),你应该通过增加一个指定的属性来改变分隔键和默认值的字符。例如 <properties resource="org/mybatis/example/config.properties"> <property name="org. apacheibatis parsing. PrcpertyParser default-value-separator" value="?: " /><l--Charge default value of separator--> </properties> <dataSource type="POOLED"> <property name="username"value=$idb: username?: ut_user)"/> </dataSource> settings 这是 MyBatis中极为重要的调整设置,它们会攻变 MyBatis的运行时行为。下表描述了设置中各项的意图、默认值等。 设置参数 描述 有效值 默认值 cache Enabled 全局地开启或关闭配置文件中的所勻映射器已经配置的任何缎存。 true false true lazyLoadingEnabled 延迟加载的全局开关,当开启时,所有关联对象都会延迟加载.特定关联 true false false 关系中可通过设置 fctchTyp属性来覆盖该项的开关状态, aggressiveLazy Loading 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会 true false false( true in s3.4.1) 按需加载(参考1 azyLoadTrigger Methods) multiple ResultsetsEnabled 是否允许单一语句返回多结果集(需要策容驱动)。 rue false useColumnLabel 使用列标签代替列名。不同的驱动在这方面会有不同的表现,具体可参考 true false true 相关驱动文档或通过测试这两种不同的模式来观察所月驱动的结果 seGeneratedKeys 允许JDBC支持自动生成健,需要驱动兼容。如果设置为true则这个设 true false False 置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 autoMappingBehavior 拒定 My Batis应如何自动映射列刭字段或属性,NONE表小取消自动映NONE, PARTIAL, FULL PARTIAL 射; PARTIAL只会自动映射没有定义嵌套结果集玦射的结果集。FULL会 自动映射任意复杂的结果集(无论是否嵌套) autoMappingUnknowncolumn Behavior指定发现自动映射目标未知列(或者未知性类型)的行为。 NONE, WARNIN NONE ·MvF:不做任何反应 FAILING · VARNING:输出提醒日志 org. apache ibatis scssion. AutoMappirgUnknowr ColunnBchavior l 的日志等级必须设置为ARN) EAIs映射失败(抛出 SglsessionException) detaultExecutor Type 配置默认的行。 SIMPLE就是普通的执行器; REUSE执行器会重用预 SIMPLE REUSE SIMPLE 处理语句( prepared statements); BATCH执行器将重月语句并执行批 BATCH 量更新。 defaultstatementTimeout 设置超时时间,它决定驱动等待数据库响应的秒数。 任薏正整数 Not Set(null defaultFetch Size 为驱动的结果集获取数量( fetch size)设置一个提示值。此参数只可以在任意正整数 Not Set(null) 查询设旹中被覆盖 safe Row Bounds 允许在嵌套语句中使用分页( Row Bounds)。如果允许使用则设置为 rue false saferesulthandlerenabled 允许在嵌套语句中使用分页( ResultHandler)。如果允许使用则设置为 true false Tr mapUnderscore ToCameICase 是否开启自动驼峰命名规则( camel case)映射,即从经典数据库列名 true false A COLUMN到经典Java属性名 a Column的类似映射。 localCache Scope My Batis利用本地嫒存机制( Local cache)防止循环引用( circular SESSION I SESSION references)和加速重复该套查询。默认值为 SESSION,这种情况下会缓 STATEMENT 存一个会话中执行的所有查询.若设置值为 STATEMENT,本地会话仅用 在语句执行上,对相同 Sqlsession的不冋调用将不会共享数据。 jdbcType ForNull 当没有为参数提供特定的JDBc类型时,为空值指定JDBC类型,某些驱 JdbcType常量大多都 OTHER 动需要指定列的JDBC类型,多数情况直接用一般类型即可,比如NULL、为:NULL, VARCHAR VARCHAR或 OTHER and oTHER lazyLoadTriggerMethods 指定哪个对象的方法轴发一次延迟加载。 用逗号分隔的方法列 equals, clone hashCc default ScriptingLanguage 指定动态SQL生成的默认语言。 个类型别名或完全狠 org. apache ibatisscr 定类名 defaultEnumTypeHandler 捐定Enum使用的默认 TyoEHand"er,(从3.4.5开始 个类型别名或完全張 org. apache ibatis typ 定类名。 lI Setters OnNulls 指定当结果集中值为nu的时候是杏调用映射对象的 setter(map对象时 true false 为pu)方法,这对于有 Map key Set()依赖或mu值初始化的时候是有用 的。注意基本类型〔int、 boolean等)是不能设置成nu的。 eturnInstance For Empty Raw 当返回行的所有列都是空时, My Batis默认返回n:1l.当开后这个设置时, true false MyBatis会返回一个空实例。请注意,它也适用于嵌套的结果集(e collectioin and association)。(从342开始) log Prefix 指定 MYBatis增加到日志名称的前缀。 任何字符串 logImpl 指定 MvBalis所用日志的貝休实现,未指定时将自动查找。 SLF4J LOG4J I Not sel LOG4J2 I JDK LOGGING I COMMONS LOGGING STDOUT LOGGING proxy actory 指定 Mybatis创建具有延迟加载能力的对象所用到的代理工具 CGLIB JAVASSIST JAVASSIST(My Batis 指定∨FS的实现 自定义VFS的实现的类 Not set 全限定名,以逗号分 useActualParam Name 允许使用方法签名中的名称作为语句参数名称。为了使用该特性,你的工 true false true 程必须采用Jav8编译,并旦加上 paramete选项。(从341开始) configurationFactory 指定一个提供 Cuull-yuralio实例的类.这个被返回的 Configuration实例用类型别名或者全类名. Not set 来加载被反序列化对象的懒加载属性值。这个类必须包含一个签名方法 static Confiquration getconfiqurat:on().(从3.23版本开始) 一个配完整的 settings元素的示例如下 <settings> <setting name-cacheEnabled"value="true/> <setting name="lazyLoading Enabled"value=true"/> <setting name=multipleResultSetsEnabled"value="true"/> <setting name="usecolumnLabel"value="true"/ <setting name="useGeneratedkeys" value="false"/> etting na appingBehavior <setting name="autoMappingUnknown ColumnBehavior"value="WARNING"/> ing name="defaUlt Executor Type"value="SIMPLE"/ <setting name="defaul-StatementTimeout"value=25"/ <setting name=defaultFetchsize"value="100"/> <setting name-"safeRowBcundsEnabled"va-ue-"false"/> <setting name="mapUrderscore ToCamelCasevalue="false"/> <setting name"localCacheScope"value-"SESSION"/> <setting name="jdbcTypeForNull"value=OTHER"/> setting name="lazyLoadIriggerMethods value="equals, clone, hashcode, tostring"/> </settings> typeAliases 类型别名是为Java类型设置一个短的名字。它只和ⅩML配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如 <typeAliases <LypeAlias alias="Author"Lype="domain.blog Author"/> <typeAlias alias="Blog"type="domain.blogBlog"/> <typealias alIas="comment"type="donain.blog.cOmment"/ <typeAlias alias="Pos:"type="domain.blog Post"/> <typeAlias alias="Tag"type=domain,blog. Tag"/> </typeAliases> 当这样配置时,1og可以用在任何使用 domain. Clog.B1g的地方 也可以指定一个包名, MyBatis会在包名下面搜索需要的 Java bean,比如 <package name="domain. blog"/> /typeAli 每一个在包 domain,109中的 Java bean,在没有注解的情况下,会使用Bean的首字母小写的非限定类名来作为它的别名。比如 domain,bog, Author的别名为 auther;若有注解,则别名为貝注解值。看下面的例子 public class author t 这是一些为常见的Java类型内建的应的类型别名。它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理 别名 映射的类型 byte byte long long short integer float float olean boolean byte Byte ong g Integer Intege double Double Float date BigDecimal bigdecimal Object map p arraylist collection Collection iterator Iterator typeHandlers 无论是 MyBatis在预处理语句( Preparedstatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值 以合适的方式转换成Java类型。下表描述了一些默认的类型处理器 是示从34.5开始, My Batis默认支持JsR-310(日期和时间AP) 类型处理器 Java类型 JDBc类型 BooleanTypeHandler ]ava,ang, Boolean, boolean数据库兼容的go,A BytelypeFandle lava. lang Eyte, bvte 数据库兼容的MnER或vTF ShortTyoc Handler Java. lang. short, short 数据库兼容的 NUMERIC或 SHORT INTEGER tegerTypeHandler Java. Lang. Integer, int 数据库兼容的 NUMERIC或 INTEGER Long 1ava,⊥anq,Lonq,lonq 数据库兼容的 NIJMERTO或 ONG TVTEGEE Float TypeHandler Java. lang Float, flcat 数据库兼容的NERC或LOPT DoublcTypcHandlor Java. ldny. Doulle, double 数据库兼容的 NUMERIC或 BOUELE eig-ecimalTypeHandler Java. math. BigDec-mal 数据库兼容的 NUMERIC或 DECIMAL St ri ngTypeHand lar Java. ang string CHAR VARCHAR ClobReaderTypeHandler Java, ic, Reader lobl ypehandlex Tava. lang string CLOE, LCNGVARCHAR NStringTypeHandler Jave. lang string NVARCHAR, NCHAR NClobTypellandler ava. lang String NCLOE ElobInputstreamTypeHandler Java ic. Inrutstream BytcArrayTypcHanclcr byte[ 数据库兼容的字节流类型 BloJIypeFandle- BLH,LN(√ARH⊥NARY DateTypelandlex nava util. Date TIMESTAMP DateOnlyTypeHandler nava.util. Date DATE TimeOnlyTypcHandler Java. util. Date TIME SyiTimestamoTypeHandler lava, scl, Timestamp TIMESTAMP Sq-DatefypeHandler Java. sql, Jate DATE Sqi TimeTypellandler ava. sql, Time bjectTyre Handler ny An 0THER或未指定类型 Enum ypeEandle: Enumeration Type VARCHAR任何兼容的字符串类型,存储枚举的名称(而不是索 EnumcrdiraltypeHandler Enumeration Type 任何兼容的NRT或R类型,存储枚举的索引(而不是名 尔) Instant. TypehandT∈r Java. time. Instant TIMESTAMP LocalDateTimeTypeHancler java -ime. IocalDaceT'ime 卫 IMESTAMP LocalDateTypeHaacler Java, cime. IocalDace DATE Localf'imeTyneHancler avE. -ime. LocalTime 卫ILE Offset DateTimeTyre Handler lava cime Offset Date Time TIMESTAMP Cf Tietypehand I al Java. ime OffsetTime TTME ZoneaDateTimeTypeHancler Java cime. ZonedDateT'ime TIMESTANP Yearlypehandle二 Java. time. Year 二 NTEGER Vonth'rypeHandler lava. -ime Monch N⊥EGEk YearNonthTypellancler nava cime YearMonth VARCHAF ON TONGJARCHAR Japane seDaceTypeHandler nava, cime chrono, JapaneseDate DATE 你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。具体做法为:实现 rg, apache, batis,tme, TvpeHandlar按口,或继承一个很便利的类org. apache,atis,tyre, BaseTypeHandler,然后可以选择 性地将它映射到一个JDBC类型。比如 ExampleTypeHand-er java MappedJcbc Types(dbcType VARCHAR) public class EXamplelypeHandler extends Base TypeHandler<string>( pride ublic void setNonNullParameter( Preparedstatement ps, int i, String parameter, Jdbc Type jdbcType) throws SQLException i ps setstring (i, parameter) Override publit string getNullableResult(ResulTSet rs, string columnName)throws SQLException return rs getstring(column Name); oVerride public string getNullableResult(Resultset rs, int columnIndex) throws SQLException i return rs getstring(column Index ); @override public String getNullableResult(Callablestatement cs, int columnIndex)throws SQLException return cs getstring(columnIndex); I--mybatis-config. xm1-- <typeHandlers> <typeHandler handler="or g mybatis example Example TypeHandler"/> </typeHardlers> 使用这个的类型处理器将会覆盖已经存在的处理Java的Stng类型属性和 ARCHAR参数及结果的类型处理器。要注意 My Batis不会窥 探数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指明那是Ⅵ ARCHAR类型的字段,以使其能够绑定到正确的类型处 理器上。这是因为: My Batis直到语句被执行才清楚数据型 通过类型处理器的泛型, My Batis可以得知该类型处理器处理的Java类型,不过这种行为可以通过两种方法改变 ·在类型处理器的配置元素( typeHandler element)上增加一个 avalype属性(比如:: avalype-" string"); ·在类型处理器的类上( Type Handler class)增一个 appediyres注解来指定与其关联的Java类型列表。如果在“ avarice属性中 七同时指定,则注解方式将被忽略。 可以通过两种方式来指定被关联的JDBC类型 在类型处理器的配置元素上增加一个 ahclype属性(比如: ecType-" VARCHAR") ·在类型处理器的类上( TypeHandler class)增加一个 CMarpedJakcIypes注解来指定与其关联的JDBC类型列表。如果在 cbcIypa属 性中也同时指定,则注解方式将被忽璐。 当决定在 ResultMa中使用某一 TypeHandler时,此时ava类型是已知的(从结果类型中获得),但是JDBC类型是未知的。因此 Mybatis使 用 availe= hejavalype1, Mactyre=n:11的组合来逅择一^ Type Handler。这意味着使用 eMarreddhc'Ivces注解可以制 TypeHandlerl的范围,同时除非显式的设置,否则 TypeHandler在 ResultMap中将是无效的。如果希望在 ResultMap中使用 TypeHandler, 那么设置 Mappedudbclype注解的 includeNulljdccType=trie即可。然而从 Mybatis34.0开始,如果只有一个注册的 lypeHandler来处 理Java类型,那么它将是Re1tM使用Java类型时的默认值(即使没有 inc ludeNul IJdccType-true)。 最后,可以让 MyBatis为你查找类型处器 lybatis-config xmI L ypeHandlers> gmybatis. example"/ /typeHandlers> 注意在使用自动检索( autodiscovery)功能的时候,只能遥过注解方式来扫定JDBC的类型 你可以创建一个能够处理多个类的泛型类型处理器。为了使用泛型类型处理器,需要增加一个接受该类的 class作为参数的构造器,这栏 在构造一个类型处理器的时候 My Batis就会传入一个具体约类 /GenericTypeHandler java public class GenericTypeHandler<E extends Myobject> extends BaseTypeHandler<E>t private Class<E> type; public GenericTypeHandler(class<E> type)i if(type==null)throw new IllcgalArgumentException ("Type argument cannot be null") thistype= type; EnurTyoeHandler和 EnumcrdinalIypeHand_er都是泛型类型处理器( generic TypeHandlers),我们将会在接下来的部分详细探讨。 处理枚举类型 若想映射枚举类型Fnm,则需要从 EnumTyEeHandler或者 Fnamordi na lTyreHandle“中选一个来使用。 比如说我们想存储取近似值时用到的含入莫式。默认情况下, My Batis会利用π umTyp: Hani1r来把mm值转换成对应的名字。 注意 EnumTypeHandler在某种意义上来说是比较特别的,其他的处理器只针对某个特定的类,而它不同,它会处理任意继承了Enum的类。 不过,我们可能不想存储名字,相反我们的DBA会坚持使用整形值代码。那也一样轻而易举:在配置文件中把 EnumCrdinalTycellandler加到 typellandlars中即可,这样每个 RolindingNode将通过他们的序数值来映射成对应的整形 --mybatis-config xml typeHandlers> <typeHandler handler="org. apacheibatis type. EnumordinalTypeHandlerjavaType=java.math. RoundingMode"/> </typeHandlers> 但是怎样自将同样的Fnum既映射成字符串又映射成整形呢? 自动映射器( auto-mapper)会自动地选用 Enumordina1 cHandler来处理,所以如果我们想厍普通的 Enumrypedandler,就必须要 显式地为那些SαL语句设置要使用的类犁处理器 (下一节才开始介绍映射器文件,如果你是首次阅读该文档,你可能需要先跳过这里,过会再来看。) < DOCTYPE mapper PUBLIC"//mybatis orE//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd> mapper namespace="org. apache, ibatis, submitted, rounding Mapper"> <resultMap type="org. apache ibatis submitted. rounding. User"id="usermap"> <id column="id"property-"id"/> <result column -"name"property-name"/> <result column="funkyNumber property="funkyNumber"/> result column -"roundingMode property- "roundingMode"/> </resultMap> <select id="getUser"resultMap="usermap"> elect from users </select> <insert id="inser-> insert into users (id, name, funky Number round ing Mode )values #id), #iname, #funkyNumber), #rounding Mode] </insert> resultMap type="org. apache, ibatis, submitted. rounding. User"id="usermap2"> <id column="id"property id/> <result column="name property="name"/ result column="funky Number"property="funkyNumber/> <result column="roundingMode" property="roundingMode "typeHandler="org. apache ibatis, type. ErumTypeHandler"/> </resultMap> select id="getUser2"resultMap="usermap2"> select from users2 <insert id="inser=2"> insert into users2 (id, name, funky Number, rounding Mode)values #id, #iname,#ifunkyNumber 6, #roundingMode, typeHandler-org apacheibatis type. EnumTypeHandler] </insert> </mapper> 注意,这甲的 select语句强制使用 resultMap来代替 resnlltIypE 对象工厂( objectFactory) My Balis每次创建结果对象的新实例时,它帮会使用一个对象工厂( ObjectFaclory)实例来完成。默认的对象工厂需要做的仅仅是实例化 目标类,要么通过默认构造方法,要么仕参数映射冇仕的时候通过参数构造方泫来实例化。如果想覆盖对象工厂的默认行为,则可以通过 创建自己的对象工厂来实现。比如 ExamplcobjectFactory. java blic class ExampleObjectFactory extends DefaultobjectFactury lbic object create(Class type)t return super create(type) public Object create(Class type, List<Class> constructorArgTypes, Listobject> constructorArgs)[ return super, create(type, constructorArg Types, constructorArgs)j public void setPrcperties(properties properties)i super,setProperties(properties);

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

  • 签到新秀

  • 分享达人

关注 私信
上传资源赚钱or赚积分
最新推荐
Mybatis 3官方中文文档 38积分/C币 立即下载
1/45
Mybatis 3官方中文文档第1页
Mybatis 3官方中文文档第2页
Mybatis 3官方中文文档第3页
Mybatis 3官方中文文档第4页
Mybatis 3官方中文文档第5页
Mybatis 3官方中文文档第6页
Mybatis 3官方中文文档第7页
Mybatis 3官方中文文档第8页
Mybatis 3官方中文文档第9页

试读结束, 可继续读5页

38积分/C币 立即下载 >