主配置文件格式如下
<?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/>
<settings/>
<typeAliases/>
<typeHandlers/>
<ObjectFactory/>
<plugins/>
<environments/>
<mappers/>
</configuration/>
properties属性
properties和Java的.properties配置文件有关。配置properties标签下的resource指定.properties路径,再配置properties标签下的property属性的name和value值,则可以替换.properties文件的相应属性值。
如:
<properties resource="jdbc.properties">
<property name="jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/student_manager"/>
<property name="username" value="root"/>
<property name="password" value="limingnihao"/>
</porperties>
settings 设置
这是MyBatis 修改操作运行过程细节的重要的步骤。下方这个表格描述了这些设置项、含义和默认值
设置项 | 描述 | 允许值 | 默认值 |
cacheEnabled | 对在此配置文件下的所有cache 进行全局性开/关设置。 | true | false | true |
lazyLoadingEnabled | 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。 | true | false | true |
aggressiveLazyLoading | 当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 | true | false | true |
multipleResultSetsEnabled | 允许和不允许单条语句返回多个数据集(取决于驱动需求) | true | false | true |
useColumnLabel | 使用列标签代替列名称。不同的驱动器有不同的作法。参考一下驱动器文档,或者用这两个不同的选项进行测试一下。 | true | false | true |
useGeneratedKeys | 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 | true | false | false |
autoMappingBehavior | 指定MyBatis 是否并且如何来自动映射数据表字段与对象的属性。PARTIAL将只自动映射简单的,没有嵌套的结果。FULL 将自动映射所有复杂的结果。 | NONE, PARTIAL, FULL | PARTIAL |
defaultExecutorType | 配置和设定执行器,SIMPLE 执行器执行其它语句。REUSE 执行器可能重复使用prepared statements 语句,BATCH执行器可以重复执行语句和批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 设置一个时限,以决定让驱动器等待数据库回应的多长时间为超时 | 正整数 | Not Set (null) |
<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" />
</settings>
typeAliases类型别名
类型别名是Java类型的简称
它仅仅只是关联到XML 配置,简写冗长的JAVA类名
如:
<typeAliases>
<typeAlias alias="UserEntity" type="com.manager.data.model.UserEntity" />
<typeAlias alias="StudentEntity" type="com.manager.data.model.StudentEntity" />
<typeAlias alias="ClassEntity" type="com.manager.data.model.ClassEntity" />
</typeAliases>
使用这个配置,UserEntity这个值就能在配置文件中代替com.manager.data.model.UserEntity出现
typeHandlers类型句柄
无论是在MyBatis预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成Java类型。以下是默认的类型处理器
类型处理器 | Java类型 | JDBC类型 |
BooleanTypeHandler | Boolean,boolean | 任何兼容的布尔值 |
ByteTypeHandler | Byte,byte | 任何兼容的数字或字节类型 |
ShortTypeHandler | Short,short | 任何兼容的数字或短整型 |
IntegerTypeHandler | Integer,int | 任何兼容的数字和整型 |
LongTypeHandler | Long,long | 任何兼容的数字或长整型 |
FloatTypeHandler | Float,float | 任何兼容的数字或单精度浮点型 |
DoubleTypeHandler | Double,double | 任何兼容的数字或双精度浮点型 |
BigDecimalTypeHandler | BigDecimal | 任何兼容的数字或十进制小数类型 |
StringTypeHandler | String | CHAR和VARCHAR类型 |
ClobTypeHandler | String | CLOB和LONGVARCHAR类型 |
NStringTypeHandler | String | NVARCHAR和NCHAR类型 |
NClobTypeHandler | String | NCLOB类型 |
ByteArrayTypeHandler | byte[] | 任何兼容的字节流类型 |
BlobTypeHandler | byte[] | BLOB和LONGVARBINARY类型 |
DateTypeHandler | Date(java.util) | TIMESTAMP类型 |
DateOnlyTypeHandler | Date(java.util) | DATE类型 |
TimeOnlyTypeHandler | Date(java.util) | TIME类型 |
SqlTimestampTypeHandler | Timestamp(java.sql) | TIMESTAMP类型 |
SqlDateTypeHandler | Date(java.sql) | DATE类型 |
SqlTimeTypeHandler | Time(java.sql) | TIME类型 |
ObjectTypeHandler | Any | 其他或未指定类型 |
EnumTypeHandler | Enumeration类型 | VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。 |
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。要这样做的话,简单实现TypeHandler接口(),然后映射新的类型处理器类到Java类型,还有可选的一个JDBC类型。然后再typeHandlers中添加这个类型处理器或在映射文件中的参数和结果映射中添加typeHandler属性。
但是必须注意
(1)如果是在typeHandlers中添加这个类型处理器则将会覆盖原来已经存在的处理Java的类型属性和JDBC类型参数及结果的类型处理器,所以必须在映射文件中设置那些是对应的JDBC类型字段的参数。
(2)如果在映射文件中添加typeHandler属性则此会对此结果使用类型处理器。
例如加入了下面这个类型处理器
<typeHandler javaType="String" jdbcType="VARCHAR" handler="com.myapp.test.MyTestTypeHandler"></typeHandler>
/**
*
*/
package com.myapp.test;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
/**
* @author louisliao
*
*/
public class MyTestTypeHandler implements TypeHandler {
/**
*
*/
public MyTestTypeHandler() {
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see org.apache.ibatis.type.TypeHandler#setParameter(java.sql.PreparedStatement, int, java.lang.Object, org.apache.ibatis.type.JdbcType)
*/
public void setParameter(PreparedStatement ps, int i, Object parameter,
JdbcType jdbcType) throws SQLException {
// TODO Auto-generated method stub
ps.setString(i, ((String)parameter));
}
/* (non-Javadoc)
* @see org.apache.ibatis.type.TypeHandler#getResult(java.sql.ResultSet, java.lang.String)
*/
public Object getResult(ResultSet rs, String columnName)
throws SQLException {
// TODO Auto-generated method stub
return rs.getString(columnName);
}
/* (non-Javadoc)
* @see org.apache.ibatis.type.TypeHandler#getResult(java.sql.CallableStatement, int)
*/
public Object getResult(CallableStatement cs, int columnIndex)
throws SQLException {
// TODO Auto-generated method stub
return cs.getString(columnIndex);
}
}
根据上面的配置可知MyBatis会覆盖原来已经存在的处理Java的String类型属性和JDBC的VARCHAR类型参数及结果的类型处理器。则在映射文件中只有指定了jdbcType="VARCHAR"的字段以及字段对应JavaBean属性为String时才会使用到com.myapp.test.MyTestTypeHandler这个类型处理器,而没有指定的则不会使用到。
如下面这个映射文件
<resultMap id="ClassesResultMap" type="com.myapp.domain.Classes" >
<id column="c_id" property="id" jdbcType="INTEGER" />
<result column="c_name" property="name" jdbcType="VARCHAR" />
<association property="teacher" javaType="com.myapp.domain.Teacher">
<id column="t_id" property="id"/>
<result column="t_name" property="name" typeHandler="com.myapp.test.MyTestTypeHandler"></result>
</association>
</resultMap>
说明:<result column="c_name" property="name" jdbcType="VARCHAR" />表明当从结果中获取name值时将会调用类型处理器com.myapp.test.MyTestTypeHandler
<result column="t_name" property="name" typeHandler="com.myapp.test.MyTestTypeHandler"></result>表明当从结果中获取t-name时会调用类型处理器
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的核心。这是低层次的类和方法,要谨慎使用插件。
使用插件是它们提供的非常简单的力量。简单实现拦截器接口,要确定你想拦截的指定签名。
environments环境
Mybatis可以配置多个环境,这可以帮助你SQL 映射对应多种数据库等。
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="net.sourceforge.jtds.jdbc.Driver"/>
<property name="url" value="jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=spring3mvc"/>
<property name="username" value="sa"/>
<property name="password" value="wlyoa_)*#!"/>
</dataSource>
</environment>
</environments>
mappers映射器
这里是告诉MyBatis 去哪寻找映射SQL 的语句。可以使用类路径中的资源引用,或者使用字符,输入确切的URL 引用。
<mappers>
<mapper resource="com/myapp/mapper/UserMapper.xml"/>
<mapper resource="com/myapp/mapper/ClassesMapper.xml"/>
</mappers>