mybatis中文文档(黑白书籍版)

所需积分/C币:10 2019-01-25 17:06:11 1.5MB PDF
17
收藏 收藏
举报

mybatis中文文档(黑白书籍版) 官方的教程,这个是黑白的,适用于喜欢开书籍教程的朋友,当然,我也上传了彩色版本
mapper映射器(这些 mapper的XML文件包含了SQL代码和映射定义信息)。 不使用ⅩML构建Sq| Session Factory 如果你更思意接从Java程序而不是XML文件中创建 configuration,或者创建你自己的 configuration构建 器, My Batis也提供了完整的配置类,提供所有和ⅫM文件相同功能的配笸项。 DataSource dataSource- BlogDataSourceFactory getBlogDataSource(i TransactionF actory transactionFactory new JdbcTransactionF actory() Environment environment= new Environment( "development", transactionFactory, dataSource); Configuration configuration Configuration (environment); sqlsessionFactory sqlSessionFactory new SqlsessionFactoryBuilder(). build( configuration) 注意该例中, configuration添加了一个映射器类( mapper class)。映射器类是Java类,它们包含SQL映射语 句的注解从而避免了XML文件的依赖。不过,由于Java注解的一些限制加之某些 My Batis映射的复杂性,XML 映射对于大多数高级映射(比如:嵌套Join映射)来说仍然是必须的。有鉴于此,如果存在一个对等的XML配 置文件的话, My Batis会自动查找并加载它(这种情况下, Blog Mapper. xm橱会基于类路徑和 BlogMapper.cass的类名被加载进来)。具体细节稍后讨论。 从Sq| Session Factory中获取 Sqlsession 既然有了Sq| SessionFactory,顾名思义,我们就可以从中获得Sq| Session的实例了。 SqlSession完全包含了 面向数据库执行SQL命合所需的所有方法。你可以通过 SqlSessian实例来接执行已映射的SQL语句。例 如 sqlSession session sqlSession Factory. openSession ()i try i Blog blog=(Blog) session. selectone("org. mybatis. example. BlogMapper selectBlog", 101); 3 finally i session. close; 诚然这种方式能够正常工作,并且对于使用旧版本 My Batis的用户来说也比较熟悉,不过现在有了一种更直白的 方式。使用对于给定语句能够合理描述参数和返回值的接口(比如说 BlogMapper class),你现在不但可以执行 更清晰和类型安全的代码,而且还不用担心易错的字符串字面值以及强制类型转换。 例如 SqlSession session =sqlSessionFactory open Session(): Blog Mapper mapper session. getMapper(BlogMapper. class); Blogblog= mapper. selectBlog(101); 3 finally i session. close; 现在我们来探究一下这里到底是怎么执行的。 探究已映射的SQL语句 现在,或许你很想知道 SqlSession和 Mapper到底执行了什么操作,而SQL语句映射是个相当大的话题,可能 会占去文档的大部分篇幅。不过为了让你能够了解个大概,这里会给出几个例子。 在上面提到的两个例子中,一个语句应该是通过ⅫML定义,而另外一个则是通过注解定义。先看ⅪML定义这 个,事实上 My Batis提供的全部特性可以利用基于XML的映射语言来实现,这使得 My Batis在过去的数年间得以 流行。如果你以前用过 My Batis,这个概念应该会比较熟悉。不过ⅫML映射文件已经有了很多的改进,随着文档 的进行会愈发清晰。这里给出一个基于xML映射语句的示例,它应该可以满足上述示例中 SqlSession的调用。 ?xml version="1. 0 encoding="UTF-8"?> <! DOCTYPE mapper PUBLIC "-//mybatis. org//DTD Mapper 3.0// 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映射文件中,你想定义 多少个映射语句都是可以的,这样下来,ⅫML头部和文档类型声明占去的部分就显得微不足道了。文件的剩余部 分具有很好的自解释性。在命名空间 org. my batis. example. BlogMapper"中定义了一个名为“ selectBlog"的映射语 句,这样它就允许你使用指定的完全限定名 org. mybatis. example. Blog Mapper. selectBlog"来调用映射语句,就像 上面的例子中做的那样 Blog blog =(Blog) session. selectone(org. mybatis. example. BlogMapper selectBlog", 101); 你可能注意到这和使用完全限定名调用Java对象的方法是相似的,之所以这样做是有原因的。这个命名可以值接 映射到在命名空间中同名的 Mapper类,并将已映射的 select语句中的名字、参数和返回类型匹配成方法。这样 你就可以像上面那样很容易地调用这个对应 Mapper接口的方法。不过让我们再看一逼下面的例子 BlogMapper mapper= ses sion. getMapper(BlogMapper.class) Blog blog- mapper, selectBlog (101); 第二种方法有很多优势,首先它不是基于字符串常量的,就会更安全;其次,如果你的DE有代码补全功能,那 么你可以在有了已映射SQL语句的基础之上利用这个功能 提示命名空间的一点注释 命名空间( Name spaces)在之前版本的 My Batis中是可选的,这样容易引起混淆因此毫无益处。现在命名空 间则是必须的,且意于简单地用更长的完全限定名来隔离语句。 命名空间使得你所见到的接口绑定成为可能,尽管你觉得这些东西未必用得上,你还是应该遵循这里的规定以防 哪天你改变了主意。出于长远考虑,使用命名空间,并将它置于合适的Java包命名空间之下,你将拥有一份更加 整洁的代码并提高了 My Batis的可用性。 命名解析:为了减少输入量, My Batis对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命 名解析规则。 完全限定名(比如" com. mypackage. MyMapper. selectAllThings")将被直接查找并且找到即用。 短名称(此如“ selectAlIThings")如果全局唯一也可以作为一个单独的引用。如果不唯一,有两个或两个以上的 相同名称(比如“ com foo. selectAlThings"和 com bar. selectAllThings"),那么使用时就会收到错误报告说短 名称是不唯一的,这种情况下就必须使用完全限定名。 对于像 BlogMapper这样的映射器类( Mapper class)来说,还有另一招来处理。它们的映射的语句可以不需要 用ⅪML来做,取而代之的是可以使用Java注解。比如,上面的ⅫML示例可被替换如下 batis. example ublic interface BlogMa @Select("sELeCT FRoM blog WHERE id = #id") log selectBlog(int id) 对于简单语句来说,注解使代码显得更加简洁,然而kava注解对于稍微复杂的语句就会力不从心并且会显得更加 混乱。因此,如果你需要做很复杂的事情,那么最好使用ⅫML来映射语句。 选择何种方式以及映射语句的定义的一致性对你来说有多重要这些完全取决于你和你的团队。换句话说,永远不 要拘泥于一种方式,你可以很轻松的在基于注解和XM的语句映射方式间自由移植和切换。 作用域( Scope)和生命周期 理解我们目前已经讨论过的不同作用域和生命周期类是至关重要的,因为错误的使用会导致非常严重的并发问 题。 提示对象生命周期和依赖注入框架 依赖注入框架可以创建线程安全的、基于事务的 SqlSession和映射器( mapper)并捋它们直摻注入到你的bean 中,因此可以直接忽略它们的生命周期。如果对如何通过依赖注入框架来使用 My Batis感兴趣可以研究一下 My Batis-Spring或 My Batis-Guce两个子项目。 Sqlsession Factory Builder 这个类可以被实例化、使用和丢弃,一旦创建了 Sqlsession Factory:就不再需要它了。因此 Sqisession Factory Builder实例的最佳作用域是方法作用域(也就是局部方法变量)。你可以重用 SqlSession Factory Builder来创建多个 SqISession Factory实例,但是最好还是不要让其一存在以保证所有的 ⅫMⅦL解析资源开放给更重要的事情。 Sqlsession Factory SqlSession Factory-旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSession Factory的最佳实践是在应用运行期间不要重复创建多次:多次重建 SqIsession Factory被视为一种 代码“坏味道( bad smell)"。因此Sq| Session Factory的最佳作用域是应用作用域。有很多方法可以做到,最简 单的就是使用单例模式或者静态单例模式。 Sqlsession 每个线程都应该有它自己的 SqlSession实例。 SqlSession的实例不是线程安全的,因此是不能被共享的,所以 它的最佳的作用域是请求或方法作用域。绝对不能将 SqIsession实例的引用放在一个类的静态域,甚至一个类的 实例变量也不行。也绝不能将Sq| Session实例的引用放在任何类型的管理作用域中,比如 Servlet架构中的 Httpsession。如果你现在正在使用一种Web框架,要考虑 Sqlsession放在一个和HTP请求对象相似的作用 域中。换句话说,每次收到的HTTP请求,就可以打开一个SqlSession,返回一个响应,就关闭它。这个关闭操 作是很重要的,你应该把这个关闭操作放到 finally块中以确保每次都能执行关闭。下面的示例就是一个确保 SqlSession关闭的标准模式 SqlSession session= sqlSessionFactory openSession(); k session. close( 在你的所有的代码中一致性地使用这种模式来保证所有数据库资源都能被正确地关闭。 映射器实例( Mapper Instances) 映射器是一个你创建来绑定你映射的语句的接口。映射器接囗的实例是从Sq| Session中获得的。因此从技术层面 讲,任何映射器实例的最大作用域是和请求它们的 SqlSession相同的。尽管如此,映射器实例的最佳作用域是方 法作用域。也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可废弃。并不需要显式地关闭映 射器实例,尽管在整个请求作用域( request scope)保持映射器实例也不会有什么问题,但是很快你会发现,像 SqIsession一样,在这个作用域上管理太多的资源的话会难于控制。所以要保持简单,最好把映射器放在方法作 用域( method scope)内。下面的示例就展示了这个实践 SqlSession session sq1SessionFactory openSession(); BlogMapper mapper= session. getMapper(BlogMapper. class) l do work )finally session. close()j Copyright o2009-2018 My Batis. org. All rights reserved mybatIs MyBatis 最近更新12三月2018版本.34.7 SNAPSHOT 参考文档 XML映射配置文件 简介 My Batis的配萱文件包含了会深深影响My3atis行为的设( settings)和属性( o operties)信息。文档的顶妥结构如下 入门 xM配匿 configuration配置 properties禹性 属性( properties) settings设匿 没置( settings) ypeAliases类型别名 类型别名( typeAlases) type Handlers类型知理器 objectFactory对象工厂 类型处理 plugins插件 typerlandlers environments环境 对象工厂 rvircrmen环境变量 a transaction Manager事务管理器 data Source数据源 database ddfrov cer数据库厂两标识 环境配置 IllappeIs射器 environments) 数据库厂商标识 properties (catabaseldPrcvider) 射器( mappers 这些属件都是可外部配日可动态替换约既可以存典型的,V属件文件中配,亦可通过 properties元幸的子元靠来传诺。例如: XML映射文件 properties resource="rg/ mybatis/exanple/config. properti 动态SQL proper ty nane= " username" value=" dey user"/> property nane-"password" value-"F2Fa: 133TYyg"y Java APl SL语句构建器 然后其中的属性就可以在整个配置文件中被用来替换需要动态配的属性值。比如 项目文档 datasource type="POOLED 顶目信息 nane-"driven value-"*(driver"/> nane="url value="Surly 顶目报我 nane-"username" value-"s username", <property nane"pass word"value="s pas swordy aven 这个例子中的山 ername和 paS3,ord将会由 properties元素中设蛋的相应值来替换。 river和山r属性籽会血 config. properties文什中对应的值兴替换。这样就为配置提仗了诸多灵活 属性也可以被传递到 sqlsession F actory Bu lder build)方法+。例如: qISessionFar-ory tartary rew n l SessicnFartory Rui lder(). hui ld(reader. props); 如吴属性在不只一个地方进行了配匱,那么 My Batis籽按照下面的序来加裁 在 propertes元素体内指定的属性首先被读取 然后根据 properties元中的 resouce属性读取类路下属性文件或根据ur属性指定的路怪读取属性文件并覆盖已读取的园名属性。 ·最后读取作为方法参数传递的属性 已读取的同名属性 因此,通过方法参数传送的属性具有最高优先级, resourceful属性中指定的配置文件次之,最低优先级的是 roberts属性中定的属性 从 MyBatis347开始,你可以为占位符捐定一个默认值。例如 <datasource type="POOLED property nane-"username" value-"s username: ut user)"/><--If 'username property not present, username become 'ut_user source> 这个特性默认是关闭的。如果你想为占位符指定个默认值,你应该添加个指定的属性来开启这个特性。例如 properties resource="org/mybatis/exanple/config propertles property nane="org. apache ibatis parsing. PropertyParse, enable-defauit-value" value="true"/><l-- Enable this feature 振示你可以使用":作为属性键(g.db: Lscrn ane)或者你世可以在sq定义中使用CGN表达式的三元运算符(cg.s[ taolcNamc!-n11? tablenamc: aloha constants"}).你应该通过草加一个指定的属性来改变分隔键和歇认值的字符。例如 properties resource="org/ 'mybatis/exanple/config. properties> roperty nane-org apache ibatis, parsing. PropertyParser, default-value-separator" value-?:/><1-- Change default value of separator <datasource type="POOLED <property nane="username" value="sdb: username?: ut user /> </datasource> settings 这是 MyBatis中极为重要的调整设置,它们会改变 My Balis的运行时行为。下表述了设中各项的意图、默认佰等 设置参数 有效值 默认值 cache Enabled 仝局地开启或关闭配置文件中的所有映射器已经配置的任何缓存。 true I false azyLoading Enabled 迟加敦的全局开关。当开启时,所有关联对象会延迟加戟。特定关联关系中可 true I false 通过设匱 fetchType属性米覆盖该项的开关状恋, aggressive aryl oading 当开启时,任何方法的调用都会加载该对象的厅有属性。否则,每个属性会按需加 true false alse true it≤341) 载(爹考1 azy LoadTriggerMethods multiple Resultsets Enabled 是否允许单一语句返巨多结果集(需要兼容驱动) true false use ColumnLabal 使用列示签代替列名。不同的驱动在这方面会有不同的表现,具体可参相关驱动 true I false 设置参数 斋通过测试这两种不同的模式来观厅用驱动的结果 有效值 默认值 use GeneratecKeys 允许DBC支持自动生成主键,需夏驱动兼容。如果设置为rue则这个设置强制使 true I false 用自动牛成丰键,尽曾一些驱动不能兼容但仍可正常工作(比如 Derby) auloMappingBehavior 定 My Batis应如何自动映射列到字段或属性。NONE表示取消白动映射 NONE PARTIAL PARTIAL PARTIAL只会自动映射没有定义嵌套结果策映射的结果集 FULL会自动映射任意FULL 复杂的结果集(无论是否嵌套)a autoMappingunknown Column Behavior指定发现自动映射目标末知列(或音未知属性类型)的行为 NONE, WARNNG ARNIN,输出捏醒日志 的日志等级必须设置为WARN) FAILING:映射失败(拋出Sq15 essionException defaultExecutor Type 配置默认的执行器。SMPL三就是普通的执行器: REUSE执行器会重用预处理语句 SIMPLE REUSE SIMPLE prepared statemenTs): BATCH执行器将重用舌句并执行批量更新。 BATCH defaultsta ement imeout 设置妞时时间,它决定驱动等符数据库响应的秒数。 任意正整数 Not Set(null) defaultFetch Size 为驱动的结果集获取数量! fetch Size)设置个是示值。此参数只可以在查询设置任意工整数 Not Set(null) 中被覆盖 safeROWBoundsEnabled 亢许在套语句中使用分页( Rov/Bounds)。如吴九许使用则设置为fase true false afeResulthandlerenaple 允许在语句中使用页( Resulthandler)。如果允许使用则设置为fase mapLnderscore T cAmelCAse 是否开启自动驼峰命名规则( camel case映射,即从经典数据库列名 A CCLUM、 true false False 到经典Java属性名 a Column的类似映射。 loca Cache Scope My Batis利用本地缓存机制( Local cache)止循环引用( circular references)和SEs|o SESSION 加速重复嵌套查询。默认值为 SESSION,这种情况下会级存一个会话中执行的所有 STATE 盒询。若设置值为 SIAIEMEN,本地会话仅用在语句执行上,对相同 SqIsessio 的不同调用籽不会共享数据 idbc Type FcrNull 当没有为参数提供持定的JDBC类型时,为空值者定JDBC类型。某些驱动需要指 JcbcType常量.大多都 OTHER 列的LBC类型,多数情况接用一般英型即可,比如NULL, VARCHAR或 为: NULL VARCHAR OTHERo lazy LoadTriggerMethods 指定哪个对象的方法触发一次延迟加载 用逗号分隔的方法列 quals. clone, hesr Code, to String defaultscripting Language 指定动态SQL生成的默认语言 一个类型别名或完全限 org. apache ibatis. scripting. >mags defaultErumT yppHandler 定Enum使用的默认 Typedandler。(从34.5始 个英型别名或完全限crg. apache ibatis type Enum 指定当结果集中值为nu的时候是否调用映射对象的seer(mp对象时为put) true I false 万法,这习于有Map. key Set()依赖或null值初始化的时候是有用的。注意基本卖型 int、boo|ean等)是不能设置成nu的 return stance For Empty Row 当返回行的所有列都是空时, MyBatis默认返nu11。当开启这个设置 true false 时, My Bati会返回一个空买例。请注意,它也适用于嵌套的结果集(ie. collectin arc assocation)。(从3.42开始 logPre ix 指定 My Batis增加到日志名称的前 任何字行串 Not set logipi 指定MBti所月日志的具体实现,未指定时捋自动查找 LF4J LOC4JI Not set COMMONS LOGGING I STDOUT LOGGING I proxy Factory 旨定 Mybatis创建具有延记加载能力的对象所用到的代理工具 CGLIB JVASSIST JAVASSIST(My Batic 3.3 or above 留定ⅥS的实现 自定义VS的实现的类 Not set 全限定名,以逗号分 useActualParamName 许使用方法签名中的名称作为话句参数名积。为了使用该特件,你的工程必领采 true false 用Java6编译,并且加上- paraneters选项。(从34.1开始) configurationFactory 指定一个捉供 Conf i3 uration实例的类。这个被返回的 Configuration实例用来加类型别名或者全类名. Not set 载被反序列化对象的懒加载属性值。这个类必须包含一个签名方法 static 配置完整的 settings元秦的示例如下 <settings> <setting ame=cacheFnahl pr valle=true"/> setting lame-lazyLoadingEnabled value-"true/> setting ame= multipleResultsets Enabled" value=true"/> setting name-usCGcnerateckeys" va-uc-"false "/> etting name= atitnMappingRehavinr va lP="ARTAI"/> <setting name="cefaultExecttorTyoe" value="SIMPLE"/> name=defaultstaterentTineout" value=25"/> g name-cefaultFetch Size" va_ue-100 g name= safeRONBouncstnabled value="fa_se"/> <setting name-mapUnderscoreToCamelCase" value-"false"/ setting name= local cachescape"value="SESSION"/. setting name="jubcType For Null"value=OTHER/? setting name-'lazyLDad TriggerMethods"value-"equals, clone, hashCode, tostring"/ </settings> type Aliases 类型别名是为Java类型设凿一个短的名字。它只和ⅪML配置有关,仔在的意义仅在于用米减少英完全展定名的冗余。例如 typeAlias alias="Author" type="domain. blog Author"/> typcAlias alias-"Blog" type-domain, blogBlog/'> ypeAl1as alias="Comment tyne="donain hIng. Comnent"/> ypeAlias allas="Post type="domain, blog Post"/ <typeAlias alias-"Section type-"donain, blog Section"/> 也可以指定一个包名,MBas会在包名下庭搜案需奖的 Java bean,比如: e= comain blog"/> 每一个在包 domain,bLo3中的 Java bean,在没有注解的情况下,会使用Bean的首字母小亏的霁限定类名来作为它的别名。比如 domain.bleg. Author的别名为 author;若有 沣解,则别名为其解值。看下而的例 这是一些为常见的ava类垂内建的相应的美型别名。它们都是大小写不敏感的,需要注意的是由基本类型名称重复寻致的特殊处理 别名 映射的类型 flo Float decimal Big decima typeHandlers 无论是 My Batis在预处理语句 Prepared Statement)中设置一个参数时,还是从结果集中取出一个值时,都会用类歪处理器将获取的值以合适的方式转换成Java类型。下表描述了一 些默认的类型处理器 开始, MyBatis默认支持 0(日期和时间AP 类型处番 Java类型 JDBC类型 BooleanTyrehandler Java. lang Boolean, boolean 数据库兼容的B00LEAN ByteTypeHarcler Java. Lang Byte, byte 数据庠兼容的 MUMERIO或BYTE Shor tTypeH andler dvd. Lang. Short, shor t 数据庠兼容的 NUMERIC式5H0 RT INTEGER IntegerTyrehandl ava. Lang Integer, int 数据库兼容的 MUMERIC或 INTEGER Long TypeHardler java. Lang. Long, Long 数据库兼容的 NUMERIC或L0 NG INTEGER 「 LoatTypeHardler Java. Lang float, float 数虿库兼容的 NUMERIC或「L0AT DoubleTypeh andler java. Lang Double, double 数据库兼容的 NUMERIC或D0UBLE BigDecimalTypeHandle java. math. BigDecimal 数库兼容的 MUMERIC或 DEC:MAL tringTypchandl java. Lang str it ClobReaderTypeH andler 埋器 ruler bB类° CHAR NCLobTypeHandl java. Lang. Str ing NCLOB BlobInputstreamTypeHandler java. io. Inputstream ByteArrayTypeHand. er bY 据库兼容的字节流类型 BlobTypeHarcler bye[ BLOB, LONGVAREINARY DatcTypcHardler java util. Date TIMESTAMP DateonlyTypcHandier )ava. util. Date Ti meonlyTyreHandler java util. Date SqlTimestampTypeHandle java. sql Timestamp TIMESTAMP SqlDateTyrehandler java. sql Date snl Ilme l yreHannIer va. 5q1IIme lM卜 hect lypeh and Ier OH卜K或未指主类型 EnumTypeHarcler Enumeration Type VARCHAR任何兼容的字符串类型,存储枚举的名称(而不是索引) mordinalTypehandler Enumeration Type 任词兼容的 NUMERII或D0UBLE类型,存储枚举的案引(而不是名称) aya. time. Ins tant TIMESTAMP LocalDateTimeTypehandle java. time. LocalDateTimme TIMESTAMP LocalDatetypeHander ava. time. Localdate LocalTime TypeHander java. time. LocalTime TIME off setDateTimeTypeHandler java. time. OffsetDateTime TIMESTAM OffsetTimeTypeH andle ava. time. OffsetTime TIME onedDateTimeTypeHandle java tine. ZonedDateTime TIMESTAMP Year TypeHarcler ava. ti ne. Year INTEGER Mon thTypeHardler Java. time. Month INTEGER YearMonthTypeHander java. time. Year Month VARCHAR ar LONGVARCHAR JapaneseDate lypeHandler )ava. tIme. chrono . JapaneseDate 你可以重写卖型处理器或创建你自三的卖处理器来处理不支持的或非标准的类。貝体做法为:买现rg. apache. ibatis.type. TypeHandler接口,或继承一个很便利的类 org - apache,1rat1 s type, BaselypeHand ler,然后可以选择性地捋它映射到一个RC类型。比如 onapped3dbcTypes(3dbcTypeVAFCHAR) pubic class ExanFleTypeHandler extends BaseTypeHand1 public void setManNullParameter (Preparedstatement ps, in:i, String parameter, Jdbc Type jdbeType) throws SCLExcept-on t 1 Override lableResult(Resultset rs, String colunnName) throws SQLException return rs. getstringf columnName) public String getNullableResult(Resultset rs, -nt columnIndex)throws SQLException t return rs getstring( columnIndex) puh Iic String gftNll lah IeResuilt(Cal ah lestat ement cs, in-cnltmnTnder)throws sQl Exception 4 retum cs, getstring(columnIndex) fig. xm ler handler= org. mybatis example Example lypeHandier"/> 使月这个的类型处理器将会覆盖已经存在的处理Jav的 String类型属性和 VARCHAR参数及结灵的类型处理器。夏注意 My Ba:is不会观深数据厍元信息来决定使用明种类型,所以你必 须在参数和结果映射中摔明那是 ARCHAR类型的字段,以使其能够綁定到下确的类型处理器上。这是因为: My Batis到语句被执行才清楚数据杀型 通过类型处理器的泛型, MyBatis可以得知泫类型处理器处理的Java类型,不过这种行为可以通过两种万法改变 在类型处理器的配萱元素( type Handler element)上增加一个 dataType厦性(比如: javaType=" string") 在荧型处理鼹的类上( TypeHEndler cless增加一个 appedTypes注解来指定与其关联的ava类型列表。如果在 paraType属性中也同时指定,则注解方式籽被忽略。 可以通过两种方式来指定被关联的LBC类型 ·在类型处理器的配置元素上増加一个 doctYpe属性(比如: doctYpe=" VARCHAR"): ·在类型处理器的类上( ypeHandler class增加一个 Mapped JdbcTypes注解米招定与具关联的JUBC类型列表。如果在 j docType属性中也同时指注,则注解方式被忽略 当决定在 ResultMap中使用草-1 ypeHandler时,此时ava类型是已知的(从结果英型中获得),但是JDBC类型是束知的。医此 Mybatis使用 javaN= [TheJavaType] docType=nult的组合来选择一个 TypeHarcler这意味着使用 apped ypes注解可以新 ypeHandler的范围,同时除非显式的设图,否则 TypeHandler在 ResultMap中将 无效的,如果希望在Re51tMap中使用 TypeHandler,那么设置 lappedcbc Types注解的 includeD11 Doctype=tr山即可。然而从 Mybatis340开始,如果只有一个注册的 TypeHandier来处理av类型,那么它浮是 ResultHap使用Java类型时的默认值(即使没有 include NulLjdbcTypc-true) 最后,可以让 MyBatis为你查找英型处理器 typeHandlers> 注意在使手自动检索( autodiscovery)功能的时候,只能通过注解方式来指定、DBC的类型。 你可以创建一个能够处理多个类的泛型类型处理器c为了使用泛型类型处理器,需要增加一个接受该类的ca作为参数的构造器,这样右构造一个类型处理器的时候 MyBatis就会传入 //GenericTypeHandler. java pubiic class GenericTypeHandler<E extends MyDpject> extends BaseTypeHandler <E>( private class<E> typE puh lic GienericTyneHandler(classc-> type) t if (type = null)throw rew IllegalArgumentException("Type argunent cannot pe null") this type= type :numTypeHandler和 EnumOrdinalTypeHandler都是忌型英型处理器 generic TypaHandlers 会在接下采的部分详纽探讨 处理枚举类型 若想映射枚举类型Enum,则需要从 EnunTy chAndler或音Enum0 dinalTypeHanc ler中选一个来使用。 比如说我门想存储取近似值时用到的舍人模式默认情况下, My Bats会利月 EnummlTypeHancler来把Enum值转成对应的名字c 注意 EnummType Handler在某种意义上来说是比较特别的,其他的处理器只针对某个特定的类,而它不同.它会处理任意承了Enum的类。 不过,我们可能不想存储名字,相反我门的D3A会坚持使用整形值代码。那也一样轻而易半:在配置文什中把Enum0 rdinalTypeHandler加到 tyoeHandlers中即可,这样匈个 RoundingMode将過过也们的序数值来映射成对立的整形 <typeHandlers> ypeHandler hardler-"org. ap java Type-java. math. RoundingMoae'/ /typeHandlars 但是怎样能将同样的Enum玩映射成字符串又映射成整形呢? 自动映射器( allt.-mapper)会自动地选用tnum0 di nal lypeHann ler来处理,所以如果我们想用管邐的 Fnu lypeHandI e就少须要显式地为那些SL语句设置要用的类型 (下节才开始介绍映射器文件,如果你是首次阀读该文档,你可能需要先跳过这里,过会再来看。) http://nybatis.org/dtd/mybati5-3-apper.dtd napper namespace="org. apache ibatis, submitted. rounding Mapper"> resultMap type-org. apache, ibatis, submitted, rounding. User" ic-"use-nap dco1um"d° proper-y=id result colunn="name property="name"/> <result colunn-funkyNumber" property"funky Nunber "/> resu It rol unn="rotn i ngMore" property="rolndi ngHcde"/> </rcsultMao> <select id= getUser resultMap="usermap> select s fron users Lnsert id-insert ct into l: sers (id, rame, tuinkyNumher, rounrineM: ne) va lues #idh, #inane, #(funky Numbe h, sr=nsert> resuItMap type="nre. apache ibatis submitter. rounding. HIser ic="lsPrnap2> <id colum1-id proper=y- id"/> result result colunn="funkyNumber property="funky Nunber "/> result colunn-"roundingMoce" property-"roundingHede" typcHardler-org apache ibatis type. EnumTypeHandler"/> select id= getuser2 select fron users2 sele insert id-'insert2"> insert into users2 (id, name, FunkyNumber, rounding ode values #fid, #i), #(TunkyNumbe-h, #froundingMode, typeHandler-org, apacheibatis, type Enum ypeHandlerh s /-nsert> 注意,这里的 select语句强制使用 resultrap来代替 resuLtType 对象工厂( objectFactory) My Batis每次创建结果对象的新实例时,它都会使用一个对象工厂( ObjectFactory)实例米完成。默认的对象I厂需罢做的仪仅是实例化目标英,罢么通过默认构造方法,罢么在参数映 射存在的时侯通过参数构造方法来实例化。如果想覆盖对象工厂的默认行为,则可以通过创建白己的对象工厂来实现。北如 r Exa]ject actory. java oub-ic class Exanplcobject Factory extends DefaultobjectFac-ory puh Iir Ohjert create(Class tyne)t retum super create(-ype)j public object create(class type List<class> constructorArg Iypes, Listotject> constructorArgs) nstructorArgTypes, coI public void setFroperties( Properties properties: i super set Properties(properties public <T> boolean iscollection(Class<T> type)[ return Col lectionlass. isAssignah leFrom(type <ohjertFartory tyre="nre myatis. example. FxamleohjectFartory> <property nane="SomeProperty" value="le0"/> Objecthac: ory接口很筒单,它包含两个创建月的方法,一个是处默认利造方法的另外一个是处坦带参数的构造方法的。最后, setProperties方法可以被用来配置 ObjecTs actory 在初始化你的 ObjectFactoy实例后, objectFac:ory元秦体中定义的属性会被传递给 setProoerties方法

...展开详情
试读 57P mybatis中文文档(黑白书籍版)
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
上传资源赚积分or赚钱
最新推荐
mybatis中文文档(黑白书籍版) 10积分/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页

10积分/C币 立即下载 >