MyBatis 的 XML 配置文件包含了影响 MyBatis 行为甚深的设置和属性信息。XML 文档
的高层级结构如下:
- configuration 配置
- properties 属性
- settings 设置
- typeAliases 类型命名
- typeHandlers 类型处理器
- objectFactory 对象工厂
- plugins 插件
- environments 环境
- environment 环境变量
- transactionManager 事务管理器
- dataSource 数据源
- 映射器
<br/>
properties
这些是外部化的,可替代的属性,这些属性也可以配置在典型的 Java 属性配置文件中,或者通过 properties 元素的子元素来传递。
例如:
<properties resource="jdbc.properties"></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>
properties 将会从包含进来的 jdbc.properties 文件中的值来替换。
<br/>
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="enhancementEnabled" value="false"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
</settings>
typeAliases
类型别名是为 Java 类型命名一个短的名字。它只和 XML 配置有关,只用来减少类完全限定名的多余部分。
例如:
<typeAliases>
<typeAlias alias="User" type="com.mu.mybatis.domain.User"/>
</typeAliases>
使用这个配置,“User”可以任意用来替代“com.mu.mybatis.domain.User”所使用的地方。
typeHandlers
无论是 MyBatis 在预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成 Java 类型。下面这个表格描述了默认的类型处理器。
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。要这样做的话,简单实现 TypeHandler 接口(org.mybatis.type),然后映射新的类型处理器类到Java 类型,还有可选的一个 JDBC 类型。例如:
// ExampleTypeHandler.java
public class ExampleTypeHandler implements TypeHandler {
public void setParameter(PreparedStatement ps, int i, Object parameter,JdbcType jdbcType) throws SQLException {
ps.setString(i, (String) parameter);
}
public Object getResult(ResultSet rs, String columnName)throws SQLException {
return rs.getString(columnName);
}
public Object getResult(CallableStatement cs, int columnIndex)throws SQLException {
return cs.getString(columnIndex);
}
}
// MapperConfig.xml
<typeHandlers>
<typeHandler javaType="String" jdbcType="VARCHAR"
handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
使用这样的类型处理器将会覆盖已经存在的处理 Java 的 String 类型属性和 VARCHAR参数及结果的类型处理器。要注意 MyBatis 不会审视数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指定那是 VARCHAR 类型的字段,来绑定到正确的类型处理器上。这是因为 MyBatis 直到语句被执行都不知道数据类型的这个现实导致的.
objectFactory
MyBatis 每次创建结果对象新的实例时,它使用一个 ObjectFactory 实例来完成。如果参数映射存在,默认的 ObjectFactory 不比使用默认构造方法或带参数的构造方法实例化目标类做的工作多。如果你想重写默认的 ObjectFactory,你可以创建你自己的。
比如:
// ExampleObjectFactory.java
public class ExampleObjectFactory extends DefaultObjectFactory {
public Object create(Class type) {
return super.create(type);
}
public Object create(Class type,List<Class> constructorArgTypes,List<Object> constructorArgs) {
return super.create(type, constructorArgTypes, constructorArgs);
}
public void setProperties(Properties properties) {
super.setProperties(properties);
}
}
// MapperConfig.xml
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
<property name="someProperty" value="100"/>
</objectFactory>
ObjectFactory 接口非常简单。它包含两个用于创建的方法,一个是默认构造方法,另外一个是处理带参数的构造方法。最终,setProperties 方法可以被用来配置 ObjectFactory。在初始化你的ObjectFactory实例后,objectFactory元素体中定义的属性会被传递给setProperties方法。
plugins
MyBatis 允许你在某一点拦截已映射语句执行的调用。
默认情况下,MyBatis 允许使用插件来拦截方法调用:
-
Executor
(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) -
ParameterHandler
(getParameterObject, setParameters) -
ResultSetHandler
(handleResultSets, handleOutputParameters) - StatementHandler
(prepare, parameterize, batch, update, query)
这些类中方法的详情可以通过查看每个方法的签名来发现,而且它们的源代码存在于MyBatis 的发行包中。你应该理解你所覆盖方法的行为,假设你所做的要比监视调用要多。
如果你尝试修改或覆盖一个给定的方法,你可能会打破 MyBatis 的核心。这是低层次的类和方法,要谨慎使用插件。
使用插件是它们提供的非常简单的力量。简单实现拦截器接口,要确定你想拦截的指定签名。
// 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) {
}
}
// MapperConfig.xml
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
上面的插件将会拦截在 Executor 实例中所有的“update”方法调用,它也是负责低层次映射语句执行的内部对象。
environments
MyBatis 可以配置多种环境。这会帮助你将 SQL 映射应用于多种数据库之中。例如,你也许为开发要设置不同的配置,测试和生产环境。或者你可能有多种生产级数据库却共享相同的模式,所以你会想对不同数据库使用相同的 SQL 映射。这种用例是很多的。
要记得一个很重要的问题:你可以配置多种环境,但你只能为每个 SqlSessionFactory实例选择一个。
所以,如果你想连接两个数据库,你需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,你就需要三个实例,以此类推。记忆起来很简单:
每个数据库对应一个 SqlSessionFactory为了明确创建哪种环境,你可以将它作为可选的参数传递给 SqlSessionFactoryBuilder。
可以接受环境配置的两个方法签名是:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);
如果环境被忽略,那么默认环境将会被加载,如下进行:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);
环境元素定义了如何配置环境。
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
注意这里的关键部分:
- 默认的环境 ID(比如:default=”development”)。
- 每个 environment 元素定义的环境 ID(比如:id=”development”)。
- 事务管理器的配置(比如:type=”JDBC”)。
<br/>
transactionManager
在 MyBatis 中有两种事务管理器类型(也就是 type=”[JDBC|MANAGED]”):
-
JDBC – 这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。
- MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期(比如 Spring 或 JEE 应用服务器的上下文)。默认情况下它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止它,将 closeConnection 属性设置为 false。
<br/>
dataSsource
dataSource 元素使用基本的 JDBC 数据源接口来配置 JDBC 连接对象的资源。许多 MyBatis 的应用程序将会按示例中的例子来配置数据源。然而它并不是必须的。
要知道为了方便使用延迟加载,数据源才是必须的。
有三种内建的数据源类型(也就是 type=”???”):
- UNPOOLED – 这个数据源的实现是每次被请求时简单打开和关闭连接。它有一点慢,
这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接。不同的数据库对这
个的表现也是不一样的,所以对某些数据库来说配置数据源并不重要,这个配置也是闲置的。 -
UNPOOLED 类型的数据源仅仅用来配置以下 5 种属性:
-
driver – 这是 JDBC 驱动的 Java 类的完全限定名
-
url – 这是数据库的 JDBC URL 地址
-
username – 登录数据库的用户名
-
password – 登录数据库的密码
-
defaultTransactionIsolationLevel – 默认的连接事务隔离级别
作为可选项,你可以传递数据库驱动的属性。要这样做,属性的前缀是以“driver.”开
头的,例如: - driver.encoding=UTF8
-
这 样 就 会 传 递 以 值 “ UTF8 ” 来 传 递 “ encoding ” 属 性 , 它 是 通 过DriverManager.getConnection(url,driverProperties)方法传递给数据库驱动。
- POOLED – 这是 JDBC 连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。这是一种当前 Web 应用程序用来快速响应请求很流行的方法。
除了上述(UNPOOLED)的属性之外,还有很多属性可以用来配置 POOLED 数据源:
-
poolMaximumActiveConnections – 在任意时间存在的活动(也就是正在使用)连接的数量。默认值:10
-
poolMaximumIdleConnections – 任意时间存在的空闲连接数。
-
poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检查的时间。默认值:20000 毫秒(也就是 20 秒)
-
poolTimeToWait – 这是给连接池一个打印日志状态机会的低层次设置,还有重新尝试获得连接,这些情况下往往需要很长时间(为了避免连接池没有配置时静默失败)。默认值:20000 毫秒(也就是 20 秒)
-
poolPingQuery – 发送到数据的侦测查询,用来验证连接是否正常工作,并且准备接受请求。默认是“NO PING QUERY SET”,这会引起许多数据库驱动连接由一个错误信息而导致失败。
-
poolPingEnabled – 这是开启或禁用侦测查询。如果开启,你必须用一个合法的SQL 语句设置 poolPingQuery 属性。默认值:false。
- poolPingConnectionsNotUsedFor – 这是用来配置 poolPingQuery 多次时间被用一次。这可以被设置匹配标准的数据库连接超时时间,来避免不必要的侦测。默认值:0(也就是所有连接每一时刻都被侦测-但仅仅当 poolPingEnabled 为 true 时适用)。
-
JNDI – 这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这个数据源配置只需要两个属性:
-
initial_context – 这 个 属 性 用 来 从 初 始 上 下 文 中 寻 找 环 境 。这是个可选属性,如果被忽略,那么data_source 属性将会直接以 initialContext 为背景再次寻找。
-
data_source – 这是引用数据源实例位置的上下文的路径。它会以由 initial_context查询返回的环境为背景来查找,如果 initial_context 没有返回结果时,直接以初始上下文为环境来查找。
和其他数据源配置相似,它也可以通过名为“env.”的前缀直接向初始上下文发送属性。 - env.encoding=UTF8
在初始化之后,这就会以值“UTF8”向初始上下文的构造方法传递名为“encoding”的属性。
-
<br/>
mappers
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。但是,首先我们需要告诉 MyBatis 到哪里去找到这些语句。Java 在这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。
<mappers>
<mapper resource="com/mu/mybatis/mapper/UserMapper.xml"/>
</mappers>
这些语句简单告诉了 MyBatis 去×××映射文件。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/192519.html