目录

mybatis全局配置文件

官方配置介绍

注意
注意:每个标签必须按顺序写,不然会提示错误:The content of element type “configuration” must match “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,mappers?)”

properties

mybatis可以使用properties来引入外部properties配置文件的内容

  • resource:引入类路径下的资源
  • url 引入网络路径或者磁盘路径下的资源
注意

如果属性在不只一个地方进行了配置,那么 MyBatis 将按 照下面的顺序来加载:

– 在 properties 元素体内指定的属性首先被读取。

– 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根 据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。

– 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

settings

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

设置名 描述 有效值 默认值
mapUnderscoreToCamelCase 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 true | false False
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 true | false false
aggressiveLazyLoading 开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods)。 true | false false (在 3.4.1 及之前的版本中默认为 true)

驼峰命名配置演示

1
2
3
<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
  • setting:用来设置每一个设置项
  • name 设置名
  • value 设置项取值

typeAliases

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写,别名不区分大小写。例如:

  • typeAlias

    1
    2
    3
    
    <typeAliases>
        <typeAlias type="com.eh.eden.mybatis.orm.bean.Employee"/>
    </typeAliases>
    
    • type 指定要起别名的类型全类名;默认别名就是类名小写;employee
    • alias 指定新别名
  • package

    为某个包以及包下面所有后代包的所有类批量起别名,默认类名小写

    1
    2
    3
    4
    
        <typeAliases>
    <!--        <typeAlias type="com.eh.eden.mybatis.orm.bean.Employee" alias="emp"/>-->
            <package name="com.eh.eden.mybatis.orm.bean"/>
        </typeAliases>
    
    • name 指定包名
  • 批量起别名的情况下,使用@Alias注解为某个类型单独指定新的别名,如果不使用package直接使用alias注解会报错。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    package com.eh.eden.mybatis.orm.bean;
      
    import lombok.Data;
    import org.apache.ibatis.type.Alias;
      
    @Data
    @Alias("emp")
    public class Employee {
      
        private Integer id;
        private String lastName;
        private String gender;
        private String email;
    }
    

    sql映射文件

    1
    2
    3
    
    <select id="getEmployeeById" resultType="emp">
            select id, last_name, gender, email from tbl_employee where id = #{id}
        </select>
    
注意
建议不使用别,直接使用全限定名看的更清晰,而且可以直接点击进类中看详细信息

下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

plugins 插件

MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

这些类中方法的细节可以通过查看每个方法的签名来发现,或者直接查看 MyBatis 发行包中的源代码。 如果你想做的不仅仅是监控方法的调用,那么你最好相当了解要重写的方法的行为。 因为在试图修改或重写已有方法的行为时,很可能会破坏 MyBatis 的核心模块。 这些都是更底层的类和方法,所以使用插件的时候要特别当心。

