配置概述
Mybatis配置并不复杂,但是配置项的顺序不能颠倒。
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--配置-->
<properties/><!--属性-->
<settings/><!--设置-->
<typeAliases><!--类型别名-->
<typeHandlers><!--类型处理器-->
<objectFactory><!--对象工厂-->
<plugins><!--插件-->
<environments><!--配置环境-->
<environment><!--环境变量-->
<transactionManager/><!--事务管理器-->
<dataSource/><!--数据源-->
<environment>
<environments>
<databaseIdProvider/><!--数据库厂商标识-->
<mappers/><!--映射器-->
</configuration>
properties属性
properties属性可以给系统配置一些运行参数,可放在XML文件或者properties文件中。
一、放在XML文件中
<!--定义-->
<properties/>
<property name="database.driver" value="com.mysql.jdbc.Driver"/>
<property name="database.username" value="root"/>
<properties/>
<!--使用-->
<dataSource type="POOLED">
<property name="driver" value="${database.driver}" />
<property name="username" value="${database.username}" />
</dataSource>
二、放在properties文件中
##定义
database.driver=com.mysql.jdbc.Driver
database.username=root
<!--引入到XML-->
<properties resource="jdbc.properties"/>
<!--使用-->
<dataSource type="POOLED">
<property name="driver" value="${database.driver}" />
<property name="username" value="${database.username}" />
</dataSource>
三、真实的生产环境中,数据库的密码和用户名对于其他人员是保密的。
String resource = "mybatis_config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 解密配置文件
InputStream in = Resources.getResourceAsStream("jdbc.properties");
Properties props = new Properties();
props.load(in);
String userName = props.getProperty("database.username");
String password = props.getProperty("database.password");
props.put("database.username", CodeUtill.decode(userName));
props.put("database.password", CodeUtill.decode(password));
// 构建SqlSessionFactory工厂类,后面的明文将覆盖前面的密文。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, props);
setting设置
setting是Mybatis中最复杂的配置,它可以影响Mybatis底层的运行,大部分情况下使用默认便可。
<settings>
<setting name="cacheEnabled" value="true"><!--缓存总开关-->
<setting name="lazyLoadingEnable" value="false"><!--懒加载开关-->
<setting name="aggressiveLazyLoading" value="true"><!--积极载开关-->
<setting name="multipleResultSetsEnabled" value="true"/><!--单一语句返回多结果集-->
</settings>
typeAliases别名
由于类的全限命名很长,需要大量使用的时候,可以定义一个别名来代替这个类。
别名分为系统定义别名和自定义别名。在Mybatis中,别名由TypeAliasRegistry去定义。
<typeAliases>
<typeAlias alias="user" type="com.feige.po.User">
</typeAliases>
<!--批量扫描别名,默认是类名首字母小写。-->
<typeAliases>
<package name="com.feige.po">
</typeAliases>
typeHandler类型转换器
typeHandler的作用就是承担jdbcType和javaType之间的相互转换。很多情况下不需要我们定义typeHandler,因为Mybatis会自动探测使用什么类型的typeHandler处理。系统提供的typeHandler能覆盖大部分场景要求,但是有些情况是不够的,比如我们有特殊的转换规则,枚举类就是这样。
Mybatis系统的typehandler都继承了一个叫BaseTypeHandler的抽象类。自定义的typeHandler要么实现typeHandler接口,要么继承BaseTypeHandler抽象类。
<!--注册-->
<typeHandlers>
<typeHandler jdbcType="VARCHAR" javaType="string" handler="com.feige.typehandler.MyTypeHandler">
</typeHandlers>
<!--使用方法一-->
<resultMap id="resultMap" type="user">
<result property="name" column="name" jdbcType="VARCHAR" javaType="string"/>
<result property="hobby" column="hobby" typehandler="com.feige.typehandler.MyTypeHandler"/>
</resultMap>
<!--使用方法二-->
<select id="findUser" parameterType="user" resultMap="resultMap">
select * from user where id = #{id} and name like concat('%',#{name,jdbcType="VARCHAR" javaType="string"},'%')
and hobby like concat('%',#{hobby,typehandler="com.feige.typehandler.MyTypeHandler""},'%')
</select>
注:如果枚举类型很多,需要定义很多typeHandler,那么可以采取包扫描的形式。
//自定义性别枚举映射
public class MyTypeHandler implements TypeHandler<SexEnum>{
@Override
public void setParameter(PreparedStatement ps, int i, SexEnum parameter, JdbcType jdbcType) throws Exception {
ps.setInt(i, parameter.getCode());
}
@Override
public SexEnum getResult(ResultSet rs, String columnName) throws SQLException {
int code = rs.getInt(columnName);
return SexEnum.getSexEnumByCode();
}
@Override
public SexEnum getResult(ResultSet rs, int columnIndex) throws SQLException {
int code = rs.getInt(columnName);
return SexEnum.getSexEnumByCode();
}
@Override
public SexEnum getResult(CallableStatement cs, int columnIndex) throws SQLException {
int code = rs.getInt(columnName);
return SexEnum.getSexEnumByCode();
}
}
databaseIdProvider数据库厂商标识
databaseIdProvider元素主要是为了支持不同厂商的数据库。使用多数据库时需要配置databaseIdProvider属性。当statement中的databaseId属性被配置的时候,系统会优先获取和数据库配置一致的statement,否则取没有配置databaseId的statement,把它当默认值,如果还是取不到,就会抛出异常。
<!--数据库厂商标示-->
<databaseIdProvider type="DB_VENDOR">
<property name="Oracle" value="oracle"/>
<property name="MySQL" value="mysql"/>
</databaseIdProvider>
<!--SQL中通过databaseId,标识适用的数据库-->
<select id="getAllProduct" resultType="product" databaseId="mysql">
select * from user;
</select>
environments运行环境
environments的作用是用来配置数据库信息,可以配置多个。
<!--环境模式:development开发模式,work工作模式-->
<environments default="development">
<!--环境变量-->
<environment id="development">
<!--事务管理器-->
<transactionManager type="JDBC" />
<!--数据源-->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.pwd}" />
</dataSource>
</environment>
</environments>
environments-default:该属性指定当前的环境,有development和work两种选择,默认是development开发模式。
environment-id:该属性是每个environment定义的环境,也有development和work两种选择,默认是development开发模式。
transactionManager-type:该属性是配置事务管理器的类型,mybatis中有JDBC和MANAGED两种,一次只能配置一个。
dataSource-type:该属性用来配置数据源类型,有UNPOOLED、POOLED和JNDI三种选择。
dataSource中-property:用来配置数据库相关信息。
objectFactory对象工厂
当查询返回结果时,需要把结果映射为JavaBean,而objectFactory对象工厂就是用来创建实体对象的类。默认的objectFactory要做的就是实例化查询结果对应的目标类。