上篇文章:MyBatis知识盘点【贰】_MyBatis组件概览
mybatis-config.xml应该是MyBatis框架的全局配置文件。其配置元素如下:
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
下面逐一进行介绍
properties
特性
注意:
MyBatis 将按照下面的顺序来加载属性:
- 在 properties 元素体内定义的属性首先被读取。
- 然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。
- 最后读取parameterType传递的属性,它会覆盖已读取的同名属性。
建议:
不要在
properties
元素体内添加任何属性值,只将属性值定义在
properties
文件中。
在
properties
文件中定义属性名要有一定的特殊性,如:
XXXXX.XXXXX.XXXX
settings全局配置
mybatis
框架在运行时可以调整一些运行参数。
比如:开启二级缓存、开启延迟加载。
全局参数将会影响
mybatis
的运行行为。
源码见org.apache.ibatis.type.TypeHandlerRegistry。
注意:数据库的int,double和decimal和java里是不一样的;
日期,到日用SqlDateTypeHandler即可,到秒用SqlTimestampTypeHandler
mappers(映射配置)
Setting(设置)
|
Description(描述)
|
Valid Values(验证值组)
|
Default(默认值)
|
cacheEnabled
|
在全局范围内启用或禁用缓存配置任何映射器在此配置下。
|
true | false
|
TRUE
|
lazyLoadingEnabled
|
在全局范围内启用或禁用延迟加载。禁用时,所有协会将热加载。
|
true | false
|
TRUE
|
aggressiveLazyLoading
|
启用时,有延迟加载属性的对象将被完全加载后调用懒惰的任何属性。否则,每一个属性是按需加载。
|
true | false
|
TRUE
|
multipleResultSetsEnabled
|
允许或不允许从一个单独的语句(需要兼容的驱动程序)要返回多个结果集。
|
true | false
|
TRUE
|
useColumnLabel
|
使用列标签,而不是列名。在这方面,不同的驱动有不同的行为。参考驱动文档或测试两种方法来决定你的驱动程序的行为如何。
|
true | false
|
TRUE
|
useGeneratedKeys
|
允许JDBC支持生成的密钥。兼容的驱动程序是必需的。此设置强制生成的键被使用,如果设置为true,一些驱动会不兼容性,但仍然可以工作。
|
true | false
|
FALSE
|
autoMappingBehavior
|
指定MyBatis的应如何自动映射列到字段/属性。NONE自动映射。 PARTIAL只会自动映射结果没有嵌套结果映射定义里面。 FULL会自动映射的结果映射任何复杂的(包含嵌套或其他)。
|
NONE, PARTIAL, FULL
|
PARTIAL
|
defaultExecutorType
|
配置默认执行人。SIMPLE执行人确实没有什么特别的。 REUSE执行器重用准备好的语句。 BATCH执行器重用语句和批处理更新。
|
SIMPLE REUSE BATCH
|
SIMPLE
|
defaultStatementTimeout
|
设置驱动程序等待一个数据库响应的秒数。
|
Any positive integer
|
Not Set (null)
|
safeRowBoundsEnabled
|
允许使用嵌套的语句RowBounds。
|
true | false
|
FALSE
|
mapUnderscoreToCamelCase
|
从经典的数据库列名A_COLUMN启用自动映射到骆驼标识的经典的Java属性名aColumn。
|
true | false
|
FALSE
|
localCacheScope
|
MyBatis的使用本地缓存,以防止循环引用,并加快反复嵌套查询。默认情况下(SESSION)会话期间执行的所有查询缓存。如果localCacheScope=STATMENT本地会话将被用于语句的执行,只是没有将数据共享之间的两个不同的调用相同的SqlSession。
|
SESSION | STATEMENT
|
SESSION
|
dbcTypeForNull
|
指定为空值时,没有特定的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.ibatis.scripting.xmltags.XMLDynamicLanguageDriver
|
callSettersOnNulls
|
指定如果setter方法或地图的put方法时,将调用检索到的值是null。它是有用的,当你依靠Map.keySet()或null初始化。注意原语(如整型,布尔等)不会被设置为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
|
|
typeAliases(别名)
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。
如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。
mybatis默认支持别名
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。
如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。
mybatis默认支持别名
别名
|
映射的类型
|
_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
object
map
hashmap
list
arraylist
collection
iterator
ResultSet
|
BigDecimal
Object
Map
(不支持数组)
HashMap
(不支持数组)
List
(不支持数组)
ArrayList
(不支持数组)
Collection
(不支持数组)
Interator
(不支持数组)
ResultSet
(不支持数组)
|
源码在org.apache.ibatis.type.TypeAliasRegistry。
<typeAliases>
<typeAlias alias="userInfo" type="com.xinzun.bean.UserInfo" /> <!-- 单条别名 -->
<package name = "com.xinzun.bean"> <!-- 扫描包内所有类,别名即类名 -->
</typeAliases>
<typeAlias alias="userInfo" type="com.xinzun.bean.UserInfo" /> <!-- 单条别名 -->
<package name = "com.xinzun.bean"> <!-- 扫描包内所有类,别名即类名 -->
</typeAliases>
类上写注解@Alias("test")可以自定义。
typeHandlers(类型处理器)
mybatis中通过typeHandlers完成jdbc类型和java类型的转换。
通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义.
mybatis支持类型处理器:
mybatis中通过typeHandlers完成jdbc类型和java类型的转换。
通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义.
mybatis支持类型处理器:
类型处理器
|
Java
类型
|
JDBC
类型
|
BooleanTypeHandler
|
Boolean
,
boolean
|
任何兼容的布尔值
|
ByteTypeHandler
|
Byte
,
byte
|
任何兼容的数字或字节类型
|
ShortTypeHandler
|
Short
,
short
|
任何兼容的数字或短整型
|
IntegerTypeHandler
|
Integer
,
int
|
任何兼容的数字和整型
|
LongTypeHandler
|
Long
,
long
|
任何兼容的数字或长整型
|
FloatTypeHandler
|
Float
,
float
|
任何兼容的数字或单精度浮点型
|
DoubleTypeHandler
|
Double
,
double
|
任何兼容的数字或双精度浮点型
|
BigDecimalTypeHandler
|
BigDecimal
|
任何兼容的数字或十进制小数类型
|
StringTypeHandler
|
String
|
CHAR
和
VARCHAR
类型
|
ClobTypeHandler
|
String
|
CLOB
和
LONGVARCHAR
类型
|
NStringTypeHandler
|
String
|
NVARCHAR
和
NCHAR
类型
|
NClobTypeHandler
|
String
|
NCLOB
类型
|
ByteArrayTypeHandler
|
byte[]
|
任何兼容的字节流类型
|
BlobTypeHandler
|
byte[]
|
BLOB
和
LONGVARBINARY
类型
|
DateTypeHandler
|
Date
(
java.util
)
|
TIMESTAMP
类型
|
DateOnlyTypeHandler
|
Date
(
java.util
)
|
DATE
类型
|
TimeOnlyTypeHandler
|
Date
(
java.util
)
|
TIME
类型
|
SqlTimestampTypeHandler
|
Timestamp
(
java.sql
)
|
TIMESTAMP
类型
|
SqlDateTypeHandler
|
Date
(
java.sql
)
|
DATE
类型
|
SqlTimeTypeHandler
|
Time
(
java.sql
)
|
TIME
类型
|
ObjectTypeHandler
|
任意
|
其他或未指定类型
|
EnumTypeHandler
|
Enumeration
类型
|
VARCHAR-
任何兼容的字符串类型,作为代码存储(而不是索引)。
|
注意:数据库的int,double和decimal和java里是不一样的;
日期,到日用SqlDateTypeHandler即可,到秒用SqlTimestampTypeHandler
objectFactory(对象工厂)
当MyBatis构建一个结果返回时,使用ObjectFactory类将其映射成pojo类。默认使用org.apache.ibatis.reflection.factory.DefaultObjectFactory。
当MyBatis构建一个结果返回时,使用ObjectFactory类将其映射成pojo类。默认使用org.apache.ibatis.reflection.factory.DefaultObjectFactory。
mappers(映射配置)
- 通过resource加载单个映射文件
- 通过mapper接口加载单个mapper
按照上边的规范,将mapper.java和mapper.xml放在一个目录 ,且同名。
- 批量加载mapper(推荐使用)
- 通过xml导入
environment配置
<!--配置environment环境-->
<environments default="development1">
<!-- 环境配置1,每个SqlSessionFactory对应一个环境 -->
<environment id="development1">
<!-- 事务配置 type= JDBC、MANAGED
1.JDBC:这个配置直接简单使用了JDBC的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。
2.MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。
而它会让容器来管理事务的整个生命周期(比如Spring或JEE应用服务器的上下文)。
默认情况下它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止它,
将closeConnection属性设置为false。JNDI中常用。
-->
<transactionManager type="JDBC" />
<!--
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
-->
<!-- 数据源类型:type = UNPOOLED、POOLED、JNDI
1.UNPOOLED:这个数据源的实现是每次被请求时简单打开和关闭连接。
它有一点慢,这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接。
不同的数据库对这个的表现也是不一样的,所以对某些数据库来说配置数据源并不重要,这个配置也是闲置的
org.apache.ibatis.datasource.unpooled.UnpooledDataSource
2.POOLED:这是JDBC连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。
这是一种当前Web应用程序用来快速响应请求很流行的方法。
org.apache.ibatis.datasource.pooled.PooledDataSource
3.JNDI:这个数据源的实现是为了使用如Spring或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用
org.apache.ibatis.datasource.jndi.JndiDataSourceFactory
-->
<dataSource type="UNPOOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- 默认连接事务隔离级别 <property name="defaultTransactionIsolationLevel" value=""
/> -->
</dataSource>
</environment>
<!-- 环境配置2 -->
<environment id="development2">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/xhm" />
<property name="username" value="root" />
<property name="password" value="root" />
<!-- 在任意时间存在的活动(也就是正在使用)连接的数量 -->
<property name="poolMaximumActiveConnections" value="10" />
<!-- 任意时间存在的空闲连接数 -->
<property name="poolMaximumIdleConnections" value="5" />
<!-- 在被强制返回之前,池中连接被检查的时间 -->
<property name="poolMaximumCheckoutTime" value="20000" />
<!-- 这是给连接池一个打印日志状态机会的低层次设置,还有重新尝试获得连接,这些情况下往往需要很长时间(为了避免连接池没有配置时静默失败) -->
<property name="poolTimeToWait" value="20000" />
<!-- 发送到数据的侦测查询,用来验证连接是否正常工作,并且准备接受请求。 -->
<property name="poolPingQuery" value="NO PING QUERY SET" />
<!-- 这是开启或禁用侦测查询。如果开启,你必须用一个合法的SQL语句(最好是很快速的)设置poolPingQuery属性 -->
<property name="poolPingEnabled" value="false" />
<!-- 这是用来配置poolPingQuery多次时间被用一次。这可以被设置匹配标准的数据库连接超时时间,来避免不必要的侦测 -->
<property name="poolPingConnectionsNotUsedFor" value="0" />
</dataSource>
</environment>
<!-- 环境配置3 -->
<environment id="development3">
<transactionManager type="JDBC" />
<dataSource type="JNDI">
<property name="data_source" value="java:comp/env/jndi/mybatis" />
<property name="env.encoding" value="UTF8" />
<!-- <property name="initial_context" value=""/> <property name="env.encoding"
value="UTF8"/> -->
</dataSource>
</environment>
</environments>
<environments default="development1">
<!-- 环境配置1,每个SqlSessionFactory对应一个环境 -->
<environment id="development1">
<!-- 事务配置 type= JDBC、MANAGED
1.JDBC:这个配置直接简单使用了JDBC的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。
2.MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。
而它会让容器来管理事务的整个生命周期(比如Spring或JEE应用服务器的上下文)。
默认情况下它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止它,
将closeConnection属性设置为false。JNDI中常用。
-->
<transactionManager type="JDBC" />
<!--
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
-->
<!-- 数据源类型:type = UNPOOLED、POOLED、JNDI
1.UNPOOLED:这个数据源的实现是每次被请求时简单打开和关闭连接。
它有一点慢,这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接。
不同的数据库对这个的表现也是不一样的,所以对某些数据库来说配置数据源并不重要,这个配置也是闲置的
org.apache.ibatis.datasource.unpooled.UnpooledDataSource
2.POOLED:这是JDBC连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。
这是一种当前Web应用程序用来快速响应请求很流行的方法。
org.apache.ibatis.datasource.pooled.PooledDataSource
3.JNDI:这个数据源的实现是为了使用如Spring或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用
org.apache.ibatis.datasource.jndi.JndiDataSourceFactory
-->
<dataSource type="UNPOOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- 默认连接事务隔离级别 <property name="defaultTransactionIsolationLevel" value=""
/> -->
</dataSource>
</environment>
<!-- 环境配置2 -->
<environment id="development2">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/xhm" />
<property name="username" value="root" />
<property name="password" value="root" />
<!-- 在任意时间存在的活动(也就是正在使用)连接的数量 -->
<property name="poolMaximumActiveConnections" value="10" />
<!-- 任意时间存在的空闲连接数 -->
<property name="poolMaximumIdleConnections" value="5" />
<!-- 在被强制返回之前,池中连接被检查的时间 -->
<property name="poolMaximumCheckoutTime" value="20000" />
<!-- 这是给连接池一个打印日志状态机会的低层次设置,还有重新尝试获得连接,这些情况下往往需要很长时间(为了避免连接池没有配置时静默失败) -->
<property name="poolTimeToWait" value="20000" />
<!-- 发送到数据的侦测查询,用来验证连接是否正常工作,并且准备接受请求。 -->
<property name="poolPingQuery" value="NO PING QUERY SET" />
<!-- 这是开启或禁用侦测查询。如果开启,你必须用一个合法的SQL语句(最好是很快速的)设置poolPingQuery属性 -->
<property name="poolPingEnabled" value="false" />
<!-- 这是用来配置poolPingQuery多次时间被用一次。这可以被设置匹配标准的数据库连接超时时间,来避免不必要的侦测 -->
<property name="poolPingConnectionsNotUsedFor" value="0" />
</dataSource>
</environment>
<!-- 环境配置3 -->
<environment id="development3">
<transactionManager type="JDBC" />
<dataSource type="JNDI">
<property name="data_source" value="java:comp/env/jndi/mybatis" />
<property name="env.encoding" value="UTF8" />
<!-- <property name="initial_context" value=""/> <property name="env.encoding"
value="UTF8"/> -->
</dataSource>
</environment>
</environments>