MyBatisxml配置⽂件详解
⼀、MyBatis 配置⽂件基本结构
在使⽤mybatis框架时,⾸先导⼊其对应的jar包,并进⾏相应的配置,所以得对配置⽂件的每个参数都得了解。⼀个完全的mybatis配置⽂件结构如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-////DTD Config 3.0//EN"
"/dtd/mybatis-3-config.dtd">
<!-- 配置⽂件的根元素 -->
<configuration>
<!-- 属性:定义配置外在化 -->
<properties></properties>
<!-- 设置:定义mybatis的⼀些全局性设置 -->
<settings>
<!-- 具体的参数名和参数值 -->
<setting name="" value=""/>
</settings>
<!-- 类型名称:为⼀些类定义别名 -->
<typeAliases></typeAliases>
<!-- 类型处理器:定义Java类型与数据库中的数据类型之间的转换关系 -->
<typeHandlers></typeHandlers>
<!-- 对象⼯⼚ -->
<objectFactory type=""></objectFactory>
<!-- 插件:mybatis的插件,插件可以修改mybatis的内部运⾏规则 -->
<plugins>
<plugin interceptor=""></plugin>
</plugins>
<!-- 环境:配置mybatis的环境 -->
<environments default="">
<!-- 环境变量:可以配置多个环境变量,⽐如使⽤多数据源时,就需要配置多个环境变量 -->
<environment id="">
<!-- 事务管理器 -->
<transactionManager type=""></transactionManager>
<!-- 数据源 -->
<dataSource type=""></dataSource>
</environment>
</environments>
<!-- 数据库⼚商标识 -->
<databaseIdProvider type=""></databaseIdProvider>
<!-- 映射器:指定映射⽂件或者映射类 -->
<mappers></mappers>
</configuration>
1、properties
properties元素主要是⽤来定义配置外在化,⽐如数据库的连接属性等。这些属性都是可外部配置且可动态替换的,既可以在典型的Java属性⽂件中配置,亦可以通过properties元素的⼦元素来传递。例如:
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
其中的属性就可以在整个配置⽂件中使⽤来替换需要动态配置的属性值。⽐如在数据源中使⽤的例⼦:
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
bigdecimal转换为integer这个例⼦中的username和password将会由properties元素中设置的相应值来替换。driver和url属性将会由config.properties⽂件中对应的值来替换。这样就为配置提供了诸多灵活选择。属性也可以被传递到SqlSessionBuilder.build()⽅法中。例如:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, props);
// ... or ...
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, props);
但是,这也就涉及到了优先级的问题,如果属性不只在⼀个地⽅配置,那么mybatis将会按照下⾯的顺序来加载:在properties元素体内指定的属性⾸先被读取。
然后根据properties元素中的resource属性读取类路径下属性⽂件或根据url属性指定的路径读取属性⽂件,并覆盖已读取的同名属性。
最后读取作为⽅法参数传递的属性,并覆盖已读取的同名属性。
因此,通过⽅法参数传递的属性具有最⾼优先级,resource/url属性中指定的配置⽂件次之,最低优先级的是properties属性中指定的属性。
2、 settings
setting是指定MyBatis的⼀些全局配置属性,这是MyBatis中极为重要的调整设置,它们会改变MyBatis的运⾏时⾏为,所以我们需要清楚的知道这些属性的作⽤及默认值。
设置参数描述有效值默认值
cacheEnabled 该配置影响的所有映射器中配置的缓存的全
局开关
true | false true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联
对象都会延迟加载。 特定关联关系中可通过
设置fetchType属性来覆盖该项的开关状态
true | false false
aggressiveLazyLoading 当启⽤时,对任意延迟属性的调⽤会使带有
延迟加载属性的对象完整加载;反之,每种
属性将会按需加载。
true | false true
multipleResultSetsEnabled 是否允许单⼀语句返回多结果集(需要兼容
驱动)。
true | false true
useColumnLabel 使⽤列标签代替列名。不同的驱动在这⽅⾯
会有不同的表现, 具体可参考相关驱动⽂档
或通过测试这两种不同的模式来观察所⽤驱
动的结果。
true | false true
useGeneratedKeys 允许 JDBC ⽀持⾃动⽣成主键,需要驱动
兼容。 如果设置为 true 则这个设置强制使
⽤⾃动⽣成主键,尽管⼀些驱动不能兼容但
仍可正常⼯作(⽐如 Derby)。
true | false False
autoMappingBehavior 指定 MyBatis 应如何⾃动映射列到字段或
属性。 NONE 表⽰取消⾃动映射;
PARTIAL 只会⾃动映射没有定义嵌套结果
集映射的结果集。 FULL 会⾃动映射任意复
NONE, PARTIAL,
FULL
PARTIAL
杂的结果集(⽆论是否嵌套)。
defaultExecutorType 配置默认的执⾏器。SIMPLE 就是普通的执
⾏器;REUSE 执⾏器会重⽤预处理语句
(prepared statements); BATCH 执
⾏器将重⽤语句并执⾏批量更新。
SIMPLE REUSE
BATCH
SIMPLE
defaultStatementTimeout 设置超时时间,它决定驱动等待数据库响应
的秒数。
Any positive integer Not Set (null)
defaultFetchSize Sets the driver a hint as to control
fetching size for return results. This
parameter value can be override by a
query setting.
Any positive integer Not Set (null)
safeRowBoundsEnabled 允许在嵌套语句中使⽤分页
(RowBounds)。
true | false False
mapUnderscoreToCamelCase 是否开启⾃动驼峰命名规则(camel
case)映射,即从经典数据库列名
A_COLUMN 到经典 Java 属性名
aColumn 的类似映射。
true | false False
localCacheScope MyBatis 利⽤本地缓存机制(Local
Cache)防⽌循环引⽤(circular
references)和加速重复嵌套查询。 默认
值为 SESSION,这种情况下会缓存⼀个会
话中执⾏的所有查询。 若设置值为
STATEMENT,本地会话仅⽤在语句执⾏
上,对相同 SqlSession 的不同调⽤将不会
共享数据。
SESSION |
STATEMENT
SESSION
jdbcTypeForNull 当没有为参数提供特定的 JDBC 类型时,
为空值指定 JDBC 类型。 某些驱动需要指
定列的 JDBC 类型,多数情况直接⽤⼀般
类型即可,⽐如 NULL、VARCHAR 或
OTHER。
JdbcType
enumeration. Most
common are: NULL,
VARCHAR and
OTHER
OTHER
lazyLoadTriggerMethods指定哪个对象的⽅法触发⼀次延迟加载。A method name list
separated by
commas
equals,clone,hashCode,toString
defaultScriptingLanguage指定动态 SQL ⽣成的默认语⾔。A type alias or fully
qualified class name.
org.apache.ltags
.XMLDynamicLanguageDriver
callSettersOnNulls 指定当结果集中值为 null 的时候是否调⽤
映射对象的 setter(map 对象时为 put)
⽅法,这对于有 Map.keySet() 依赖或 null
值初始化的时候是有⽤的。注意基本类型
(int、boolean等)是不能设置成 null
的。
true | false false
logPrefix指定 MyBatis 增加到⽇志名称的前缀。Any String Not set
logImpl 指定 MyBatis 所⽤⽇志的具体实现,未指
定时将⾃动查。
SLF4J | LOG4J |
LOG4J2 |
JDK_LOGGING |
COMMONS_LOGGING
| STDOUT_LOGGING
| NO_LOGGING
Not set
proxyFactory 指定 Mybatis 创建具有延迟加载能⼒的对
象所⽤到的代理⼯具。
CGLIB | JAVASSIST JAVASSIST (MyBatis 3.3 or above)
⼀个完整的settings元素⽰例如下:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
3、typeAliases
类型别名是为Java类型设置⼀个短的名字。它只和xml配置有关,存在的意义仅在于⽤来减少类完全限定名的冗余,例如:
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
当这样配置时,Blog可以⽤在任何使⽤domain.blog.Blog的地⽅。
也可以指定⼀个包名,MyBatis会在包名下搜索需要的JavaBean,⽐如:
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
每⼀个在包domain.blog中的JavaBean,在没有注解的情况下,会使⽤Bean的⾸字母⼩写的⾮限类名来作为它的别名。⽐如domain.blog.Author的别名为author;若有注解,则别名为注解值。看下⾯的例⼦:
@Alias("author")
public class Author{
...
}
已经为许多常见的Java类型内建了相应的类型别名。它们都是⼤⼩写不敏感的,需要注意的是有基本类型名称重复导致的特殊处理。别名映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator
4、typeHandlers
⽆论是 MyBatis 在预处理语句(PreparedStatement)中设置⼀个参数时,还是从结果集中取出⼀个
值时, 都会⽤类型处理器将获取的值以合适的⽅式转换成 Java 类型。下表描述了⼀些默认的类型处理器。
类型处理器Java 类型JDBC 类型
BooleanTypeHandler java.lang.Boolean, boolean数据库兼容的 BOOLEAN
ByteTypeHandler java.lang.Byte, byte数据库兼容的 NUMERIC 或 BYTE
ShortTypeHandler java.lang.Short, short数据库兼容的 NUMERIC 或 SHORT INTEGER
IntegerTypeHandler java.lang.Integer, int数据库兼容的 NUMERIC 或 INTEGER
LongTypeHandler java.lang.Long, long数据库兼容的 NUMERIC 或 LONG INTEGER
FloatTypeHandler java.lang.Float, float数据库兼容的 NUMERIC 或 FLOAT
DoubleTypeHandler java.lang.Double, double数据库兼容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandler java.math.BigDecimal数据库兼容的 NUMERIC 或 DECIMAL
StringTypeHandler java.lang.String CHAR, VARCHAR
ClobTypeHandler java.lang.String CLOB, LONGVARCHAR
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论