2017-10-6-MyBatis配置简述
MyBatis配置简述
MyBatis的配置元素如下:
<?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><!--配置环境-->
<environment><!--环境变量-->
<transactionManager/><!--事务管理器-->
<dataSource /><!--数据源-->
</environment>
</environments>
<databaseIdProvider/><!--数据库厂商提供者-->
<mappers/><!--映射器-->
</configuration>
这些元素并不都是必须存在的,在需要时使用即可,在使用时,发现如果顺序出现颠倒会提示错误。
properties
<properties>
属性可以在系统运行时配置一些运行参数,可以将配置文件写在xml文件或者.properties文件中。在MyBaits中可以有三种方式使用properties:
- property子元素
- .properties文件
- Java程序传递
最普遍的用法就是使用.properties文件,可以把一些数据库连接有关的键值对如数据库驱动,连接URL,用户名和密码等放在配置文件中。
可以创建一个dataSource.properties文件:
database.driver = com.mysql.jdbc.Driver
database.url = jdbc:mysql://127.0.0.1:3306/dabase_name?useUnicode=true&characterEncoding=utf8
database.username = username
database.password = password
在MyBatis中通过<properties>
属性resource就可以引入properties文件。如:
<properties resource = "dataSource.properties"/>
当然也可以直接使用<properties>
中的property子元素引入。
<properties>
<property name="username" value="username"/>
<property name="password" value="password"/>
</properties>
settings
settings配置比较复杂,拥有很多配置规则,但是大部分情况下使用默认的配置就可以运行,只有一些常用的规则需要配置,如缓存cacheEnabled, 级联lazyLoadingEnabled和aggressiveLazyLoading,自动映射autoMappingBehavior和mapUnderscoreToCamelCase,执行器类型defaultExecutorType。
<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="autoMappingBehavior" value="PARTIAL" />
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE" />
<setting name="defaultStatementTimeout" value="25" />
<setting name="defaultFetchSize" value ="100"/>
<setting name="safeRowBoundsEnabled" value="false" />
<setting name="mapUnderscoreToCamelCase" value="false" />
<setting name="localCacheScope" value="SESSION" />
<setting name="jdbcTypeForNull" value="OTHER" />
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
</settings>
typeAliases
typeAliases用于提供别名,并且可以设置package,这样在mapper文件中可以直接使用别名,不用使用带上包路径的全限定名称。MyBatis中别名不区分大小写。
系统定义别名
MyBatis系统定义了一些常用的内置对象的别名,其别名和Java类型的对应规则可以大致表示为:
- 如果是基本数组类型,别名是Java类型前面加上
_
,如:基本类型int对应的别名为_int; - 如果是引用数据类型,别名是将该类型的首写字母小写,如:Integer对应的别名为integer,由于不区分大小写,实际上写成Integer也可以。
自定义别名
自定义别名可以使用以下的方式:
通过扫描包的方式,可以用这个包下面的类名直接作为别名引入
<typeAliases><!--别名-->
<package name="cn.abelib.bean"/>
</typeAliases>
使用配置文件的形式
<typeAliases><!--别名-->
<typeAliase alias="user" type="cn.abelib.bean.User"/>
</typeAliases>
typeHandler
typeHandler是类型转换器,用于在数据库类型jdbcType和Java类型javaType之间的转换。和typeAliases类似,系统自定义了常用的typeHandller用于系统指定的类型转换,如果在实际情况下需要也可以通过实现 TypeHandler<T>接口来自定义实现typeHandler。如:
// 自定义的typeHandler
public class MyTypeHandler implements TypeHandler<String> {
Logger logger = Logger.getLogger(MyTypeHandler.class);
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter);
}
public String getResult(ResultSet rs, String columnName) throws SQLException {
String result = rs.getString(columnName);
return result;
}
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
String result = rs.getString(columnIndex);
return result;
}
public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
String result = cs.getString(columnIndex);
return result;
}
}
使用时:
<typeHandlers><!--用于jdbc和Java之间的类型转换-->
<typeHandler jdbcType="VARCHAR" javaType="string"
handler="com.abel.mybatis.MyTypeHandler"/>
</typeHandlers>
ObjectFactory
ObjectFactory被用来在创建结果集时生成结果集实例。默认情况下使用的是org.apache.ibatis.reflection.factory包下的DefaultObjectFactory,当然也可以根据需要自己继承DefaultObjectFactory实现自定义的对象工厂。
plugins
plugins可以算得上是MyBaits最复杂、最强大的组件,后面会单独来学习这部分内容。