⽬录
前⾔
configurationpropertiessettingstypeAliasestypeHandlersobjectFactorypluginsenvironmentsdatabaseIdProvidermappers总结
前⾔
上⼀篇我们通过将MyBatis和传统JDBC,DBUtils,以及Hibernate作了简单的对⽐,并且列举了⼀个⾮常简单的demo,今天这篇主要介绍⼀下MyBatis的全局配置⽂件的使⽤
configuration
mybatis-config.xml⽂件的头部格式我们就不说了,直接从属性开始介绍,configuration为最顶层节点,其余所有的属性都必须嵌套在configuration内,MyBatis配置⽂件的顶层节点如下:
可以看到configuration内的全部顶层节点只有9个,下⾯我们就⼀个个来分析⼀下
properties
下⾯是⼀个相对完整的属性配置
上⾯我特意分开写,就是怕引起⼤家的误解,因为resource和url只允许存在⼀个,不能同时配置两个属性,可以看到源码中的解析过程:
同时配置了resource和url会抛出异常。
配置了properties属性之后,在xml其他配置⽂件中可以直接通过${xxx}来读取。
properties配置有三种⽅式,resource或者url指定,直接配置在⼦节点properties中,另⼀种就是上⼀篇提到的,直接代码中去其他地⽅读取properties⽂件,然后传⼊build⽅法。
那么这三种⽅式既然都能配置,假如属性配置重复了,优先级是怎么样的呢?properties优先级
properties配置的属性如果重复,优先级如下:
1、第⼀优先:在代码中直接通过properties传⼊build⽅法。
2、第⼆优先:通过resource或者url读取到的properties⽂件中属性。3、第三优先:直接在properties内的⼦标签property内定义的属性。
在实际开发中,建议是只使⽤⼀种,使⽤多种⽅式混合的话会给后期维护造成困难,⽽且不同类型的配置属性混合时可读性也不好。
settings
settings是MyBatis中最复杂,也是最重要的内容之⼀。当然这⾥说的复杂并不是说配置⽅式复杂,⽽是settings能配置的东西⾮常多,⼀些很核⼼的功能都是通过settings标签配置的。
下⾯是⼀个完整的属性配置⽰例:
所有的可设置值列举如下(这些属性有个映像就可以了,不需要去记,常⽤的多⽤⼏次⾃然就记住了,不常⽤的需要的时候再查⼀下资料就可以了,所以建议⼤家可以收藏之后⽅便查询):
参数
cacheEnabled
lazyLoadingEnabled
aggressiveLazyLoading
multipleResultSetsEnabled
useColumnLabel
useGeneratedKeysautoMappingBehaviordefaultExecutorTypedefaultStatementTimeout
safeRowBoundsEnabled描述
可选值
缓存配置的全局开关
truefalse
延迟加载全局开关。当开启时,所有关联对象都会延迟加载。
特定关联关系中可通
true
过设置 sql语句上标签false
的fetchType 属性来覆盖该项的开关状态。当启⽤时,对任意延迟属性的调⽤会使带有延迟加载属性的对true象完整加载;反之,false
每种属性将会按需加载。
是否允许单⼀语句返回多结果集(需要兼true容驱动)
false
使⽤列标签代替列名。不同的驱动在这⽅⾯会有不同的表
现, 具体可参考相关true驱动⽂档或通过测试false这两种不同的模式来观察所⽤驱动的结果。
允许 JDBC ⽀持⾃动⽣成主键,需要驱动兼容。 如果设置为
true 则这个设置强制true使⽤⾃动⽣成主键,false尽管⼀些驱动不能兼容但仍可正常⼯作(⽐如Derby)。
指定 MyBatis 应如何⾃动映射列到字段或属性。 NONE表⽰取消⾃动映射;
PARTIAL只会⾃动映
NONE
射没有定义嵌套结果
PARTIAL
集映射的结果集。FULL
FULL会⾃动映射任意复杂的结果集(⽆论是否嵌套)。
配置默认的执⾏器。SIMPLE 就是普通的执⾏器;REUSE 执⾏
器会重⽤预处理语句SIMPLE(preparedREUSEstatements);BATCHBATCH 执⾏器将重⽤语句并执⾏批量更新。
设置超时时间,它决定驱动等待数据库响有效的整数应的秒数
允许在嵌套语句中使⽤分页
true(RowBounds)
false
true
false
true
true
true
false
PARTIAL
SIMPLE
默认null
false
默认值
mapUnderscoreToCamelCase参数是否开启驼峰验证描述
localCacheScope
MyBatis 利⽤本地缓存
机制(LocalCache)防⽌循环引⽤(circular
references)和加速重复嵌套查询。默认值为SESSION,这种情
况下会缓存⼀个会话SESSION中执⾏的所有查询。STATEMENT若设置值为
STATEMENT,本地会话仅⽤在语句执⾏上,对相同
SqlSESSION的不同调⽤将不会共享数据。
当没有为参数提供特定的 JDBC 类型时,为空值指定JDBC 类型。 某些驱动需要指
JdbcType枚举类中的所有
定列的JDBC 类型,
枚举类型
多数情况直接⽤⼀般类型即可,⽐如NULL、VARCHAR或OTHER。指定哪个对象的⽅法触发⼀次延迟加载,多个⽅法则⽤逗号隔开
指定动态SQL⽣成的默认语⾔
-
truefalse
可选值
false
默认值
SESSION
jdbcTypeForNullOTHER
lazyLoadTriggerMethodsequals,clone,hashCode,toString
defaultScriptingLanguage
可以是类的别名也可以是全
org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver
限定类名
callSettersOnNulls
指定当结果集中值为null的时候是否调⽤映射对象的setter(map对象时为 put)⽅法,这对于有trueMap.keySet()依赖或falsenull值初始化的时候是有⽤的。注意基本类型(int、boolean等)是不能设置成null的指定 MyBatis 增加到⽇志名称的前缀
任意字符串
SLF4JLOG4JLOG4J2
JDK_LOGGING
COMMONS_LOGGINGSTDOUT_LOGGINGNO_LOGGINGCGLIB
JAVASSIST
false
logPrefix
-
logImpl
指定 MyBatis 所⽤⽇志的具体实现,未指定时将⾃动查找
-
proxyFactory
指定 Mybatis 创建具有延迟加载能⼒的对象所⽤到的代理⼯具。
JAVASSIST
typeAliases
类型别名是为 Java 类型设置⼀个短的名字。它只和 XML 配置有关,存在的意义仅在于⽤来减少类完全限定名的冗余。直接指定类名例如:
这样配置的话在MyBatis的xml⽂件中可以直接使⽤UserMapper代替其类的全限定名。只指定包名 也可以指定⼀个包名,MyBatis会在包名下⾯搜索需要的 Java Bean,⽐如: 这么配置的话每⼀个在指定包名中的Java类,如果没有使⽤注解指定名称,则会默认使⽤Bean的⾸字母⼩写的⾮限定类名来作为它的别名,如果有注解,则优先使⽤注解指定的别名。如: @Alias(\"lonely_wolf\")public class LonelyWolf{} 这⾥因为注解指定了别名,所以会以注解为准,如果没有注解,则默认使⽤lonelyWolf作为别名。 系统默认提供的别名 实际开发中,有很多返回类型是数据基本类型或者String,Map,List等⾮常常见的类型,这些类型MyBatis已经为我们提供好了别名,我们就不需要另外再定义了。以下就时MyBatis中默认提供的别名: 别名_byte_long_short_int_integer_double_floatstringbytelongshortintintegerdoublefloatbooleandatedecimalobjectmaphashmaplistarraylistiterator 映射的类型bytelongshortintintdoublefloatStringByteLongShortIntegerIntegerDoubleFloatBooleanDateBigDecimalObjectMapHashmapListArraylistIterator _booleanboolean bigdecimalBigDecimal collectionCollection PS:这些别名的字母都是不区分⼤⼩写的,因为MyBatis在注册别名的时候会全部转为⼩写字母存储 typeHandlers typeHandlers主要是⽤来实现Java对象和数据库字段类型额转换关系。⽆论是 MyBatis 在预处理语句(PreparedStatement)中设置⼀个参数时,还是从结果集中取出⼀个值时, 都会⽤类型处理器将获取的值以合适的⽅式转换成 Java 类型。配置⽅式如下: MyBatis默认提供的Java Bean和数据库字段类型映射关系如下: 类型处理器 BooleanTypeHandlerByteTypeHandlerShortTypeHandlerIntegerTypeHandlerLongTypeHandlerFloatTypeHandlerDoubleTypeHandlerBigDecimalTypeHandlerStringTypeHandlerClobTypeHandlerNStringTypeHandlerNClobTypeHandlerByteArrayTypeHandlerBlobTypeHandlerDateTypeHandlerDateOnlyTypeHandlerTimeOnlyTypeHandlerSqlDateTypeHandlerSqlTimeTypeHandlerObjectTypeHandlerEnumTypeHandler Java类型 java.lang.Boolean,boolean数据库兼容的 BOOLEANjava.lang.Byte,bytejava.lang.Short , shortjava.lang.Integer , intjava.lang.Long , longjava.lang.Float , floatjava.lang.Double ,doublejava.math.BigDecimaljava.lang.Stringjava.lang.Stringjava.lang.Stringjava.lang.Stringbyte[]byte[]java.util.Datejava.util.Datejava.util.Datejava.sql.Datejava.sql.Time任意类型枚举类型 数据库兼容的NUMERIC或BYTE 数据库兼容的 NUMERIC 或 SHORT INTEGER数据库兼容的 NUMERIC 或 INTEGER数据库兼容的 NUMERIC 或 LONG INTEGER数据库兼容的 NUMERIC 或 FLOAT数据库兼容的 NUMERIC 或 DOUBLE数据库兼容的 NUMERIC 或 DECIMALCHAR , VARCHARCLOB , LONGVARCHARNVARCHAR , NCHARNCLOB 数据库兼容的字节流类型BLOB , LONGVARBINARYTIMESTAMPDATETIMETIMESTAMPDATETIME OTHER 或未指定类型 JDBC类型 SqlTimestampTypeHandlerjava.sql.Timestamp 类型处理器Java类型 EnumOrdinalTypeHandler枚举类型⾃定义typeHandlers VARCHAR-任何兼容的字符串类型,存储枚举的名称(⽽不是索引)JDBC类型 任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(⽽不是名称) 上⾯是MyBatis提供的默认映射类型,可以处理⼤部分需求,如果我们需要有不同的需求,则可以⾃⼰定义类型,具体如何定义,在后⾯的⽂章会单独分析,在这⾥不展开,感兴趣的可以关注我,留意后续⽂章。 objectFactory MyBatis 每次创建结果对象的新实例时,它都会使⽤⼀个对象⼯⼚(ObjectFactory)实例来完成。 默认的对象⼯⼚需要做的仅仅是实例化⽬标类,要么通过默认构造⽅法,要么在参数映射存在的时候通过参数构造⽅法来实例化。 如果想覆盖对象⼯⼚的默认⾏为,则 可以通过创建⾃⼰的对象⼯⼚来实现 plugins MyBatis 允许你在已映射语句执⾏过程中的某⼀点进⾏拦截调⽤。这⾥我们不详细讨论,后期会有单独⽂章介绍MyBatis插件 environments MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应⽤于多种数据库之中,例如:开发、测试和⽣产环境需要有不同的配置;或者共享相同 Schema 的多个⽣产数据库, 想使⽤相同的 SQL 映射。许多类似的⽤例。 注意:尽管可以配置多个环境,每个SqlSessionFactory实例只能选择其⼀。所以,如果想连接两个数据库,就需要创建两个SqlSessionFactory实例,每个数据库对应⼀个。配置⽰例如下: environment配置关键点: 默认的环境 ID(⽐如:default=”development”) 每个 environment 元素定义的环境 ID(⽐如:id=”development”)。事务管理器的配置(⽐如:type=”JDBC”)。数据源的配置(⽐如:type=”POOLED”)。事务管理器 在 MyBatis 中有两种类型的事务管理器(也就是 type=”JDBC\"或者\"MANAGED”): JDBC:这个配置就是直接使⽤了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。 MANAGED:这个配置⼏乎没做什么。它从来不提交或回滚⼀个连接,⽽是让容器来管理事务的整个⽣命周期(⽐如J2EE应⽤容器上下⽂)。 默认情况下它会关闭连接,然⽽⼀些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻⽌它默认的关闭⾏为。 如: 注意:如果单独使⽤MyBatis⽽没有集成能管理事务的容器,那么配置成MANAGED就会等同于没有事务,所以⼀般单独使⽤MyBatis时,应配置为JDBC。数据源 dataSource元素使⽤标准的 JDBC 数据源接⼝来配置JDBC连接对象的资源。有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”)。UNPOOLED ⾮连接池数据源。UNPOOLED 类型的数据源仅仅需要配置以下 5 种属性: driver – 这是 JDBC 驱动的 Java 类的完全限定名(并不是JDBC驱动中可能包含的数据源类)url – 这是数据库的 JDBC URL 地址username – 登录数据库的⽤户名password – 登录数据库的密码 defaultTransactionIsolationLevel – 默认的连接事务隔离级别POOLED 连接池数据源。除了上述提到UNPOOLED下的属性外,会有更多属性⽤来配置 POOLED 的数据源: poolMaximumActiveConnections – 在任意时间可以存在的活动(也就是正在使⽤)连接数量,默认值:10poolMaximumIdleConnections – 任意时间可能存在的空闲连接数 poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒) poolTimeToWait – 这是⼀个底层设置,如果获取连接花费的相当长的时间,它会给连接池打印状态⽇志并重新尝试获取⼀个连接(避免在误配置的情况下⼀直安静的失败),默认值:20000 毫秒(即 20 秒) poolPingQuery – 发送到数据库的侦测查询,⽤来检验连接是否处在正常⼯作秩序中并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有⼀个恰当的错误消息。 poolPingEnabled – 是否启⽤侦测查询。若开启,也必须使⽤⼀个可执⾏的 SQL 语句设置 poolPingQuery 属性(最好是⼀个⾮常快的 SQL),默认值:false poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的使⽤频度。这可以被设置成匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值:0(即所有连接每⼀时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适⽤)JNDI 这个数据源的实现是为了能在如 EJB 或应⽤服务器这类容器中使⽤,容器可以集中或在外部配置数据源,然后放置⼀个 JNDI 上下⽂的引⽤。这种数据源配置只需要两个属性: initial_context – 这个属性⽤来在 InitialContext 中寻找上下⽂(即,initialContext.lookup(initial_context))。这是个可选属性,如果忽略,那么 data_source 属性将会直接从 InitialContext 中寻找。 data_source – 这是引⽤数据源实例位置的上下⽂的路径。提供了 initial_context 配置时会在其返回的上下⽂中进⾏查找,没有提供时则直接在 InitialContext 中查找。⾃定义数据源 有些业务场景可能需要⾃⼰⾃定义数据源,MyBatis也是⽀持的。⾃定义数据源必须要实现DataSourceFactory接⼝。然后采⽤如下配置: databaseIdProvider MyBatis 可以根据不同的数据库⼚商执⾏不同的语句,这种多⼚商的⽀持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。如果同时找到带有databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 为⽀持多⼚商特性只要像下⾯这样在 mybatis-config.xml ⽂件中加⼊ databaseIdProvider 即可: mappers 这个就是⽤来配置sql映射语句的xml⽂件了。mappers⽂件共有4种配置⽅式:1、直接配置xml映射⽂件全限定名 2、通过url配置本地或者远程映射⽂件路径 3、通过配置Mapper接⼝的⽅式来配置。 4、通过配置Mapper接⼝包名的形式来配置 注意:在使⽤第3和第4两种⽅式配置的时候,需要把xml映射⽂件和Mapper接⼝⽂件放在同⼀个⽬录,⽽且必须同名。 如果⽤的是maven配置的话,可能会出现以下错误:Invalid bound statement (not found),出现之后需要注意检查⼀下target下⾯的class⽬录内有没有xml映射⽂件,如果没有的话需要在pom⽂件中加⼊以下配置(因为maven默认不会加载xml⽂件): PS:上⾯的配置⽂件中所有的根节点需要按照顺序配置,可以不配置某些属性,但是如果配置了,从上到下⼀定要按照以下顺序配置: properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,reflectorFactory,plugins,environments,databaseIdProvider,mappers 总结 本⽂主要介绍了MyBatis中的核⼼配置⽂件的使⽤,本⽂其实更适合作为⼿册来参考,只需⼤致浏览,⼼⾥有个印象,需要⽤的时候再去查询即可 到此这篇关于最全MyBatis核⼼配置⽂件总结(收藏)的⽂章就介绍到这了,更多相关MyBatis核⼼配置⽂件内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持! 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务