MyBatis配置解析

1、核心配置文件

  • mybatis-config.xml
  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
<!-- 注意元素节点的顺序!顺序不对会报错 -->

2、属性(properties)

我们可以通过properties属性来实现引用配置文件

数据库的属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。【db.properties】

  1. 编写一个配置文件db.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis?useSLL=true&useUnicode=true&characterEncoding=utf-8
    jdbc.user=root
    jdbc.password=123456
    
  2. 在mybatis-config.xml中引入properties 配置文件

<!-- 引入外部配置文件 -->
<properties resource="db.properties">
    <property name="jdbc.password" value="1111"/>
</properties>
  • 可以直接引用外部配置文件
  • 也可以在其中增加一些属性配置
  • 默认优先引用外部配置文件的信息
  • 更多信息请看官网文档

3、环境配置(environments)

<environments default="development">
 <environment id="development">
   <transactionManager type="JDBC">
     <property name="..." value="..."/>
   </transactionManager>
   <dataSource type="POOLED">
     <property name="driver" value="${jdbc.driver}"/>
     <property name="url" value="${jdbc.url}"/>
     <property name="username" value="${jdbc.username}"/>
     <property name="password" value="${jdbc.password}"/>
   </dataSource>
 </environment>
</environments>

配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default指定)

尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境

  • 子元素节点:environment

    • dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源

    • 数据源是必须配置的

    • 有三种内建的数据源类型

      type="[UNPOOLED|POOLED|JNDI]")
      
      • UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接
      • POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式
      • JNDI:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用
  • 子元素节点:transactionManager - [ 事务管理器 ]

    • 语法

      <!-- 语法 -->
      <transactionManager type="[ JDBC | MANAGED ]"/>
      
    • 这两种事务管理器类型都不需要设置任何属性

  • 子元素节点:数据源(dataSource)

    • 数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等....

具体的一套环境,通过设置id进行区别,id保证唯一!

4、类型别名(typeAliases)

  • 类型别名可为 Java 类型设置一个缩写名字
  • 它仅用于 XML 配置,意在降低冗余的全限定类名书写

给单个实体类起别名

<!-- 给单个实体类起别名 -->
<typeAliases>
    <typeAlias alias="user" type="com.jh.domain.User"/>
</typeAliases>

当这样配置时,user 可以用在任何使用 com.jh.domain.User 的地方

为整个包下的实体类起别名

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean

<!-- 为整个包下的实体类起别名 -->
<typeAliases>
    <package name="com.jh.domain"/>
</typeAliases>

在没有注解的情况下,com.jh.domain包下的每个Java Bean的别名都会使用 Bean 的首字母小写的非限定类名来作为它的别名

如何选择使用:

  • 当类比较少时可以第一种方式单独设置
  • 当类比较多时可以第二种方式为整个包设置别名
  • 第一种方式的别名可以自定义DIY别名
  • 第二种方式必须使用其规定的别名
  • 也可以使用注解实现第二种方式的DIY
@Alias("user")
public class User {
  ...
}

常见的 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
integet 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

5、设置(settings)

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

我们常用的设置有:

  • 缓存开启关闭
  • 懒加载
  • 日志功能
设置名 描述 有效值 默认值
cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存 true | false true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态 true | false false
logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING 未设置

一个配置完整的 settings 元素的示例如下:

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

6、映射器(mappers)

映射器 : 定义映射SQL语句文件

MapperRegistry:注册绑定我们的Mapper文件

引入资源的方式

方式一:

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

方式二:

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

方式三:

<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

使用方式二和方式三的注意点:

  • 接口和它的Mapper配置文件必须同名
  • 接口和它的Mapper配置文件必须在同一个包下

如果xml文件命名规范,也可使用通配符*进行统一配置

<mappers>
  <mapper resource="org/mybatis/builder/*Mapper.xml"/>
</mappers>

Mapper文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jh.mapper.UserMapper">
   ...
</mapper>

namespace中文意思:命名空间,作用如下:

  • namespace的命名必须跟某个接口同名
  • 接口中的方法与映射文件中sql语句id应该一一对应
  1. namespace和子元素的id联合保证唯一 , 区别不同的mapper
  2. 绑定DAO接口
  3. namespace命名规则 : 包名+类名

MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建,以尽可能地为你减少麻烦。

7、其他不常用配置

posted @ 2021-01-06 17:38  天下御免  阅读(69)  评论(0编辑  收藏  举报