mybatis基础---XML配置文件

XML映射配置文件
MyBatis 的 XML 配置文件包含了影响 MyBatis 行为甚深的设置和属性信息。XML 文档
的高层级结构如下:
这里写图片描述

properties

这些是外部化的,可替代的属性,这些属性也可以配置在典型的 Java 属性配置文件中,或者通过 properties 元素的子元素来传递。例如:

<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</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>

这个例子中的 username 和 password 将会由 properties 元素中设置的值来替换。driver 和
url 属性将会从包含进来的 config.properties 文件中的值来替换。这里提供很多配置的选项。
属性也可以被传递到 SqlSessionBuilder.build()方法中。例如:

SqlSessionFactory factory =
sqlSessionFactoryBuilder.build(reader, props);
// ... or ...
SqlSessionFactory factory =
sqlSessionFactoryBuilder.build(reader, environment, props);

如果在这些地方,属性多于一个的话,MyBatis 按照如下的顺序加载它们:

  • 在 properties 元素体内指定的属性首先被读取。
  • 从类路径下资源或 properties 元素的 url 属性中加载的属性第二被读取,它会 覆盖已经存在的完全一样的属性。
  • 作为方法参数传递的属性最后被读取,它也会覆盖任一已经存在的完全一样的 属性,这些属性可能是从 properties
    元素体内和资源/url 属性中加载的。

因此,最高优先级的属性是那些作为方法参数的,然后是资源/url 属性,最后是 properties
元素中指定的属性。

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="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>

使用这个配置,“Blog”可以任意用来替代“domain.blog.Blog”所使用的地方。
对于普通的 Java 类型,有许多内建的类型别名。它们都是大小写不敏感的,由于重载
的名字,要注意原生类型的特殊处理。

这里写图片描述

这里写图片描述

typeHandlers

这里写图片描述
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。要
这样做的话,简单实现 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”方法调用,它也是负责低层次
映射语句执行的内部对象。
其他详见官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值