mybatis中文文档(彩色高清 带完整书签) 官方中文文档

所需积分/C币:50 2019-01-25 17:04:05 1.46MB PDF
25
收藏 收藏
举报

mybatis中文文档(彩色高清) 官方中文文档 自己整理制作,带完整书签 官方教程真心给力
mapper映射器(这些 mapper的ML文件包含了SQL代码和映射定义信息)。 不使用XML构建Sq| Session Factory 如果你更愿意接从ava程序而不是XML文件中创建 configuration,或者创建你自己的 configuration构建 器, My Batis也提供了完整的配萱类,提供所有和ⅫML文件相同功能的配萱项。 DatasourcedataSource BlogDataSourceFactory.getBlogDataSource() TransactionF actory transactionFactory new JdbcTransactionF actory() nvironment environment= new Environment( development", transactionFactory, dataSource Configuration configuration new Configuration(environment); configuration. addMapper (BlogMappe sqlsessionFactory sqlsessionFactory new SqlsessionFactoryBuilder().build( configuration); 注意该例中, configuration添加了一个映射器类( mapper class)。映射器类是Java类,它们包含SQL映射语 句的注解从而避免了XML文件的依赖。不过,由于Java注解的一些限制加之某些 My Batis映射的复杂性,XML 映射对于大多数高级映射(比如:嵌套Join映射)来说仍然是必须的。有鉴于此,如果存在一个对等的XML配 置文件的话, My Batis会自动查找并加载它(这种情况下, Blog Mapper. xm会基于类路径和 BlogMapper class的类名被加载进来)。具体细节稍后讨论。 从Sq| Session Factory中获取 Sqlsession 既然有了Sq| SessionFactory,顾名思义,我们就可以从中获得 Sqlsession的实例了。 SqlSession完全包含了 面向数据库执行SQL命爷所需的所有方法。你可以通过 SqlSession实例来接执行已映射的SQL语句。例 如 SqlSession session= sqlSession Factory, open Session ()i try t Blog blog=(Blog) session. selectone("org. mybatis. example. BlogMapper selectBlog", 101); 3 finally i session. close(); 诚然这种方式能够正常工作,并且对于使用旧版本 My Batis的用户来说也比较熟悉,不过现在有了一种更直白的 方式。使用对于给定语句能够合理描述参数和返回值的接口(比如说 Blog Mapper. class),你现在不但可以执行 更清晰和类型安全的代码,而且还不用担心易错的字符串字面值以及强制类型转换。 例如 SqlSession session= sqlSessionFactory open Session(); BlogMapper mapper= session. getMapper(BlogMapper. class); Blogblog=mapper. selectBlog(101); t finall ession. closed); 现在我们来探究一下这里到底是怎么执行的 探究已映射的SQL语句 现在,或许你很想知道 SqISession和 Mapper到底执行了什么操作,而SQL语句映射是个相当大的话题,可能 会占去文档的大部分篇幅。不过为了让你能够了解个大概,这里会给出几个例子。 在上面提到的两个例子中,一个语句应该是通过ⅪML定义,而另外一个则是通过注解定义。先看ⅪML定义这 个,事实上 My Bats提供的全部特性可以利用基于XML的映射语言来实现,这使得 My Batis在过去的数年间得以 流行。如果你以前用过 My Batis,这个概念应该会比较熟悉。不过ⅫML映射文件已经有了很多的改进,随着文档 的进行会愈发清晰。这里给出一个基于XML映射语句的示例,它应该可以满足上述示例中 SqlSession的调用。 <? xml version="1. 0"encoding"UTF-8"?> <!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 = fidh </select> </mapper> 对于这个简单的例子来说似乎有点小题大做了,但实际上它是非常轻量级的。在一个ⅫML映射文件中,你想定义 多少个映射语句都是可以的,这样下来,ⅫM儿L头部和文档类型声明占去的部分就显得微不足道了。文件的剩余部 分具有很好的自解释性。在命名空间“ org. my batis. example. BlogMapper”中定义了一个名为“ selectBlog"的映射语 句,这样它就允许你使用指定的完全限定名 org. mybatis. example. BlogMapper. selectBlog来调用映射语句,就像 上面的例子中做的那样 Blog blog =(Blog) session. selectone(org.mybatis. example. BlogMapper selectBlog", 101); 你可能注意到这和使用完全限定名调用Java对象的方法是相似的,之所以这样做是有原因的。这个命名可以直接 映射到在命名空间中同名的 Mapper类,并将已映射的 select语句中的名字、参数和返回类型匹配成方法。这样 你就可以像上面那样很容易地调用这个对应 Mapper接口的方法。不过让我们再看一逼下面的例子: BlogMapper mapper session getMapper(BlogMapper. class) Blog blog= mapper, selectBlog(101); 第二种方法有很多优势,首先它不是基于字符串常量的,就会更安全;其次,如果你的DE有代码补全功能,那 么你可以在有了已映射SQL语句的基础之上利用这个功能。 提示命名空间的一点注释 命名空间( Name spaces)在之前版本的 My Batis中是可选的,这样容易引起混淆因此毫无益处。现在命名空 间则是必须的,且意于简单地用更长的完全限定名来隔高语句。 命名空间使得你所见到的接口绑定成为可能,尽管你觉得这些东西未必用得上,你还是应该遵循这里的规定以防 哪天你改变了主意。出于长远考虑,使用命名空间,并将它置于合适的Java包命名空间之下,你将拥有一份更加 整洁的代码并提高了 My Batis的可用性。 命名解析:为了减少输入量, My Batis对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命 名解析规则。 完全限定名(比如 com mypackage. MyMapper selectAllThings")将被直接查找并且找到即用。 短名称(比如“ selectAllThings")如果全局唯一也可以作为一个单独的引用。如果不唯一,有两个或两个以上的 相同名称(比如como. selectAlIThings”和 com bar. selectA Things”),那么使用时就会收到错误报告说短 名称是不唯一的,这种情况下就必须使用完全限定名。 对于像 BlogMapper这样的映射器类( Mapper class)来说,还有另一招来处理。它们的映射的语句可以不需要 用ⅪML来做,取而代之的是可以使用Java注解。比如,上面的ⅫML示例可被替换如下 batis. e ublic interface BlogMa RoM bl Blog selectBlog(int id) 对于简单语句来说,注解使代码显得更加简洁,然而kva注解对于稍微复杂的语句就会力不从心并且会显得更加 混乱。因此,如果你需要做很复杂的事情,那么最好使用ML来映射语句。 选择何种方式以及映射语句的定义的一致性对你来说有多重要这些完全取决于你和你的团队。换句话说,永远不 要拘泥于一种方式,你可以很轻松的在基于注解和XML的语句映射方式间自由移植和切换。 作用域( Scope)和生命周期 理解我们目前已经讨论过的不同作用域和生命周期类是至关重要的,因为错误的使用会导致非常严重的并发问 题。 提示对象生命周期和依赖注入框架 依赖注入框架可以创建线程安全的、基于事务的 SqlSession和映射器( mapper)并将它们值接注入到你的bean 中,因此可以直接忽略它们的生命周期。如果对如何通过依赖注入框架来使用 My Batis感兴趣可以研究一下 My Batis-Spring或 My Batis-Guce两个子项目。 Sqlsession Factory Builder 这个类可以被实例化、使用和丢弃,一旦创建了 Sqlsession Factory:就不再需要它了。因此 SqISession Factory Builder实例的最佳作用域是方法作用域(也就是局部方法变量)。你可以重用 SqIsession Factory Builder来创建多个 SqIsession Factory实例,但是最好还是不要让其一值存在以保证所有的 ⅫMⅦL解析资源开放给更重要的事情。 SqlSession Factory SqISession Factory-旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSession Factory的最佳实践是在应用运行期间不要重复创建多次;多次重建 SqIsession Factory被视为一种 代码“坏味道( bad smell)"。因此 SqlSession Factory的最佳作用域是应用作用域。有很多方法可以做到,最简 单的就是使用单例模式或者静态单例模式 Sqlsession 每个线程都应该有它自己的Sq| Session实例。 SqlSession的实例不是线程安全的,因此是不能被共享的,所以 它的最佳的作用域是请求或方法作用域。绝对不能将Sq| Session实例的引用放在一个类的静态域,甚至一个类的 实例变量也不行。也绝不能将 Sqlsession实例的引用放在任何类型的管理作用域中,比如 Servlet架构中的 Httpsession。如果你现在正在使用一种Web框架,要考虑Sq|Session放在一个和HTTP请求对象相似的作用 域中。换句话说,每次收到的HTTP请求,就可以打开一个SaISession,返回一个响应,就关闭它。这个关闭操 作是很重要的,你应该把这个关闭操作放到 finally块中以确保每次都能执行关闭。下面的示例就是一个确保 SqlSession关闭的标准模式 SqlSession session sqlSessionFactory open Session()i try i // do work finally session. close( 在你的所有的代码中一致性地使用这种模式来保证所有数据库资源都能被正确地关闭。 映射器实例( Mapper Instances) 映射器是一个你创建来绑定你映射的语句的接口。映射器接口的实例是从 SqlSession中获得的。因此从技术层面 讲,任何映射器实例的最大作用域是和请求它们的 SqlSession相同的。尽管如此,映射器实例的最佳作用域是方 法作用域。也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可废弃。并不需要显式地关闭映 射器实例:尽管在整个请求作用域( request scope)保持映射器实例也不会有什么问题,但是很快你会发现,像 SqlSession一样,在这个作用域上管理太多的资源的话会难于控制。所以要保持简单,最好把映射器放在方法作 用域( method scope)内。下面的示例就展示了这个实践 SqlSession session sqlSessionFactory op on(); getMapper(BlogMapper. class); / do work Copyright @2009-2018 My Batis. org. All rights reserved mybatis My iBatis 最近更新12三月2018版本.347- SNAPSHOT 参考文植 XML映射配置文件 简介 My Balis的配文件包含了会深深影响 My atis行为的设匱( settings)和属性( properties)信。文档的顶孟结构如下 入门 configuration配置 属性( propertie) settings设 没( settings) typeAliases类型别名 类型别名( typeAltases typeHandlers类型夂理器 充象工厂 类型处理 plugins插件 (typeHandlers) environments环境 对象工厂 environment环境变量 transaction Manager事务管理器 插件( plugin3 e database ldProv der数据库厂商标识 环配置 IlldppeIs映射器 (environments) 数据库厂商标识 properties 跌射器( rappers) 这些属件都是可外部配置月可动态替换约既可以在典型的,M属性立件中配,亦可通过 properties元索的子元索来传诺。例如 XM映射立斗 <properties resource="are/'myhatis/exanp le/config. properties> <property nane="username" value="dey user"/> property nane-"password"value-"F2Fa: 133TYyg Java API sL语句构建器 然后其中的属性就可以在整个配匿文件中被用来替换需要动态配匱的属性值。比如 项目文档 ce type=" POOLED 顶目信息 y nane-"drivenvalue-s[driver"/> ty nane="ur1”vaue="》{ur1}" 项目报我 ty nane-"username" value-5usernamey y nane="password"valle="h pac//) 这个例子中的 Username和 passWord羽会由 properties元素中设置的相应值来替换。 river和山l属性籽会力 config.properties文什中对应的值替挨。这样就为配置提仗了诸多灵活 属性也可以被传递到 Sqlsession Factory Bu lder build方江+。例如 5qISessionFar-ory tartary rew Sql SessicnFactoryRu1 Ider().hui ld(reader, props); qlscssionFac-ory factory-rcw SqlsessicnFactory Builder (). build(reader, environnent, props) 如果属性在不只一个地方进行了图 My Batis籽按照下面的序来加裁 在 propertes元素体内指定的属性首先被读取 然后根据 praperties元中的 resource属性读取类路径下属性文件或根据Jr属性指定的路怪读取属性文件并覆盖已读取的司名属性 ·最后读取作为方法参数传递的属性,并覆盖已读取的同名属性 因此,通过方法参数传选的属性具有最高优先级, resourceful属性中指足的配置文件次之,最低优先级的是 roberts属性中指定的属性 从 MvBatis347开始,你可以为占椅指定一个默认值。例如 datasource type="POOLED> property nane-"username"value-"Susername: ut user)"/ rname property not present, username become 'ut user 这个特性默认是关闭的。如果你想为占位符指定个默认值,你应该添加个指定的属性来开这个特性。例如 properties resource="org/mybatis/exanple/config, properties"> <property nane="org. apache ibatis, parsing. PropertyParse", enable-def ault-value" value="true ,><!-- Enable this feature --> 振示你可以使用":作为属性(9.db: Lscrnanc)或者你世可以在s定义中使用CGN表达式的三元运算符(eg.S[ taolcNamc!-nu11? tablename eloha const ants"}),你应该通过草加一个指定的属性来改变分隔键和默认值的字符。例如 properties resource="org/mybatis/exanple/config properties> <property nane-org apache ibatis, parsing Property Parser, default-value-separatorvalue-?:/><1-- Change default value of separator -- </properties> <datasource type="POOLED proPerty nane="username" value=". db: username?: ut user)/> c! datasource》 settings 这是 My Batis中极为重要的调整设置,它们会改变 My Balis的运行时行为。下表述了设置屮各项的意图、默认假等 设置参数 有效值 默认值 cache Enabled 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存 true false zyLoading Enabled 廷迟加载的全局开关。当开启时,所有关联对象都会延迟加戟。特定关联关系中可 true I false 通过设匱 fetchType属性来覆盖该填的开关状态 开启时,任何方法的用都会加载该对泉的有属性。否则,每个属性会按需加 rue false false true in≤341) 载(参1 azyLoadTrisgerMethods multiple ResultSets Enabled 是否允许单一语句返回多结果集(需要兼容驱动) true fals use ColumnLabe 使用列标签代替列名。不同的驱动在这方面会有不同的表现,具体可参哥相关驱动 true I false 设置参数 斋题或通过测试这两种不同的模式来观聚所用驱动的结果 有效值 默认值 use GoneratecKeys 尤许DBC支持日动生成主键,需要驱动兼容。如果设置为true则这个设置强制使 true I false False 用自动牛成丰键,尽管一些驱动不能兼容但仍可干常工作(比如 Derby)。 auloMappingbehavion 定 My Batis应如何白动映射列到字段或属性。NONE表示取消白动映射 NONE PARTIAL PARTIAL PARTIAL只会自动映射没有定义嵌套结果策映射的结果集。FULL会自动映射任意FULL 复杂的结果集(无论是否套) autoMappingUnknown Column Behavior指定发现自动映射目示未知列(或者未知属性类型)的行为 NE. WARNNG NONE NDNE:不做任何反应 WARNIN,:输出醒日志 (org. dpa:he ibatis sess ion. Au ing UnkncwnColunnBehavior' 的日志等级必须设置为WARF FAILING:映射失败(抛出SqL5 essionException defaultExecutor Type 配置默认的执行器。 SMPLE就是普通的执行器: REUSE执行器会重用预处理语句 SIMPLE REUSE SIMPLE prepared statements): BATCH执行将重用话句并执行批量更新。 BATCH defaultsta eme tT imeout 设超时时间它决定驱动等符数据库响应的秒数 任意正整数 Not Set(null) defaultFetch Size 为驱动的结果集获取数最! fe ich Size)设置个是示值。此参数只可以在查询设置任意工整数 Not Set(null) 中被覆盖 safeRowBoundsEnahled 允许存教裳语句中使分页( ROv/Bounds)。如吴九许使用则设匿为 fals False saferesulthandlerenaple 许在数套语句中使王分页( Resulthandier)。如果允许使用则设置为 falsea true I false Tru mapLnderscoreToCameICase 是否开启自动驼峰命名规则( camel case i映射,即从经典数据库列名 A CCLUMN true false 经典va属性名 a Coumn的类似映射。 MY Batis利用本地缓存机制( Local cache)止循环引用( circular references)和 SESSION SESSION 加速重复嵌套查询。默认值为 SESSION,这种情况下会级存一个会话中执行的所有 STATEMENT 盒询。若设置值为 SIAIEMENI,本地会话仅用在语句执行上,对相同 Sqlsessicn 的不同调用籽不会共享数据 jabcTypeFcrNull 当没有为参数提供特定的JDBC类型时,为空值指定JDBC类型。某兰驱动需要指 JcbcType常量.大多都 OTHER 定列的LBC类型,多数情况值接用一般英型即可,比如NUL-、, VARCHAR或 为:NULL∨ ARCHAR OTHER d OTHE lazyLoad TriggerMethods 指定哪个对象的方法触发一次延迟加载 用逗号分的方法列 quals clone, hesh Code; toString defaultscrirtingLanguage 指定动态SQL生成的默认语营 个类型别名或完全限 org. apache ibatis scripting. xmltags 定类名。 defaultErumTypaHandler 挡定Enum使用的默认 TypeHandler(从3.4.5廾哈 一个英把别名或完全限 org. apache ibatis type. EnumTyp cal se ttersOn Nulls 指定当结果集口值为nu的时候是否用映射对象时 setter(map对象时为put) true I false 方法,这对于有 Map. keySet()依赖或nu值初始化的时候是有用的。注意基本类型 int、 boolean等)是不能设置成mu的 eturn stance For Empty Row 时,MBat会返回一个空买例。请注意,它也适用于嵌套的结果集(ie. collectoin true false 当返回行的所有列都是空时: MyBatis默认返国nu11。当开启这个设置 arc association)。(从342开始 louPe ix 指定 My Batis增加到E志名称的前燙 任何宁符串 Not set logIn 指定 My Batis所月日志时具体实现,未指足时捋自动查找 SLF4J LOC4J I Not set COMMONS LOGGING TDOUT LOGGING proxy Factory 旨定 Mba: is创跫具有延记加毂能力的对象听用到的代理工具c CGLIB JVASSIS JAVASSIST(My Batis 3.3 or above 扫定ⅥS约共现 自定义VS的实现的类 Not set 全限定名,以逗号分 USeActual Para mName 允许使用方法签名中的气称作为话句参数名私。为了使用该特件,你的工程必领采 true false 用Java6编译,并且加上- paraneters选项。(从34.1开始) configurationFactory 指定一个捉供 Configuration实例的类。这个被返回的 Configuration实例用来加类型别名或督全类名. Not set 载被反序列化对象的懒加载属性值。这个类必须包含一个签名方法 static 配置完整的 settings元素的示例如下 <sAffing ame= cacheFnah l ec. valA=trae"/> setting lame-lazyLDading Enabled value-"true/ <setting name=multipleResLltsets Enabled" value= true setting ame="LseColumnLabel" value="true"/> <setting name= autn Mapp i ng Ehavior vallA="PARTTAI"/> < setting ame=autoMappingUnknownCo-unn Behavior" value="WARNING"/> ame=" cefaultstaterentrineout value="25"/> cefaultFetchsize va_ue-100 name-mapUnder scoreToCamelCase" value-"false"/> <setting name= localcachescape" value="SESSION", <setting ame=' dbcType For Null" value=OTHER/? setting name-lazyLDadTriggerMethods"value-"equals, clone, hashCode, tostring"/> typeAliases 类烈别名是为Java类型设匱一个短的名字。它只和ML配置有关,仔在的意义仅在于用米减少英完全限定名的冗余,例如: typEAlias alias="Author" type="domain. blog Author"/> <tyneAl1as alias= tyne="don pelIas allas= typeAlias alias-"Section type-"donain, blog Section"/> ypeAlias alias="lag" type="domain. bIce 1ag/> 样型武时,Bog可以用在任何便用 domain.b10g,B:og的也方。 也可以指定一个包名, MyBatis会在包名下庭搜索需奖的 Java bean,比如 package name="comain blog"/> typeAliases 每一个在包 domain,bLo3中的 Java bean,在没有注解的情况下,会使用Bean的首字母小亏的霁限定类名来作为它的别名。比如 domain.blcg. uthor的别名为3thor;若有 沣辉,则别名为其产解值。看下面的例子 b-ic class Auther t 这是一些为常见的va类歪内建的相应的美型别名。它们都是大小写不敏感的,需要注意的是由基本类歪名称重复寻致的特殊处理 射的类型 double double string String double Double flo Float date decimal Big Decima iterator iterator typeHandlers 无论是MBs在预处理语句( Prepared Statement)中设置个参数时,还是从结果集中取出个值吋,都会用类垂处理器将获取约值以合适的力式转换成Java类型。下表描述了 些默认的类型处理器 振示从34.5开始, MyBatis默认支持JsK30(日用和时间AP 类型处理器 Java类型 JDBC类型 BooleanTyreHandler va lang Boolean, boolean 数据库兼容的B00LEAN ByteTypeHarcler Java. lang Byte, byte 数据库兼容的 MUMERIO式BYTE Shor tTypeH andle java. Lang Shor t, shor t 数据庠兼容的 NUMERIC式5H0 RT INTEGER Integer Tyrehandle va lang. Integer, int 数据库兼容的 NUMERIC或 INTEGER Long TypeHarcler ava. lang. Long, long 数据库兼容的 MUMERIO或L0 MG INTEGER loatTypeHandler java. Lang Float float 数据库兼容的 MUMERIC或「L0A DoubleTypeFandler java. Lang Double, double 数据库兼容的 NUMERIC或D0UBLE BigDecimalTypeHandler math. bigDec ima a t 数据库兼容的 NUMERIC或 DEC:MAL stringTypchendler java. Lang string CHAR. VARCHAR ClobReaderTypeH and 类塑处埋器 5bBe类坐^RCAR g NCLobTypeHandler java. Lang Str ing NCLOB BlobInputstreamTypeHandler 0. Inp ByteArray TypeHander 数据库兼容的字节流类型 BlobTypeHarcler by e[ BLOB, LONGVAREINARY DatcTypcHarcler java util. Date TIMESTAMP DatcOnlyTyp java util. Date DATI TimeonlyTyreHandler java. util. Date 工ME SqlTimestampTypeHandLer java. sqL Timestamp TIMESTAMP SqlDateTyrehandler java. sqL Date nIl1me lyr∈ Handler Java.5q1-I1me ]1HR或未指主类型 EnumTypeHarcler Enumeration Type ARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引 EnumordinalTypehandler Enumeration Type 任兼容的 NUMERI或D0UBE类型,存储枚举的案引(而不是名称)。 LocalDateTimeTypeh andl java tine, LocalDateTine TIMESTAMP LocalDateTypehander java tine. LocalDate ocalTimeTypeHander java. time. LocalTime offset DateTineTypeHandler java. time. OffsetDateTime TIMESTAMP OffsetTimeTypeHandle java tine. OffsetTime TIME nedDateTime Type andler java tine. ZonedDateTime TIMESTAMP Year TypeHarcler java tine. Year NTEGER Mon thTypeHardler java. time. Mon th INTEGER YearMonthTypeHander java. time. YearMon th VARCHAR cr LONGVARCHAR JapaneseDatelypeHandler )ava. time. chrono. JapaneseDate 你可以重写型处理器或创建你自三的卖处理器来处理不支持的或非标准的类担。貝体做法为:买现。rg. apache ibatis.type. Ty chAndler接口,或继承一个很便利的类 orE apache,1rat1 6, type, Ba5lypeHandler,然后可以选择性地把它映射到一个DRC类型。比如 / ExampleTypeHandler jav ppedJdbcTypes(JdbcType. VAFCHAR) bic class ExanFlcTypcHandler extends BaseTypeHandler<string> public void setMonNullParameter(Preparedstatement ps, in-1, String parameter, Jdbc Type jdbeType) th ows SCLExcept-on t public String getNullableResult(Resultset rs, String colunnName) throws SQLException f return rs getstring( columnName) OVerride public String getNullableResult(Resultset rs, int colunnIndex) throNs SQLExcetion t OVerride uh lic string gftNll lah leResiilt(Cal ahlestatement cs, in cn ltimnTnder throws SQ! Exception retun cs, getstring( columnIndex); ler handler=org. mybatis. example. Example lypeHandler"/ </typel anders 使用这个的类型处理器褥会覆盖已经存在的处理如av的 String类型属性和^ RCHAR参数及结臭的类型处理器。夏注意 My Ba ie不会窥深数据厍元信息来决定使用哪种类型,所以你必 须在参数和结果映射屮明那是 VARCHAR类型的字段,以使其能够绑定到下确的类型处理锅上。这是因为: My Batis直到语句被执行才清楚致据榮型 通过类型处理器的泛型, MyBatis可以得知类型处理器处理的Java类型,不过这种行为可以通过两种万法改变 在类型处理器的配置元素( ypeHandler element)上增加一个 dataType厘性(比如. javaType=” string ·在类型处理器的类上( TypeHendler clesa增加一个 appedTypes注解来指定与其关联的ave类型列表。如果右 paraType属性中也同时指定,则江解方式将被忽略。 可以通过两种方式来指定被兴联的JBC类型: ·在类型处理器的配置元上道加一个 jdbcTypc属性(比如: doctype=" VARCHAR") 在类型处理器的类上( I ypeHandler class增加一个@ Napped JdbcTypes注解来招定与具关联的JDBC类型列表。如果在 doctYpe属性中也同时指定,则注解方式将被忽略 当决定在 ResultMap中使用旱一 ypeHandler时,此时aa类型是已知的(从结果英型中获得),但是JDBC英型是来知的。因此 Mybatis使用 javaN= [TheJavaType] docType=nu1l的组合来选择一个 TypeHar cler这原味普使用 Mappedldbc ypes注解可以照前 ypeHandler的范围,同时除非显式的设,否则 TypeHandler在 ResultMap中将是 无效的。如果希望在Re51Map中使月 TypeHandler,那么设置 Mappedcbc Types注解的 includeD1 l Doctype=tru即可。然而从 Mybatis340开始,如果只有-个注册的 TypeHandier来处理ava类型,那么它浮是 ResultNap使用Java类型时的默认值(即使没有 include NullJdbcTypc-truc) 最后,可以让 MyBatis为你查找英型处理器 typeHandlers> <package name-"crg mybatis, example"/> 注意在使用自动检索( autodiscovery,功能的时候,只能通过注解方式来指定、DBC的类型 你可以创建一个能够处理多个类的泛至类型处理器。为了促用泛型类型处理器,需要增加一个受该类的ca作为参数的构造器,这样在构造一个类型处理器的时候 MY Batis就会传入 private Class<E> typ if (type = null) throw rew IllegalArgumentException( "Type argument cannot 3t JnTypeHandler和 EnumOrcinalTypeHandler都是忌型类型处理器! generic TypaHandlers),我们将会在接下采的邵分详纽探讨 处理枚举类型 若想映射举类型Enum,则需要从 EnunTypeHandler或音Enum0 dinalTypeHanc ler中选个来使用。 比如说我们想存储取近似值时用到的舍入模式默认情况下, My Batis会利月 EnumTypeHanicler来把Enum值转成对应的名字c 注意 EnumTy Handler在某种意义上来说是比较特别的,其他的处理器只针对某个特定的类,而它不同,它会处理任意继承了Emun的类。 不过,我们可能不想存储名字,相反我们的D3A会坚持使用整形值代码。那也一样轻而易举:在配置文什中把 EnumOrdinalTy peHandler如到 tyoeHandlers中即可,这样訇个 RoundingMode籽过也们的序数值来映射成对应的整形 <I mybatis config. xml> hardler-org. apache ibatis type. EnunCrdinalTypeHandle- javaType-jave, math. RoundingMode /typer andlar 但是怎样能同样的Enum无映射成字符串又映射成整形呢? 自动映射器(aut- mapper)会自动地选用hnun0 nal lypeHanaler来处理,所以如果我们想用营的 Fnu lyneHandler就必狐要显式地为那些s语句设置要用的类型处 理器 (下一节才开始介绍映射器文件,如果你是首次阀读该文档,你可能需要先跳过这里,过会再来看。) DOCTYPE mapper PUBLIC "-//'mytatis org//DTD Mapper =0//EN http://nybati: dtd/ mybati5-3-marper dtd <napper namespace="org.apacheibatis,submitted.roundingMapper"> <resultMap type-org apache ibatis, submitted, rounding. User ic-"use-nap> <id column=id properey= id"/> <result colunn="name property="name"/> result colunn-funkyNumber" property-"funky Nunber" /> <select id="getUser resultMap="usermap> elect fron users aselect> insert into l:sers (id, rame, tun k yNumher, roundinEMade) va lues #fid], #iname), #[ Numbet, #iroundingMod rt> resultMap type="nrg apar he ih <id colum1-id id"/> <result colunn="name" property="name"/> <result colunn="funkyNumber property="funky Nunber"/> <result colunn-"roundingMoce" property-roundingHcde" typcHardler-"org. apache ibatis, typ2. Enun TypcHandler"/ id="getUser2 resultNap lect、「ro cele insert into users2 (id, name, FunkyNumber, rounding ode values #fidh, #iname], HfTunkyNumbe-h, #iroundingMode, typeHandler-org apache ibatis type Enum ypeHandlerh er> 注意,这重的suu语句漫制使用 resultMap来代替re;type 对象工厂( objectFactory) MyBatIs每次创建结果对象的新头例时,它都会使用一个对象工厂( Dbjectractory)实例米完成。默认的对象I厂需要做的仪仅是实例化目标英,罢么通过默认构造方法,罢么在参数映 射存在的时侯通过参数吻造方法来实化。如果想覆盖对象工厂的默认行为,则可以通过创建白己的对象工厂来实现。北如 pub: ic class Exanpleobject Factory extends DefaultobjectFaczory return super create(type); oublic object create(Class type, List<class> constructorArg types, List< ject> cons tructorArgs)( return super create( type, constructorArgTypes, constructorArgs); public void setFroperties( Propertiesproperties; t public <T> boolean iscollection(Class<T> type)( return Col lection. class. isAssignah leFrom(typey <ohjertFartory tyre="nre. myhatis.pxamp le Fxaml eohyectFartory) property nane="someProperty" value="100"/> Object ac: ory接口很简单,它包含两个创建月的方法,一个是处默认构造方法的,另外一个是处坦带参数的构造方法的。最后 setPrcperties方法可以被用来配 Object actory 在初始化你的 ObjectFactory实例后, objectFac: ory元秦体中定义的属性会被传递给 setProserties方法

...展开详情
试读 57P mybatis中文文档(彩色高清 带完整书签) 官方中文文档
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
上传资源赚积分or赚钱
    最新推荐
    mybatis中文文档(彩色高清 带完整书签) 官方中文文档 50积分/C币 立即下载
    1/57
    mybatis中文文档(彩色高清 带完整书签) 官方中文文档第1页
    mybatis中文文档(彩色高清 带完整书签) 官方中文文档第2页
    mybatis中文文档(彩色高清 带完整书签) 官方中文文档第3页
    mybatis中文文档(彩色高清 带完整书签) 官方中文文档第4页
    mybatis中文文档(彩色高清 带完整书签) 官方中文文档第5页
    mybatis中文文档(彩色高清 带完整书签) 官方中文文档第6页
    mybatis中文文档(彩色高清 带完整书签) 官方中文文档第7页
    mybatis中文文档(彩色高清 带完整书签) 官方中文文档第8页
    mybatis中文文档(彩色高清 带完整书签) 官方中文文档第9页
    mybatis中文文档(彩色高清 带完整书签) 官方中文文档第10页
    mybatis中文文档(彩色高清 带完整书签) 官方中文文档第11页
    mybatis中文文档(彩色高清 带完整书签) 官方中文文档第12页

    试读结束, 可继续读6页

    50积分/C币 立即下载 >