这篇文章学习的是mybatis的主配置文件Configuration.xml,这个配置文件主要配置一些全局的属性,如数据库的连接,类的别名,不同的
场景运行不同的配置等等。
一、Configuration.xml中可以配置的所有内容
configuration 配置 | |||
properties 属性 | |||
settings 设置 | |||
typeAliases 类型命名 | |||
typeHandlers 类型处理器 | |||
objectFactory 对象工厂 | |||
plugins 插件 | |||
environments 环境 | |||
environment 环境变量 | |||
transactionManager 事务管理器 | |||
dataSource 数据源 | |||
映射器 |
二、Properties标签
可以用来引用外部的属性文件进行配置,比如所有的配置都在一个eas.properties中配置,只需要在properties中配置一次,就可以做到一次配置到处引用。
如现在配置一个eas.properties
#db config
db.driver:com.sybase.jdbc3.jdbc.SybDriver
db.url:jdbc:sybase:Tds:192.168.2.143:2678/SMM_win2k8_portal
db.username:dba
db.password:smmsql
#server config
server.url:http://192.168.2.101:8080/EAS
在configuration.xml中对属性文件中的值进行引用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="eas.properties" />
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
三、Setteing标签,对mybatis的一些行为进行设置
配置
<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="enhancementEnabled" value="false"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
</settings>
四、typeAliases 为一类设置别名,方便书写
<typeAliases>
<!-- simple alias for full class name -->
<typeAlias alias="App" type="com.justsy.eas.domain.App"/>
<typeAlias alias="Content" type="com.justsy.eas.domain.Content"/>
<typeAlias alias="AppDevice" type="com.justsy.eas.domain.AppDevice"/>
<typeAlias alias="ListApp" type="com.justsy.eas.http.domain.ListApp"/>
<typeAlias alias="ClientApp" type="com.justsy.eas.http.domain.ClientApp"/>
</typeAliases>
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
五、typeHandlers 的作用是将Java类型与数据库中类型进行匹配,在statement设值和ResultSet检索值时可以正确的转换,可以实现TypeHandler接口实现自己的类型处理器。mybatis中内建的类型处理器(Type Handler )
六、ObjectFactory 每次创建新的结果对象是调用这个ObjectFactory的对象来进行创建,它会比直接调用构造函数创建对象做更多的工作
七、plugins主要用来实现拦截器的功能,使用到了动态代理,可以指定在某些操作时执行一些拦截操作,比如在一条记录插入数据库之前写入一条日志,或查询一下
权限等等
Executor
(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler
(getParameterObject, setParameters)
ResultSetHandler
(handleResultSets, handleOutputParameters)
StatementHandler
(prepare, parameterize, batch, update, query)
// ExamplePlugin.java
@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) })
public class ExamplePlugin implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
return invocation.proceed();
}
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties) {
}
}
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
就会在所有执行update动作之前进行拦截,执行ExamplePlugin中自定义的一些逻辑
对select进行拦截的plugin
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
@Intercepts({ @Signature(args = { MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }, method = "query", type = Executor.class) })
public class LogInterceptor implements Interceptor {
int index;
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("some log!!!");
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
System.out.println("1223--------------" + (index++));
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
<plugins>
<plugin interceptor="com.akwolf.interceptor.LogInterceptor">
</plugin>
</plugins>
八、environments 对于一个应用可能连接多个数据库,那就需要配置不同的环境来连接不同的数据库,每一个SqlSessionFactory对应一个environments
也可以设置不同的环境应用于开发或测试的环境
如果环境被忽略,那么默认环境将会被加载,也就是default="development"的作用了
九、transactionManager设置事物的管理类型是 type=”[JDBC|MANAGED]”
JDBC使用datasource的连接来管理事物范围。
MANAGED自己不进行事物的提交和回滚,依靠容器来管理事物,设置closeConnection为false,取消自动关闭连接
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
十、dataSource设置数据源[UNPOOLED|POOLED|JNDI]
POOLED:每次被请求时简单打开和关闭连接
POOLED:JDBC 连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。
poolMaximumActiveConnections – 在任意时间存在的活动(也就是正在使用)连接的数量。默认值:10
poolMaximumIdleConnections – 任意时间存在的空闲连接数。
oolMaximumCheckoutTime – 在被强制返回之前,池中连接被检查的时间。默认值:20000 毫秒(也就是 20 秒)
poolTimeToWait – 这是给连接池一个打印日志状态机会的低层次设置,还有重新尝试获得连接,这些情况下往往需要很长时间(为了避免连接池没有配置时静默失败)。 默认值:20000 毫秒(也就是 20 秒)
poolPingQuery – 发送到数据的侦测查询,用来验证连接是否正常工作,并且准备接受请求。默认是“NO PING QUERY SET”,这会引起许多数据库驱动连接由一个错误信 息而导致失败。
poolPingEnabled – 这是开启或禁用侦测查询。如果开启,你必须用一个合法的SQL语句(最好是很快速的)设置 poolPingQuery 属性。默认值:false。
poolPingConnectionsNotUsedFor – 这是用来配置 poolPingQuery 多次时间被用一次。这可以被设置匹配标准的数据库连接超时时间,来避免不必要的侦测。默认值:0 (也就是所有连接每一时刻都被侦测-但仅仅当 poolPingEnabled 为 true 时适用)。
JNDI – 这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
initial_context – 这个属性用来从初始上下文中寻找环境(也就是initialContext.lookup(init ial——context))。这是个可选属性,如果被忽略,那么data_source 属性将 会直接以 init ialContext 为背景再次寻找。
data_source – 这是引用数据源实例位置的上下文的路径。它会以由 init ial_context查询返回的环境为背景来查找,如果 init ial_context 没有返回结果时,直接以初始上下 文为环境来查找。
十一、mappers用来注册映射文件。