MyBatis笔记(二):mybatis-config.xml 核心配置介绍

1.MyBatis 核心配置介绍

       一级标签有:propertiessettingstypeAliasestypeHandlersobjectFactorypluginsenvironmentsmappersdatabaseIdProvider(此标签一般用不到,此处不做介绍)

       此部分标签的介绍,你也可以参考:MyBatis官方文档。本文在介绍标签的同时,附带了一些这些标签的扩展。

1.1 properties(属性)

       properties 属性,用来完成对外部配置参数的引用。

1.2 settings(设置)

       settings 属性,用来完成对 MyBatis 核心行为的控制。<settings>标签下有很多配置,此处先简单罗列一些。

<settings>
    <!-- 2.1日志输出控制打印查询语句 -->
    <setting name="logImpl" value="STDOUT_LOGGING"/>

    <!-- 2.2控制全局缓存(二级缓存)-->
    <setting name="cacheEnabled" value="true"/>

    <!-- 2.3延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认 false  -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 当开启时,任何方法的调用都会加载该对象的所有属性。默认 false,可通过select标签的 fetchType来覆盖-->
    <setting name="aggressiveLazyLoading" value="false"/>
    <!--  Mybatis 创建具有延迟加载能力的对象所用到的代理工具,默认JAVASSIST -->
    <!-- <setting name="proxyFactory" value="CGLIB" /> -->
    <!-- STATEMENT级别的缓存,使一级缓存,只针对当前执行的这一statement有效 -->
    <!-- <setting name="localCacheScope" value="STATEMENT"/> -->
    <setting name="localCacheScope" value="SESSION"/>
</settings>

1.3 typeAliases(类型别名)

       typeAliases属性,用来简化 映射器 sqlMapper.xml 中类型全路径的输入。

<typeAliases>
    <!-- 3.1 别名可以是一个类-->
    <typeAlias alias="user" type="com.xxx.entity.User"/>
    <!-- 3.2 别名也可以是一个包名 -->
    <package name="domain.blog"/>
</typeAliases>

       类型别名有如下两种用法,1. 别名是一个类就不多介绍了;2. 别名如果是一个包名,那么每一个在定义的包 domain.blog 中的 Java Bean,在没有注解@Alias 的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。

@Alias("author")
public class Author {
    ...
}

       MyBatis 自带有很多类型别名,你可以去 TypeAliasRegistry.java 这个类下查看。此处附默认类型别名,如下:

public TypeAliasRegistry() {
    this.registerAlias("string", String.class);
    this.registerAlias("byte", Byte.class);
    this.registerAlias("long", Long.class);
    this.registerAlias("short", Short.class);
    this.registerAlias("int", Integer.class);
    this.registerAlias("integer", Integer.class);
    this.registerAlias("double", Double.class);
    this.registerAlias("float", Float.class);
    this.registerAlias("boolean", Boolean.class);
    this.registerAlias("byte[]", Byte[].class);
    this.registerAlias("long[]", Long[].class);
    this.registerAlias("short[]", Short[].class);
    this.registerAlias("int[]", Integer[].class);
    this.registerAlias("integer[]", Integer[].class);
    this.registerAlias("double[]", Double[].class);
    this.registerAlias("float[]", Float[].class);
    this.registerAlias("boolean[]", Boolean[].class);
    this.registerAlias("_byte", Byte.TYPE);
    this.registerAlias("_long", Long.TYPE);
    this.registerAlias("_short", Short.TYPE);
    this.registerAlias("_int", Integer.TYPE);
    this.registerAlias("_integer", Integer.TYPE);
    this.registerAlias("_double", Double.TYPE);
    this.registerAlias("_float", Float.TYPE);
    this.registerAlias("_boolean", Boolean.TYPE);
    this.registerAlias("_byte[]", byte[].class);
    this.registerAlias("_long[]", long[].class);
    this.registerAlias("_short[]", short[].class);
    this.registerAlias("_int[]", int[].class);
    this.registerAlias("_integer[]", int[].class);
    this.registerAlias("_double[]", double[].class);
    this.registerAlias("_float[]", float[].class);
    this.registerAlias("_boolean[]", boolean[].class);
    this.registerAlias("date", Date.class);
    this.registerAlias("decimal", BigDecimal.class);
    this.registerAlias("bigdecimal", BigDecimal.class);
    this.registerAlias("biginteger", BigInteger.class);
    this.registerAlias("object", Object.class);
    this.registerAlias("date[]", Date[].class);
    this.registerAlias("decimal[]", BigDecimal[].class);
    this.registerAlias("bigdecimal[]", BigDecimal[].class);
    this.registerAlias("biginteger[]", BigInteger[].class);
    this.registerAlias("object[]", Object[].class);
    this.registerAlias("map", Map.class);
    this.registerAlias("hashmap", HashMap.class);
    this.registerAlias("list", List.class);
    this.registerAlias("arraylist", ArrayList.class);
    this.registerAlias("collection", Collection.class);
    this.registerAlias("iterator", Iterator.class);
    this.registerAlias("ResultSet", ResultSet.class);
}

1.4 typeHandlers(类型处理器)

       typeHandlers属性,用来完成数据库中类型字段 与 Java类型字段 的转换。这就是MyBatis 为什么能将 String 以 varchar 存储到数据库 ,将 varchar 类型映射到 String 类的原因。

       虽然 MyBatis 已经为我们提供了很多转换。但是还是有一部分没有提供到位。MySQL 5.7 有新增提供 json 类型,MyBatis 中 Json类型 转 Object就需要我们通过 typeHandlers 来解决。

       MyBatis 自带有很多类型处理器,你可以去 TypeHandlerRegistry.java 这个类下查看,此处不再列出。

