第一章:概述
- Mybatis 的全局配置文件包含了影响 Mybatis 行为甚深的设置( settings )和属性( properties )信息。
- 文档的顶层结构如下:
- Configuration 配置:
- properties 属性
- settings 设置
- typeAliases 类型命名
- typeHandlers 类型处理器
- objectFactory 对象工厂
- plugins 插件
- environments 环境
- environment 环境变量
- transactionManager 事务管理器
- dataSource 数据源
- environment 环境变量
- databaseIdProvider 数据库厂商标识
- mappers 映射器
- Configuration 配置:
第二章:properties (了解)
- Mybatis 可以使用 properties 标签来引入外部的 properties 属性配置文件中的内容。
属性:
- resource:引入类路径下的配置文件。
- url:引入网络或磁盘上的配置文件。
示例:
- db.properties
jdbc.url=jdbc:mysql://192.168.134.100:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=truejdbc.driverClass=com.mysql.cj.jdbc.Driverjdbc.username=rootjdbc.password=123456
- mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--Mybatis可以使用properties标签来引入外部properties配置文件的内容resource属性:引入类路径下的配置文件url属性:引入网络或磁盘上的配置文件--><properties resource="db.properties" ></properties><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 使用${}引入db.properties属性文件中的内容 --><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/></mappers></configuration>
第三章:settings
这是 Mybatis 中极为重要的调整设置,它们会改变 Mybatis 的运行时行为。
示例:
- mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--Mybatis可以使用properties标签来引入外部properties配置文件的内容resource属性:引入类路径下的配置文件url属性:引入网络或磁盘上的配置文件--><properties resource="db.properties" ></properties><settings><!--开启自动驼峰命名规则映射,可以将诸如last_name封装为lastName。--><setting name="mapUnderscoreToCamelCase" value="true"/></settings><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 使用${}引入db.properties属性文件中的内容 --><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/></mappers></configuration>
第四章:typeAliases (别名处理器)
- 类型别名是为 Java 类型设置一个短的名字,可以方便我们引用某个类。
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--Mybatis可以使用properties标签来引入外部properties配置文件的内容resource属性:引入类路径下的配置文件url属性:引入网络或磁盘上的配置文件--><properties resource="db.properties" ></properties><settings><!-- 开启自动驼峰命名规则映射 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><!--类型别名是为Java类型设置一个短的名字,可以方便我们引用某个类--><typeAlias type="com.sunxiaping.domain.Employee" alias="emp"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 使用${}引入db.properties属性文件中的内容 --><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/></mappers></configuration>
- 在类很多的情况下,可以批量设置别名。
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--Mybatis可以使用properties标签来引入外部properties配置文件的内容resource属性:引入类路径下的配置文件url属性:引入网络或磁盘上的配置文件--><properties resource="db.properties" ></properties><settings><!-- 开启自动驼峰命名规则映射 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><!--通过package标签的name属性指定需要生成别名的包,默认会创建一个别名,就是类名的小写--><package name="com.sunxiaping"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 使用${}引入db.properties属性文件中的内容 --><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/></mappers></configuration>
- 可以在类上使用 @Alias 注解设置别名:
package com.sunxiaping.domain;import org.apache.ibatis.type.Alias;@Alias("emp")public class Employee {private Integer id;private String lastName;private String email;private String gender;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "Employee{" +"id=" + id +", lastName='" + lastName + '\'' +", email='" + email + '\'' +", gender='" + gender + '\'' +'}';}}
- 需要注意的是,Mybatis 已经为许多常见的 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 |
第五章:typeHandlers (类型处理器)
- 无论是 Mybatis 在预处理语句( PreparedStatement )中设置一个参数时,还是从结果集中取出一个值的时候,都会用类型处理器将获取的值以合适的方式转换为 Java 类型。 | 类型处理器 | Java类型 | JDBC类型 | | —- | —- | —- | | BooleanTypeHandler | java.lang.Boolean,boolean | 数据库兼容的BOOLEAN | | ByteTypeHandler | java.lang.Byte,byte | 数据库兼容的NUMERIC或BYTE | | ShortTypeHandler | java.lang.Short,short | 数据库兼容的NUMERIC或SHROT INTEGER | | IntegerTypeHandler | java.lang.Integer,int | 数据库兼容的NUMERIC或INTEGER | | LongTypeHandler | java.lang.Long,long | 数据库兼容的NUMERIC或Long INTEGER | | FloatTypeHandler | java.lang.Float,float | 数据库兼容的NUMERIC或FLOAT | | DoubleTypeHandler | java.lang.Double,double | 数据库兼容的NUMERIC或DOUBLE | | BigDecimalTypeHandler | java.lang.BigDecimal | 数据库兼容的NUMERIC或DECIMAL | | StringTypeHandler | java.lang.String | CHAR,VARCHAR |
- 日期类型的处理:JDK 1.8 以前一直是个头疼的问题。我们通常使用 JSR 310 规范领导者 Stephen Colebourne 创建的 Joda-Time 来操作。JDK 1.8 已经实现全部的 JSR 310 规范了。日期时间处理上,我们可以使用 Mybatis 基于 JSR 310 编写的各种日期时间类型处理器。Mybatis 3.4 以前的版本需要我们手动注册这些处理器,以后的版本都是自动注册的。
- 自定义类型处理器:我们可以重写类型处理器或者创建自己的类型处理器来处理器不支持的或非标准的类型。
- 步骤:
- ① 实现 org.apche.ibatis.type.TypeHandler 接口或者继承 org.apche.ibatis.type.BaseTypeHandler 。
- ② 指定其映射某个 JDBC 类型。
- ③ 在 Mybatis 的全局配置文件中注册。
- 步骤:
第六章:plugins(插件)
- 插件是 Mybatis 提供的一个非常强大的机制,我们可以通过插件来修改 Mybatis 的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行。
Executor(update, query, flushStatements, commit, rollback,getTransaction, close, isClosed)
ParameterHandler(getParameterObject, setParameters)
ResultSetHandler(handleResultSets, handleOutputParameters)
StatementHandler(prepare, parameterize, batch, update, query)
第七章:environments (环境)
- Mybatis 可以配置多种环境,比如开发、测试和生产环境需要有不同的配置。
- 每种环境使用一个 environment 标签进行配置并指定唯一标识符。
- 可以通过 environments 标签中的 default 属性指定一个环境的标识符来快速的切换环境。
environment:指定具体环境
- id:指定当前环境的唯一标识。
- transactionManager:事务管理器。
- type:事务管理器的类型。有 JDBC 、MANAGED 和自定义类型。
- JDBC:使用了 JDBC 的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围。
- MANAGED:不提交或回滚一个连接、让容器来管理事务的整个生命周期。
- 自定义:实现 TransactionFactory 接口,type = 全类名/别名。
- type:事务管理器的类型。有 JDBC 、MANAGED 和自定义类型。
- dataSource:数据源。
- type:数据源类型。有 UNPOOLED、POOLED、JNDI 和自定义类型。
- UNPOOLED:不使用连接池。
- POOLED:使用连接池。
- JNDI:在EJB或应用服务器这类容器中查找指定的数据源。
- 自定义:实现 DataSourceFactory 接口,定义数据源的获取方式。
- type:数据源类型。有 UNPOOLED、POOLED、JNDI 和自定义类型。
示例:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--Mybatis可以使用properties标签来引入外部properties配置文件的内容resource属性:引入类路径下的配置文件url属性:引入网络或磁盘上的配置文件--><properties resource="db.properties" ></properties><settings><!-- 开启自动驼峰命名规则映射 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><!--通过package标签的name指定需要生成别名的包,默认会创建一个别名,就是类名的小写--><package name="com.sunxiaping"/></typeAliases><!--environments,Mybatis可以配置多种环境environment:配置一个具体的环境信息;必须有transactionManager和dataSource标签。属性id代表当前环境的标识,可以达到快速切换环境transactionManager:事务管理器type:事务管理器的类型,有JDBC和MANAGED两种类型,还可以自定义事务管理器dataSource:数据源type:数据源的类型,有UNPOOLED、POOLED、JNDI和自定义类型。--><environments default="development"><environment id="test"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 使用${}引入db.properties属性文件中的内容 --><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 使用${}引入db.properties属性文件中的内容 --><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/></mappers></configuration>
第八章:databaseIdProvider
- Mybatis 可以根据不同的数据库厂商执行不同的语句。
<databaseIdProvider type="DB_VENDOR"><!--为不同的数据库厂商起别名--><property name="MySQL" value="mysql"/><property name="Oracle" value="oracle"/><property name="SQL Server" value="sqlserver"/></databaseIdProvider>
- databaseIdProvider 标签的属性 type 的值是 DB_VENDOR ,会通过 DatabaseMetaData 中的 getDatabaseProductName() 方法返回的字符串进行设置。由于通常情况下这个字符串非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其变短。
Mybatis 的匹配规则如下:
- ① 如果没有配置 databaseIdProvider 标签,那么 databaseId 的值就为 null 。
- ② 如果配置了 databaseIdProvider 标签,使用标签配置的name去匹配数据库的信息,匹配上设置 databaseId = 配置指定的值,否则依旧为 null 。
- ③ 如果 databaseId 不为 null ,Mybatis 只会找到配置 databaseId 的 SQL 语句。
- ④ Mybatis 会同时加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。如果同时找到带有 databaseId 和不带databaseId 的相同语句,则后者会被舍弃。
示例:
- mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--Mybatis可以使用properties标签来引入外部properties配置文件的内容resource属性:引入类路径下的配置文件url属性:引入网络或磁盘上的配置文件--><properties resource="db.properties"></properties><settings><!-- 开启自动驼峰命名规则映射 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><!--通过package标签的name指定需要生成别名的包,默认会创建一个别名,就是类名的小写--><package name="com.sunxiaping"/></typeAliases><!--environments,Mybatis可以配置多种环境environment:配置一个具体的环境信息;必须有transactionManager和dataSource标签。属性id代表当前环境的标识,可以达到快速切换环境transactionManager:事务管理器type:事务管理器的类型,有JDBC和MANAGED两种类型,还可以自定义事务管理器dataSource:数据源type:数据源的类型,有UNPOOLED、POOLED、JNDI和自定义类型。--><environments default="development"><environment id="test"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 使用${}引入db.properties属性文件中的内容 --><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 使用${}引入db.properties属性文件中的内容 --><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--databaseIdProvider:支持多数据库厂商type="DB_VENDOR":VendorDatabaseIdProvider- 作用: 得到数据库厂商的标识(驱动,Connection接口中的getMetaData()返回了DatabaseMetaData,DatabaseMetaData中有getDatabaseProductName()方法),Mybatis就能数据数据库厂商标识来指定不同的SQL--><databaseIdProvider type="DB_VENDOR"><!--为不同的数据库厂商起别名--><property name="MySQL" value="mysql"/><property name="Oracle" value="oracle"/><property name="SQL Server" value="sqlserver"/></databaseIdProvider><mappers><mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/></mappers></configuration>
- EmployeeMapper.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.sunxiaping.mapper.EmployeeMapper"><select id="findById" resultType="com.sunxiaping.domain.Employee">SELECT id,last_name as lastName,email,genderFROM employeeWHERE id = #{id,jdbcType=INTEGER}</select><!--select标签中databaseId用来指定在那种数据库环境下执行--><select id="findById" resultType="com.sunxiaping.domain.Employee" databaseId="mysql">SELECT id,last_name as lastName,email,genderFROM employeeWHERE id = #{id,jdbcType=INTEGER}</select><!--select标签中databaseId用来指定在那种数据库环境下执行--><select id="findById" resultType="com.sunxiaping.domain.Employee" databaseId="oracle">SELECT id,last_name as lastName,email,genderFROM employeesWHERE id = #{id,jdbcType=INTEGER}</select></mapper>
第九章:mapper(映射)
- mapper 逐个注册 SQL 映射文件
<mappers><mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/></mappers>
- 使用批量注册:如果有 SQL 映射文件存在,文件名必须和 Mapper 接口名相同且必须在同一个目录下
<mappers><package name="com.sunxiaping.mapper"/></mappers>
- 示例:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--Mybatis可以使用properties标签来引入外部properties配置文件的内容resource属性:引入类路径下的配置文件url属性:引入网络或磁盘上的配置文件--><properties resource="db.properties"></properties><settings><!-- 开启自动驼峰命名规则映射 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><!--通过package标签的name指定需要生成别名的包,默认会创建一个别名,就是类名的小写--><package name="com.sunxiaping"/></typeAliases><!--environments,Mybatis可以配置多种环境environment:配置一个具体的环境信息;必须有transactionManager和dataSource标签。属性id代表当前环境的标识,可以达到快速切换环境transactionManager:事务管理器type:事务管理器的类型,有JDBC和MANAGED两种类型,还可以自定义事务管理器dataSource:数据源type:数据源的类型,有UNPOOLED、POOLED、JNDI和自定义类型。--><environments default="development"><environment id="test"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 使用${}引入db.properties属性文件中的内容 --><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 使用${}引入db.properties属性文件中的内容 --><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--databaseIdProvider:支持多数据库厂商type="DB_VENDOR":VendorDatabaseIdProvider- 作用: 得到数据库厂商的标识(驱动,Connection接口中的getMetaData()返回了DatabaseMetaData,DatabaseMetaData中有getDatabaseProductName()方法),Mybatis就能数据数据库厂商标识来指定不同的SQL--><databaseIdProvider type="DB_VENDOR"><!--为不同的数据库厂商起别名--><property name="MySQL" value="mysql"/><property name="Oracle" value="oracle"/><property name="SQL Server" value="sqlserver"/></databaseIdProvider><!--mappers将SQL映射注册到全局配置中--><mappers><!--mapper:注册一个SQL映射- resource:引用类路径下的SQL映射文件- url:引用网络路径下的SQL映射文件- class:引用接口,- 有SQL配置文件,接口和配置文件必须放在同一目录下,且接口名和配置文件的名称必须相同- 没有SQL配置文件,所有的SQL都是利用注解写在接口上--><!-- mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>--><!--package:批量注册,如果有SQL配置文件,接口和配置文件必须放在同一目录下,且接口名和配置文件的名称必须相同--><package name="com.sunxiaping.mapper"/></mappers></configuration>
