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

  • 相关阅读:
    Hbase记录-Hbase shell使用
    Hbase记录-Hbase基础概念
    JAVA记录-SpringMVC集成redis
    JAVA记录-redis缓存机制介绍(四)
    JAVA记录-redis缓存机制介绍(三)
    JAVA记录-redis缓存机制介绍(二)
    JAVA记录-redis缓存机制介绍(一)
    JAVA记录-SpringMVC scope属性的两种模式
    JAVA记录-JDBC介绍
    鼠标拖动,改变列表宽度
  • 原文地址:https://www.cnblogs.com/feiqiangsheng/p/11619108.html
Copyright © 2020-2023  润新知