1.MyBatis 核心配置介绍
一级标签有:properties
、settings
、typeAliases
、typeHandlers
、objectFactory
、plugins
、environments
、mappers
、databaseIdProvider(此标签一般用不到,此处不做介绍)
此部分标签的介绍,你也可以参考: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&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>