目录
properties(属性配置)
<properties resource="" url="">
<property name="" value=""/>
...
</properties>
ibatis中加载属性配置的方式有三种.
方式 | 描述 |
a | 直接使用字面量的形式,在内标签property中配置; |
b | 加载properties配置文件的数据,有两种途径可供选择. resource:从classpath路径中加载文件; url:从网络路径或者物理磁盘路径中加载文件; |
c | 使用java.util.Properties的类实例进行配置,借用的是 org.apache.ibatis.session.SqlSessionFactoryBuilder.build() 的重写的方法. |
优先级 | c>b>a . |
属性占位符的功能(最低版本3.4.2).
${key:defalut-value};表示指定的key若无法取值的话,就使用符号`:`指定的默认值.
注意:属性占位符的功能默认是关闭的,需要手动开启.
<property
name="org.apache.ibatis.parsing.PropertyParser.enable-default-value"
value="true" />
也可以使用ONGL表达式中的三元运算符,来使用属性占位符.
但也需要额外修改ibatis的默认配置.
<property
name="org.apache.ibatis.parsing.PropertyParser.enable-default-value"
value="true" />
<property
name="org.apache.ibatis.parsing.PropertyParser.default-value-separator"
value="?:" />
settings(设置ibatis运行状态)
这是ibatis中最复杂的配置,修改默认设置,会变更ibatis的运行状态.
如无特别需求,不建议设置.
<settings>
<setting name="" value="" />
...
</settings>
可设置的属性列表
属性/name | 描述说明 | 合法值(类型) | 默认值 |
cacheEnabled | 映射器的配置缓存/cache,是否全局开启 | 布尔值 | true |
lazyLoadingEnabled | 延迟加载,是否全局开启. 若开启,所有的关联对象都会延迟加载. 有特殊需求,可通过设置fetchType属性来覆盖. | 布尔值 | false |
aggressiveLazyLoading | 任何方法调用都加载该类的所有属性,是否全局开启. 否则按需加载,可参考属性lazyLoadTriggerMethods | 布尔值 | false 3.4.2之前,是true. |
multipleResultSetsEnabled | 是否允许单一结果返回多结果集.(需要兼容驱动) | 布尔值 | true |
useColumnLabel | 是否,使用列标签替代列名.(需要兼容驱动) | 布尔值 | true |
useGeneratedKeys | 是否,允许JDBC支持自动主键生成.(需要兼容驱动) | 布尔值 | false |
autoMappingBehavior | 设置ibatis自动映射列,到字段或属性的行为. NONE:取消自动映射; PARTIAL:映射没有定义嵌套结果集映射的结果集. | NONE|PARTIAL| FULL | PARTIAL |
autoMappingUnknown ColumnBehavior | 自动映射中,发现未知列或属性的处理行为. WARNING:输出警告日志; | NONE|WARNING| FAILING | NONE |
defaultExecutorType | 指定默认的执行器. | SIMPLE|REUSE| BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间 | 任意正整数 | \ |
defaultFetchSize | 给结果集获取的数量,设置一个提示值. | 任意正整数 | \ |
safeRowBoundsEnabled | 是否,不允许在嵌套语句中使用分页. RowBounds | 布尔值 | false |
safeResultHandlerEnabled | 是否,不允许在嵌套语句中使用分页. ResultHandler | 布尔值 | true |
mapUnderscoreToCamelCase | 自动映射中,是否启用驼峰命名法. | 布尔值 | false |
localCacheScope | ibatis本地缓存机制的作用域. SESSION:缓存一个会话中执行的所有查询. | SESSION| STATEMENT | SESSION |
jdbcTypeForNull | 为null指定jdbcType. | NULL|VARCHAR |OTHER|... | OTHER |
lazyLoadTriggerMethods | 指定哪个对象,触发一次延迟加载. | 合法的方法名, 多个用逗号分隔 | equals,clone, hashCode,toString |
defaultScriptingLanguage | 指定动态生成sql的默认语言. | 合法的类对象的 完全限定名 | org.apache.ibatis. scripting.xmltags. XMLLanguageDriver |
defaultEnumTypeHandler | 默认的枚举类型处理器 | 合法的枚举类型处理器, 合法的完全限定名. | org.apache.ibatis. type.EnumTypeHandler |
callSettersOnNulls | 是否,当结果集的值为null时, 自动调用映射类对象的 setter方法(map实例的put). | 布尔值 | false |
returnInstanceForEmptyRow | 当结果集的所有列为空时,ibatis默认返回NULL.若开启,则返回一个空实例. | 布尔值 | false |
logPrefix | 指定日志名称的前缀 | 字符串 | \ |
logImpl | ibatis使用日志组件的实现,若未指定则自动查找. | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_ LOGGING | STDOUT_LOGGING | NO_LOGGING | \ |
proxyFactory | 指定ibatis创建延迟加载对象,所用到的代理工具. | CGLIB | JAVASSIST | JAVASSIST |
vfsImpl | 指定VFS的实现 | 合法的完全限定名 | \ |
useActualParamName | 是否,允许方法签名名称作为语句 参数名称.要求:Java 8编译器设置 -parameters参数. | 布尔值 | true |
configurationFactory | 手动提供Configuration的实例类 | 合法的完全限定名 | \ |
typeAliases(设置类对象的别名)
<typeAliases>
<package name="" />
...
<typeAlias type="" alias="" />
...
</typeAliases>
在ibatis中,别名是不区分大小写的
设置别名的方式
- 直接在配置文件中,使用内置标签typeAlias进行设置.
若没有指定属性name的值,则默认采用驼峰命名法注册别名.<typeAlias type="xxx.xxx.TypeName" alias="typeAlias" />
- 若配置别名任务量大,则可使用内置的package标签,进行设置.
和typeAlias标签的特性类似.若不结合使用注解@Alias,则默认采用驼峰命名法注册别名.
前提是,注册的不同的包中,不存在相同标识符的类对象.<package name="xxx.xxx.packageName" />
ibatis中内建了基本常用的注解.
可参考类对象:org.apache.ibatis.type.TypeAliasRegistry .
Java的基本类型注册时,别名都前缀符号`_`.
public TypeAliasRegistry() {
registerAlias("string", String.class);
registerAlias("byte", Byte.class);
registerAlias("long", Long.class);
registerAlias("short", Short.class);
registerAlias("int", Integer.class);
registerAlias("integer", Integer.class);
registerAlias("double", Double.class);
registerAlias("float", Float.class);
registerAlias("boolean", Boolean.class);
...
typeHandlers(类型处理器)
<typeHandlers>
<package name="" />
...
<typeHandler handler="" javaType="" jdbcType="" />
...
</typeHandlers>
ibatis内置的类型处理器
内置处理器typeHandler,主要的效用,就是为了解决在自动映射中,javaType和jdbcType之间的类型转换.
从 3.4.5 开始,MyBatis 默认支持 JSR-310.
若需要自定义类型处理器,只需要实现TypeHandler或者BaseTypeHandler,实现具体行为和属性即可.
可参考的内置类是: org.apache.ibatis.type.TypeHandlerRegistry .
public TypeHandlerRegistry() {
register(Boolean.class, new BooleanTypeHandler());
register(boolean.class, new BooleanTypeHandler());
register(JdbcType.BOOLEAN, new BooleanTypeHandler());
register(JdbcType.BIT, new BooleanTypeHandler());
register(Byte.class, new ByteTypeHandler());
register(byte.class, new ByteTypeHandler());
register(JdbcType.TINYINT, new ByteTypeHandler());
register(Short.class, new ShortTypeHandler());
register(short.class, new ShortTypeHandler());
register(JdbcType.SMALLINT, new ShortTypeHandler());
register(Integer.class, new IntegerTypeHandler());
register(int.class, new IntegerTypeHandler());
register(JdbcType.INTEGER, new IntegerTypeHandler());
...
内置的枚举类型处理器
ibatis中内置了两种枚举类型处理器.
org.apache.ibatis.type.EnumTypeHandler<E> , 以枚举字符串名称作为参数传递, toString() .
org.apache.ibatis.type.EnumOrdinalTypeHandler<E> , 以整数下标作为参数传递, ordinal() .
EnumTypeHandler是默认枚举类型处理器.但是自动映射器(auto-mapper)会自动地选用 EnumOrdinalTypeHandler 来处理.
使用指定枚举类型处理器的步骤:
- 指定枚举类型处理器的完全限定名,并指定需要转换映射的javaType和jdbcType.
这一操作,可在配置标签typeHandler中一步设定,也可分开设置.
即在子定义实现的枚举类型处理器的类级别上使用注解@MappedType(EnumTypeName.class)
和@MappedJdbcTypes(value ={}, includeNullJdbcType = true)
但是从3.4.0开始,处理枚举类型是,不需要对未知的枚举jdbc类型进行null设置了.
或者不设置javaType属性,在自定义的枚举类型处理器中,使用注解@MappedTypes和@MappedJdbcTypes .<typeHandler handler="org.apache.ibatis.type.EnumTypeHandler" javaType="xxx.xxx.enum.EnumName" />
@MappedTypes(MyEnum.class) @MappedJdbcTypes(value ={}, includeNullJdbcType = true) public class MyEnumTypeHandler extends BaseTypeHandler<String> {
- 在映射文件中,显示为sql语句指定类型处理器.
<resultMap type="xxx" id="xxx"> <result property="prop" column="colu" typeHandler="org.apache.ibatis.type.EnumTypeHandler" /> </resultMap> <select id="xxx" resultMap="xxx"> SELECT * FROM tbl_name </select> <insert id="xxx"> INSERT INTO tbl_name(colu) VALUE(#{prop, typeHandler=org.apache.ibatis.type.EnumTypeHandler}) </insert>
-
获取mapper的实例,就可遍历的 含有枚举类型的表了.
objectFactory(对象工厂配置)
ibatis创建一个结果对象的实例时,需要使用ObjectFactory对象实例.
默认情况下,ibatis使用的对象工厂类对象是: org.apache.ibatis.reflection.factory.DefaultObjectFactory .
若需要自定义的话,只需要实现DefaultObjectFactory,新增所需的行为和属性即可.
ibatis的对象工厂可满足大多数需求,若无特殊需求,无需设置.
<objectFactory type="">
<property name="" value="" />
...
</objectFactory>
plugins(插件配置)
<plugins>
<plugin interceptor="" >
<property name="" value=""/>
...
</plugin>
...
</plugins>
ibatis中的插件主要效用是,拦截sql执行语句的执行过程.
以下是ibatis允许拦截的方法.
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
environments(环境配置集)
<environments default="">
<environment id="">
<transactionManager type="">
<property name="" value=""/>
...
</transactionManager>
<dataSource type="">
<property name="" value=""/>
...
</dataSource>
</environment>
...
</environments>
environments解析
environments可以配置多个数据源/environment,一个数据源包含一个数据库配置/datasource
和一个数据事务配置/transactionManager.
其属性defalut表示,在缺省的情况下,将启用哪个数据源配置.
environment(数据源配置)
标签environment的属性id,表示的是全局唯一标识符.
transactionManager(数据事务配置)
配置方式
JBDC:使用JDBC来管理事务.
MANAGE:让容器来管理事务,什么也不做.
自定义:自定义数据库事务管理的方式.
dataSource(数据库配置)
ibatis提供了三种内建的数据源类型.
type=”[UNPOOLED|POOLED|JNDI]”
补充:也可使用其他数据源配置,通常使用POOLED.
UNPOOLED(非连接池数据库)
driver | 驱动的完全限定名 |
url | 数据库的url地址 |
username | \ |
password | \ |
defaultTransactionIsolationLevel | 连接事务的隔离级别 |
作为可选项,可以传递属性给数据库驱动. driver.encoding=UTF8 相当于DriverManager.getConnection(url,properties)的效用. |
可参考jdk中DriverManager内置的源码
@CallerSensitive
public static Connection getConnection(String url,
java.util.Properties info) throws SQLException {
return (getConnection(url, info, Reflection.getCallerClass()));
}
POOLED(连接池数据库)
driver | 驱动的完全限定名 |
url | 数据库的url地址 |
username | \ |
password | \ |
defaultTransactionIsolationLevel | 连接事务的隔离级别 |
poolMaximumActiveConnections | 可活动的连接数,默认值10 |
poolMaximumIdleConnections | 可存在的空闲连接数 |
poolMaximumCheckoutTime | 被强制返回之前,池中连接被check out的时间,默认值20000毫秒. |
poolTimeToWait | 获取连接花费较长时间,连接池打印状态日志,并尝试重新连接;默认值20000毫秒,即20秒. |
poolMaximumLocalBadConnectionTolerance | 从连接池中,若获取的是坏连接,允许重新获取新连接的次数,默认值3.设置的次数不应当超过poolMaximumIdleConnections 与poolMaximumLocalBadConnectionTolerance之和. |
poolPingQuery | 发送数据库的侦测查询,校验连接是否正常工作,且等待接收请求.默认值”NO PING QUERY SET”. |
poolPingEnabled | 是否开启侦测查询.若开启,应当设置poolPingQuery的属性为一个可执行且速度快的sql语句,默认值false. |
poolPingConnectionsNotUsedFor | 设置poolPingQuery的频率,建议设置时间同连接超时时间.默认值0,表示所有连接每刻都被侦测,仅当poolPingEnabled为true时生效. |
JNDI(JNDI数据源)
为了能够在例如EJB,或应用服务器中的容器使用数据源.
容器可以集中,或在外部配置数据源,然后放置一个JNDI上下文引用.
initial_context(可选属性,表示在InitialContext 中寻找上下文.如果未设置, data_source将直接从InitialContext 中寻找.) |
data_source(表示引用数据源实例位置的上下文路径,若提供了initial_context配置, 则会在其返回的上下文中寻找;没有提供则直接在InitialContext中寻找.) |
前缀`env`可将配置属性传递给初始上下文. env.encoding=UTF8 |
databaseIdProvider(数据库厂商标识)
ibatis根据不同数据库厂商的标识,执行不同的sql语句.
可参考java.sql.DatabaseMetaData.getDatabaseProductName()
<databaseIdProvider type="">
<property name="" value=""/>
...
</databaseIdProvider>
mappers(映射文件关联)
效用主要是引用映射器.
<mappers>
<mapper class="" resource="" url="" />
...
<package name="" />
...
</mappers>
完整配置属性列表
<configuration>
<properties />
<settings />
<typeAliases />
<typeHandlers />
<objectFactory />
<plugins />
<environments>
<environment>
<transactionManager />
<dataSource />
</environment>
</environments>
<databaseIdProvider />
<mappers />
</configuration>