通过 MyBatis 提供的强大机制,使用插件是非常简单的,只需实现 Interceptor 接口,并指定想要拦截的方法签名即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// ExamplePlugin.java
@Intercepts({@Signature(
  type= Executor.class,
  method = "update",
  args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
  private Properties properties = new Properties();
  public Object intercept(Invocation invocation) throws Throwable {
    // implement pre processing if need
    Object returnObject = invocation.proceed();
    // implement post processing if need
    return returnObject;
  }
  public void setProperties(Properties properties) {
    this.properties = properties;
  }
}
1
2
3
4
5
6
<!-- mybatis-config.xml -->
<plugins>
  <plugin interceptor="org.mybatis.example.ExamplePlugin">
    <property name="someProperty" value="100"/>
  </plugin>
</plugins>

上面的插件将会拦截在 Executor 实例中所有的 “update” 方法调用, 这里的 Executor 是负责执行底层映射语句的内部对象。

提示 覆盖配置类

除了用插件来修改 MyBatis 核心行为以外,还可以通过完全覆盖配置类来达到目的。只需继承配置类后覆盖其中的某个方法,再把它传递到 SqlSessionFactoryBuilder.build(myConfig) 方法即可。再次重申,这可能会极大影响 MyBatis 的行为,务请慎之又慎。

environments

mybatis可以配置多种环境,default指定使用某种环境。可以达到快速切换环境的目的

environment:配置某个具体的环境信息;必须有下面两个标签;id代表当前环境的唯一标识

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
</environments>
  • transactionManager 事务管理器

    • type: 事务管理器的类型,有JDBC(JdbcTransactionFactory) | MANAGED(ManagedTransactionFactory); 自定义事务管理器:实现TransactionFactory接口,type指定为全类名
  • dataSource 数据源

    • type:数据源类型;

    UNPOOLED(UnpooledDataSourceFactory)|POOLED(PooledDataSourceFactory)|JNDI(JndiDataSourceFactory)

    自定义数据源:实现DataSourceFactory接口,type指定为全类名,比如在getDataSource()方法返回c3p0数据源就达到了自定义数据源的目的。

注意
上述事务管理器以及数据源的配置 建议使用spring的事务管理器和数据源配置替代。

databaseIdProvider

不常用,了解就好

MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性(数据库驱动getDatabaseProductName())。 MyBatis 会加载带有匹配当前数据库 databaseId 属性和所有不带 databaseId 属性的语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 为支持多厂商特性,只要像下面这样在 mybatis-config.xml 文件中加入 databaseIdProvider 即可:

1
<databaseIdProvider type="DB_VENDOR" />

databaseIdProvider 对应的 DB_VENDOR 实现会将 databaseId 设置为 DatabaseMetaData#getDatabaseProductName() 返回的字符串。 由于通常情况下这些字符串都非常长,而且相同产品的不同版本会返回不同的值,你可能想通过设置属性别名来使其变短:

1
2
3
4
5
<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="Mysql" value="mysql"/>
  <property name="Oracle" value="oracle" />
</databaseIdProvider>

配置好了别名后在sql映射文件中配置数据厂商别名即可

1
2
3
<select id="getEmployeeById" resultType="emp" databaseId="mysql">
    select id, last_name, gender, email from tbl_employee where id = #{id}
</select>

上面这个sql会到mysql数据库上执行。

mappers

mappers将sql映射注册到全局配置中

注册配置文件:  

  • resource:应用类路径下的sql映射文件

  • url:引用网路路径或者磁盘路径下的sql音色文件

     file:///var/mapper/AuthorMapper.xml

  • 注册接口

    class:引用(注册)接口

    1
    2
    3
    4
    
        <mappers>
            <mapper resource="mapper/EmployeeMapper.xml"/>
            <mapper class="com.eh.eden.mybatis.orm.bean.Employee"/>
        </mappers>
    
    • 有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下

    • 没有sql映射文件,所有的sql都是利用注解写在接口上;

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      
      package com.eh.eden.mybatis.orm.dao;
          
      import com.eh.eden.mybatis.orm.bean.Employee;
      import org.apache.ibatis.annotations.Select;
          
      public interface EmployeeMapper {
          
          @Select("select id, last_name, gender, email from tbl_employee where id = #{id}")
          Employee getEmployeeById(Integer id);
      }
      

      不过还是写在xml文件上便于维护,推荐必要重要的Dao接口写sql映射文件,不重要的简单的Dao接口为了开发快速可以使用注解。

  • 批量注册

    由于mapper都是一个一个注册的,比较麻烦,故而还有批量注册的方法。

    使用package,name属性中要写包名,基于注解版没有问题,但是,写了映射文件的可能找不到,故而将映射文件放入同一个包下,文件名和接口名是一样的,这样才可以批量注册。

    以后都将接口和xml放在一起,但是为了规整,可以在resources下建一个与接口文件一样路径的包,从视觉效果上看是放在两个地方,当然其实都是放在类路径下同一位置,目的都是为了绑定接口和sql映射文件。

    1
    2
    3
    
    <mappers>
           <package name="com.eh.eden.mybatis.orm.dao"/>
        </mappers>
    

    注意:idea 在resources下建立文件夹需要一级一级建,直接com.eh.eden.mybatis.orm.dao相当于一个文件夹,比如下图两个文件夹看着相同,在targe文件夹下是两个目录

    https://gitee.com/lienhui68/picStore/raw/master/null/20201008201426.png

objectFactory

每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。 如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。

一般使用时不会改这个配置,了解即可。