zoukankan      html  css  js  c++  java
  • 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要做的就是实例化查询结果对应的目标类。

  • 相关阅读:
    UVa 1151 Buy or Build【最小生成树】
    UVa 216 Getting in Line【枚举排列】
    UVa 729 The Hamming Distance Problem【枚举排列】
    HDU 5214 Movie【贪心】
    HDU 5223 GCD
    POJ 1144 Network【割顶】
    UVa 11025 The broken pedometer【枚举子集】
    HDU 2515 Yanghee 的算术【找规律】
    Java基本语法
    Java环境变量,jdk和jre的区别,面向对象语言编程
  • 原文地址:https://www.cnblogs.com/feiqiangsheng/p/11619108.html
Copyright © 2011-2022 走看看