目录
properties(属性配置)
settings(设置ibatis运行状态)
typeAliases(设置类对象的别名)
typeHandlers(类型处理器)
objectFactory(对象工厂配置)
plugins(插件配置)
environments(环境配置集)
environment(数据源配置)
transactionManager(数据事务配置)
dataSource(数据库配置)
databaseIdProvider(数据库厂商标识)
mappers(映射文件关联)
完整配置属性列表
...
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若无法取值的话,就使用符号`:`指定的默认值.
注意:属性占位符的功能默认是关闭的,需要手动开启.
也可以使用ONGL表达式中的三元运算符,来使用属性占位符.
但也需要额外修改ibatis的默认配置.
这是ibatis中最复杂的配置,修改默认设置,会变更ibatis的运行状态.
如无特别需求,不建议设置.
...
可设置的属性列表
属性/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的实例类 | 合法的完全限定名 | \ |
...
...
在ibatis中,别名是不区分大小写的
设置别名的方式
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);
...
...
...
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
org.apache.ibatis.type.EnumOrdinalTypeHandler
EnumTypeHandler是默认枚举类型处理器.但是自动映射器(auto-mapper)会自动地选用 EnumOrdinalTypeHandler 来处理.
使用指定枚举类型处理器的步骤:
或者不设置javaType属性,在自定义的枚举类型处理器中,使用注解@MappedTypes和@MappedJdbcTypes . @MappedTypes(MyEnum.class)
@MappedJdbcTypes(value ={}, includeNullJdbcType = true)
public class MyEnumTypeHandler extends BaseTypeHandler
{
INSERT INTO tbl_name(colu) VALUE(#{prop,
typeHandler=org.apache.ibatis.type.EnumTypeHandler})
获取mapper的实例,就可遍历的 含有枚举类型的表了.
ibatis创建一个结果对象的实例时,需要使用ObjectFactory对象实例.
默认情况下,ibatis使用的对象工厂类对象是: org.apache.ibatis.reflection.factory.DefaultObjectFactory .
若需要自定义的话,只需要实现DefaultObjectFactory,新增所需的行为和属性即可.
ibatis的对象工厂可满足大多数需求,若无特殊需求,无需设置.
...
...
...
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可以配置多个数据源/environment,一个数据源包含一个数据库配置/datasource
和一个数据事务配置/transactionManager.
其属性defalut表示,在缺省的情况下,将启用哪个数据源配置.
标签environment的属性id,表示的是全局唯一标识符.
配置方式
JBDC:使用JDBC来管理事务.
MANAGE:让容器来管理事务,什么也不做.
自定义:自定义数据库事务管理的方式.
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 |
ibatis根据不同数据库厂商的标识,执行不同的sql语句.
可参考java.sql.DatabaseMetaData.getDatabaseProductName()
...
效用主要是引用映射器.
...
...