MyBatis 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>
<property/>
</properties>
<settings>
<setting/>
</settings>
<typeAliases>
<typeAlias/>
</typeAliases>
<environments>
<environment>
<transactionManager/>
<dataSource>
<property/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper/>
</mappers>
</configuration>
属性参数
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
在XML中,以上方式定义的参数可以作为“变量”在配置文件中使用,使用方法例如${username}
可以使用${username:ut_user}
为参数设置默认值,其中ut_user为username的默认值,当没有定义username时,其值就为默认值。
默认值默认为不可用,需要使用以下参数开启
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- 启用默认值特性 -->
<property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/> <!-- 修改默认值的分隔符为?: -->
属性加载顺序
在 properties 元素体内指定的属性首先被读取。
然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
MyBatis设置
<settings>
<setting name="cacheEnabled" value="true"/><!--Mapper缓存开关-->
<setting name="lazyLoadingEnabled" value="true"/><!--延迟加载开关,决定一个对象相关联的其他对象是否延迟加载-->
<setting name="multipleResultSetsEnabled" value="true"/><!--单一语句返回多个结果集-->
<setting name="useColumnLabel" value="true"/><!--使用列标签代替列名-->
<setting name="useGeneratedKeys" value="false"/><!--允许 JDBC 支持自动生成主键-->
<setting name="autoMappingBehavior" value="PARTIAL"/><!--指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。-->
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/><!--指定发现自动映射目标未知列(或者未知属性类型)的行为。-->
<setting name="defaultExecutorType" value="SIMPLE"/><!--SQL语句执行器选择-->
<setting name="defaultStatementTimeout" value="25"/><!--设置超时时间,它决定驱动等待数据库响应的秒数。-->
<setting name="defaultFetchSize" value="100"/><!--为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖。-->
<setting name="safeRowBoundsEnabled" value="false"/><!--允许在嵌套语句中使用分页(RowBounds)-->
<setting name="mapUnderscoreToCamelCase" value="false"/><!--是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。-->
<setting name="localCacheScope" value="SESSION"/><!--MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 -->
<setting name="jdbcTypeForNull" value="OTHER"/><!--空值默认的JDBC类型-->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/><!-- 指定哪个对象的方法触发一次延迟加载。-->
<setting name="logImpl" value="LOG4J"/><!--MyBatis会优先使用Tomcat之类的默认日志来记录,不过这里可以指定MyBatis的log记录工具,比如这里是log4j。不过也可以在调用其他MyBatis方法前通过org.apache.ibatis.logging.LogFactory.useLog4JLogging();语句使用日志工具。-->
</settings>
类型别名
为Java类型设置一个短的名字,仅和XML配置有关。
Java内建类型的常见别名为其小写,基本类型还要在前面加_。
XML方式
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
</typeAliases>
用到domain.blog.Author的地方都可以直接用Author。
注解方式
自动从包里扫描所有的Bean,为其添加别名
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
使用@Alias注解为Java Bean添加别名,如果没有注解,会使用 Bean 的首字母小写的非限定类名来作为它的别名。
@Alias("author")
public class Author {
...
}
类型处理器
类型处理器会作为Java类型和JDBC类型的桥梁,对其进行相应转换。
通过实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler,可以将Java类型映射到JDBC类型。
例如:
//ExampleTypeHandler.java
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandler<String> {
}
<!-- mybatis-config.xml -->
<typeHandlers>
<typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
<!-- 搭配注解方式自动查找类处理器 -->
<package name="org.mybatis.example"/>
<!-- 处理枚举类型 -->
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/>
</typeHandlers>
枚举类型
对于枚举类型,可以使用EnumTypeHandler 或者 EnumOrdinalTypeHandler的handler,EnumTypeHandler处理器可以把Enum值转换成名字,如果我们要用整型值代码,那就把handler设置为EnumOrdinalTypeHandler。
对象工厂
MyBatis创建结果对象时,如果希望它能做一些额外的事情,可以可以通过继承DefaultObjectFactory 类,创建自己的对象工厂。
该类的setProperties 方法可以接受XML配置的参数。
create方法可以用来创建。
然后创建出的ExampleObjectFactory类可以搭配以下设置使用:
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
<property name="someProperty" value="100"/>
</objectFactory>
插件
可以用插件来对MyBatis的语句执行行为进行拦截修改或监控,可以对以下类的方法进行覆盖重写。带来行为修改的覆盖将可能影响到MyBatis的低层行为,可能带来严重问题。
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
通过@Intercepts注解和继承Interceptor 接口,即可编写类对映射语句进行处理,该类的setProperties 方法可以接受XML配置的参数。
// ExamplePlugin.java
@Intercepts({@Signature(
type= Executor.class,
method = "update",
args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
private Properties properties = new Properties();
public Object intercept(Invocation invocation) throws Throwable {
// implement pre processing if need
Object returnObject = invocation.proceed();
// implement post processing if need
return returnObject;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
然后在xml文件中的
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
配置段指定插件类,进行配置拦截。
环境配置
针对开发/测试/生产的不同环境,可以进行不同的配置以供使用。但每个会话工厂实例只能选择一种环境。
在配置environments标签时,应注意:
- 默认使用的环境 ID(比如:default="development")。
- 每个 environment 元素定义的环境 ID(比如:id="development")。
- 事务管理器的配置(比如:type="JDBC")(Spring+MyBatis环境下,Spring模块会使用自带管理器覆盖这个配置)。如果要自定义事务处理器的话,配置和实现TransactionFactory 和TransactionFactory 接口的两个类即可进行事务处理。
- 数据源的配置(比如:type="POOLED")。这个标签与数据源类型相关,UNPOOLED在每次请求都会建立连接,可以设置数据库链接、驱动及用户名密码还有事务等级等,POOLED会利用连接池进行管理,额外可以设置连接数量(poolMaximumActiveConnections,poolMaximumIdleConnections等)和超时(poolMaximumCheckoutTime等)等参数优化连接。
数据库厂商标识
MyBatis针对不同的厂商可以执行不同的语句,基于映射语句中的databaseId属性,会选择匹配度最高的执行。需按照以下设置,该设置会将其设置为实际数据库版本,为使其变短,可以通过property参数设置别名。
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>
映射器
将对象与数据库对象关联需要配置SQL语句,该映射就被mapper标签设置,其方式如下:
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
mapper文件的编写和动态SQL后文再叙。