Mybatis配置总结

配置概述

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要做的就是实例化查询结果对应的目标类。

原文地址:https://www.cnblogs.com/feiqiangsheng/p/11619108.html