自定义的类型处理器,如何使用,请看下面??

 <!-- 1.数据库 to  Java-->
<resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap2">
	<id column="id" property="id"/>
	<result column="roundingMode" property="roundingMode" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
</resultMap>-->
<!-- 2.Java to 数据库 -->
<insert id="insert2">
	insert into users2 (id, name, funkyNumber, roundingMode) 
	values (#{id}, #{name}, #{funkyNumber}, #{roundingMode, typeHandler=org.apache.ibatis.type.EnumTypeHandler})
</insert>

1.5 objectFactory(对象工厂)

       MyBatis可以将数据库中的记录映射成 Java 对象。这就是 objectFactory 属性的作用,MyBatis 提供了一个默认的对象工厂:DefaultObjectFactory 类。

       举个栗子:我们需要对 MyBatis 返回的对象中的数据进行系数操作,即返回的数量 * 3 后返回,此处就可以通过自定义对象工厂来完成。

/**
 * 自定义一个 MyObjectFactory
 * 只需要继承 DefaultObjectFactory 类,重写 create() 方法即可
 * 如下方法为:将返回的数量 * 3
 */
public class MyObjectFactory extends DefaultObjectFactory {

    @Override
    public Object create(Class type) {
        System.out.println("创建对象方法:" + type);
        if (type.equals(User.class)) {
            User user = (User) super.create(type);
            user.setCount(user.getCount() * 3);
            return user;
        }
        Object result = super.create(type);
        return result;
    }
}

       然后在 mybatis-config.xml 中进行配置,即可使用我们自定义的 ObjectFactory 了。

<!-- mybatis-config.xml -->
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
  <property name="someProperty" value="100"/>
</objectFactory>

1.6 plugins(插件)

      此处不做介绍

1.7 environments(环境配置)

       MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中 使用相同的 SQL 映射。有许多类似的使用场景。不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

       这种环境配置在项目中很少使用,我们通常都是在 pom.xml 中,使用 <profiles>标签来进行配置,如下所示:

<profiles>
	<profile>
		<!-- 开发环境 -->
		<id>develop</id>
		<properties>
			//不同环境数据库的一些配置
		</properties>
		<activation>
			<activeByDefault>true</activeByDefault>
		</activation>
	</profile>
	
	<profile>
		<!-- 线上环境 -->
		<id>release</id>
		<properties>
			//不同环境数据库的一些配置
		</properties>
	</profile>
</profiles>

1.8 mappers(映射器配置)

      既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。 但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。例如:

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

最后:附mybatis-config.xml 配置文件

<?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>

    <!-- 1.对外部配置参数的引用-->
    <properties resource="引用外部文件地址"/>
    <!-- 2.对MyBatis核心行为的控制 -->
    <settings>
        <!-- 2.1日志输出控制打印查询语句 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
		...... 此处还有很多核心行为的控制
    </settings>

    <!-- 3.类型别名(简化映射器 sqlMapper.xml中类型别名的拼写,为了简化类型全路径的拼写) -->
    <!-- MyBatis 自带类型别名,参见:TypeAliasRegistry.java -->
    <typeAliases>
        <!-- 3.1 别名可以是一个类-->
        <typeAlias alias="user" type="com.xxx.entity.User"/>
        <!-- 3.2 别名也可以是一个包名 -->
        <package name="com.springboot.entity"/>
    </typeAliases>


    <!-- 4.类型处理器 -->
    <!-- TypeHandler 用来将数据库中的类型字段转为Java类型的字段。虽然 MyBatis 已经为我们提供了很多。但是还是有一部分没有,例如 Blob类型转 String、Json类型 转 Object等(MySQL 5.7 支持Json类型字段了)-->
    <!-- 这就是MyBatis 为什么能将 String 以 varchar 存储到数据库 -->
    <!-- 自带TypeHandler:参见TypeHandlerRegistry.java -->
    <typeHandlers>
        <typeHandler handler="com.springboot.type.MyTypeHandlar"></typeHandler>
    </typeHandlers>

    <!-- 自定义 Handler 如何使用??配置到需要使用的地方即可-->
    <!-- 1.数据库 to  Java-->
    <!--<resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap2">
        <id column="id" property="id"/>
        <result column="roundingMode" property="roundingMode" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
    </resultMap>-->
    <!-- 2.Java to 数据库 -->
    <!--<insert id="insert2">
        insert into users2 (id, name, funkyNumber, roundingMode) values (
        #{id}, #{name}, #{funkyNumber}, #{roundingMode, typeHandler=org.apache.ibatis.type.EnumTypeHandler}
        )
    </insert>-->


    <!-- 5.对象工厂:MyBatis可以将数据库中的记录,映射成 Java 对象 -->
    <!-- 提供了一个默认的对象工厂:DefaultObjectFactory  -->
    <objectFactory type="org.mybatis.example.ExampleObjectFactory">
        <property name="someProperty" value="100"/>
    </objectFactory>


    <!-- 6.插件(此处不做介绍) -->
    <plugins>
        <plugin interceptor="org.mybatis.example.ExamplePlugin">
            <property name="someProperty" value="100"/>
        </plugin>
    </plugins>


    <!-- 7.环境配置 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/><!-- 单独使用时配置成 MANAGED 没有事务(适用于集成到容器,事务由容器来管理。集成Spring后,Spring会覆盖 transactionManager 这个标签) -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost/rh_test?useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 8.映射器配置 -->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

</configuration>
发布了301 篇原创文章 · 获赞 66 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/lzb348110175/article/details/104573280