MyBatis Configuration 相关配置
属性(properties)
在连接数据库的时候,大多都把连接数据库的参数信息(driver、url、user等)写在外部属性文件中,然后我们在 MyBatis 的主配置文件导入即可
db.properties
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/ss?serverTimezone=UTC
mysql.username=root
mysql.password=12345678
MyBatis-conf.xml
<properties resource="db.properties"></properties>
这里的 db.properties 默认放在类路径下
设置(settings)
该标签的属性可以改变 MyBatis 的运行时行为。例如我们的查询的数据列没有和实体类的 JavaBean 风格的属性名称对应,所以查询的结果封装不上,那么实体类就为 null 了。
我们为实体类和数据库字段为了方便添加映射关系,可以开启其中一个选项 mapUnderscoreToCamelCase
来启用驼峰式命名自定匹配。不然我们在对数据库取出数据时,需要给结果集字段取别名很麻烦。
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
还有很多选项。如下所示:
设置名 | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | true | false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 | true | false | false |
aggressiveLazyLoading | 开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods )。 | true | false | false (在 3.4.1 及之前的版本中默认为 true) |
multipleResultSetsEnabled | 是否允许单个语句返回多结果集(需要数据库驱动支持)。 | true | false | true |
useColumnLabel | 使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察。 | true | false | true |
useGeneratedKeys | 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。 | true | false | False |
autoMappingBehavior | 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)。 | NONE, PARTIAL, FULL | PARTIAL |
autoMappingUnknownColumnBehavior | 指定发现自动映射目标未知列(或未知属性类型)的行为。NONE : 不做任何反应WARNING : 输出警告日志('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等级必须设置为 WARN )FAILING : 映射失败 (抛出 SqlSessionException ) | NONE, WARNING, FAILING | NONE |
defaultExecutorType | 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(PreparedStatement); BATCH 执行器不仅重用语句还会执行批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间,它决定数据库驱动等待数据库响应的秒数。 | 任意正整数 | 未设置 (null) |
defaultFetchSize | 为驱动的结果集获取数量(fetchSize)设置一个建议值。此参数只可以在查询设置中被覆盖。 | 任意正整数 | 未设置 (null) |
defaultResultSetType | 指定语句默认的滚动策略。(新增于 3.5.2) | FORWARD_ONLY | SCROLL_SENSITIVE | SCROLL_INSENSITIVE | DEFAULT(等同于未设置) | 未设置 (null) |
safeRowBoundsEnabled | 是否允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为 false。 | true | false | False |
safeResultHandlerEnabled | 是否允许在嵌套语句中使用结果处理器(ResultHandler)。如果允许使用则设置为 false。 | true | false | True |
mapUnderscoreToCamelCase | 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 | true | false | False |
localCacheScope | MyBatis 利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询。 默认值为 SESSION,会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存。 | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | 当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型。 某些数据库驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 | JdbcType 常量,常用值:NULL、VARCHAR 或 OTHER。 | OTHER |
lazyLoadTriggerMethods | 指定对象的哪些方法触发一次延迟加载。 | 用逗号分隔的方法列表。 | equals,clone,hashCode,toString |
defaultScriptingLanguage | 指定动态 SQL 生成使用的默认脚本语言。 | 一个类型别名或全限定类名。 | org.apache.ibatis.scripting.xmltags.XMLLanguageDriver |
defaultEnumTypeHandler | 指定 Enum 使用的默认 TypeHandler 。(新增于 3.4.5) | 一个类型别名或全限定类名。 | org.apache.ibatis.type.EnumTypeHandler |
callSettersOnNulls | 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这在依赖于 Map.keySet() 或 null 值进行初始化时比较有用。注意基本类型(int、boolean 等)是不能设置成 null 的。 | true | false | false |
returnInstanceForEmptyRow | 当返回行的所有列都是空时,MyBatis默认返回 null 。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集(如集合或关联)。(新增于 3.4.2) | true | false | false |
logPrefix | 指定 MyBatis 增加到日志名称的前缀。 | 任何字符串 | 未设置 |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未设置 |
proxyFactory | 指定 Mybatis 创建可延迟加载对象所用到的代理工具。 | CGLIB | JAVASSIST | JAVASSIST (MyBatis 3.3 以上) |
vfsImpl | 指定 VFS 的实现 | 自定义 VFS 的实现的类全限定名,以逗号分隔。 | 未设置 |
useActualParamName | 允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的项目必须采用 Java 8 编译,并且加上 -parameters 选项。(新增于 3.4.1) | true | false | true |
configurationFactory | 指定一个提供 Configuration 实例的类。 这个被返回的 Configuration 实例用来加载被反序列化对象的延迟加载属性值。 这个类必须包含一个签名为static Configuration getConfiguration() 的方法。(新增于 3.2.3) | 一个类型别名或完全限定类名。 | 未设置 |
shrinkWhitespacesInSql | Removes extra whitespace characters from the SQL. Note that this also affects literal strings in SQL. (Since 3.5.5) |
类型别名(typeAliases)
该功能时用来给 Java 类型设置了一个别名。它仅用于 XML 配置,可以帮助我们简便写繁琐的全限定类名。如给 com.nhky.entitys.Emp 取别名。
MyBatis-conf.xml
<typeAliases>
<typeAlias type="com.nhky.entitys.Emp" alias="emp"/>
<package name="com.nhky.entitys"/>
</typeAliases>
那么在 EmpDao.xml 可以写
<mapper namespace="com.nhky.dao.EmpDao">
<select id="selectEmp" resultType="emp">
select * from emp
</select>
</mapper>
也是使用包名指定,会使用 Java Bean 的首字母小写的非限定类名来作为它的别名(这里其实在引用的时候不区分大小写)。 比如 com.nhky.entitys.Emp
的别名为 emp
;若有注解,则别名为其注解值。见下面的例子:
@Alias("emp01")
public class Emp {
...
}
- typeAliases 别名处理器
- 可以给多个类型设置别名处理器
- typeAliase 给一个类型设置一个别名
- type:指定要取别名的类型的全类名
- alias:别名的值
- 细节
- 如果typeAlias 没有设置 alias属性,默认的别名就是类名,而且不区分大小写
- 所有的别名不能相同,不能使用已经被定义过的别名
同时,Mybatis 还内建了一些基本类型的别名,如下
别名 | 映射的类型 |
---|---|
_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 |
当然我们在开发中,别名处理器一般不用(除了MyBatis已经定义好的别名外),因为使用全类名定义实际效果更好,在开发工具中使用全类名也更好的去查看这个类。
类型处理器(typeHandlers)
它的作用在于数据库类型和我们的 Java 类型是不一样的,需要发生相互的转换,例如 MySQL 数据库的 varchar 类型到我们 Java 的 String 类型,Oracle 数据库的 Number 类型到 Java 的 Integer 类型,还有日期类型等等。需要将其转为合适的 Java 类型。MyBatis 有着很多的默认类型处理器,如下
类型处理器 | Java 类型 | JDBC 类型 |
---|---|---|
BooleanTypeHandler | java.lang.Boolean , boolean | 数据库兼容的 BOOLEAN |
ByteTypeHandler | java.lang.Byte , byte | 数据库兼容的 NUMERIC 或 BYTE |
ShortTypeHandler | java.lang.Short , short | 数据库兼容的 NUMERIC 或 SMALLINT |
IntegerTypeHandler | java.lang.Integer , int | 数据库兼容的 NUMERIC 或 INTEGER |
LongTypeHandler | java.lang.Long , long | 数据库兼容的 NUMERIC 或 BIGINT |
FloatTypeHandler | java.lang.Float , float | 数据库兼容的 NUMERIC 或 FLOAT |
DoubleTypeHandler | java.lang.Double , double | 数据库兼容的 NUMERIC 或 DOUBLE |
BigDecimalTypeHandler | java.math.BigDecimal | 数据库兼容的 NUMERIC 或 DECIMAL |
StringTypeHandler | java.lang.String | CHAR , VARCHAR |
ClobReaderTypeHandler | java.io.Reader | - |
ClobTypeHandler | java.lang.String | CLOB , LONGVARCHAR |
NStringTypeHandler | java.lang.String | NVARCHAR , NCHAR |
NClobTypeHandler | java.lang.String | NCLOB |
BlobInputStreamTypeHandler | java.io.InputStream | - |
ByteArrayTypeHandler | byte[] | 数据库兼容的字节流类型 |
BlobTypeHandler | byte[] | BLOB , LONGVARBINARY |
DateTypeHandler | java.util.Date | TIMESTAMP |
DateOnlyTypeHandler | java.util.Date | DATE |
TimeOnlyTypeHandler | java.util.Date | TIME |
SqlTimestampTypeHandler | java.sql.Timestamp | TIMESTAMP |
SqlDateTypeHandler | java.sql.Date | DATE |
SqlTimeTypeHandler | java.sql.Time | TIME |
ObjectTypeHandler | Any | OTHER 或未指定类型 |
EnumTypeHandler | Enumeration Type | VARCHAR 或任何兼容的字符串类型,用来存储枚举的名称(而不是索引序数值) |
EnumOrdinalTypeHandler | Enumeration Type | 任何兼容的 NUMERIC 或 DOUBLE 类型,用来存储枚举的序数值(而不是名称)。 |
SqlxmlTypeHandler | java.lang.String | SQLXML |
InstantTypeHandler | java.time.Instant | TIMESTAMP |
LocalDateTimeTypeHandler | java.time.LocalDateTime | TIMESTAMP |
LocalDateTypeHandler | java.time.LocalDate | DATE |
LocalTimeTypeHandler | java.time.LocalTime | TIME |
OffsetDateTimeTypeHandler | java.time.OffsetDateTime | TIMESTAMP |
OffsetTimeTypeHandler | java.time.OffsetTime | TIME |
ZonedDateTimeTypeHandler | java.time.ZonedDateTime | TIMESTAMP |
YearTypeHandler | java.time.Year | INTEGER |
MonthTypeHandler | java.time.Month | INTEGER |
YearMonthTypeHandler | java.time.YearMonth | VARCHAR 或 LONGVARCHAR |
JapaneseDateTypeHandler | java.time.chrono.JapaneseDate | DATE |
在 MyBatis-conf.xml 中可以这样使用
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.StringTypeHandler" javaType="java.lang.String" jdbcType="varchar2"/>
</typeHandlers>
- typeHandlers 类型处理器
- typeHandler :配置单个的类型处理器
- handler : 类型处理器的全类名
- javaType : 表示Java类型
- jdbcType : 表示兼容的数据库类型
- typeHandler :配置单个的类型处理器
- 细节
- 从 3.4.5 开始,MyBatis 默认支持 JSR-310(日期和时间 API) 。
正常的开发中,可以不必配置类型转换器,因为 MyBatis 都已经定义好了,已经足够是使用了。如果想自定义可以参考官方文档
环境配置(environments)
表示配置多个环境,这里的环境指定是数据库环境,也就以为可以连接多个数据库。
<environments default="oracle">
<environment id="mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}" />
<property name="url"
value="${mysql.url}" />
<property name="username" value="${mysql.username}" />
<property name="password" value="${mysql.password}" />
</dataSource>
</environment>
<environment id="oracle">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${oracle.driver}" />
<property name="url"
value="${oracle.url}" />
<property name="username" value="${oracle.username}" />
<property name="password" value="${oracle.password}" />
</dataSource>
</environment>
</environments>
<databaseIdProvider type="DB_VENDOR" >
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
<property name="MqSQL" value="mysql" />
</databaseIdProvider>
-
environments:表示可以配置多个环境,default 属性表示指定使用哪一种环境
- environment:表示配置单个数据库环境,必须存在 id 属性,表示此环境的唯一标识,而且多个环境的 id 不能重复,存在两个标签
- transactionManager:配置事务管理器
- type:表示设置事务管理器类型,有两种
- JDBC:这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域
- MANAGED :这个配置几乎没做什么(就是没用的感觉)。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为
<property name="closeConnection" value="false"/>
- dataSource :配置数据源,type 表示数据类型,有三种
- POOLED : 使用连接池,避免了创建新的连接实例时所必需的初始化和认证时间
- UNPOOLED :不使用连接池, 这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说还是很好的。
- JNDI :这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用
- type:表示设置事务管理器类型,有两种
- transactionManager:配置事务管理器
- environment:表示配置单个数据库环境,必须存在 id 属性,表示此环境的唯一标识,而且多个环境的 id 不能重复,存在两个标签
-
databaseIdProvider 数据库厂商标识
-
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的
databaseId
属性。为支持多厂商特性,只要像下面这样在 mybatis-config.xml 文件中加入databaseIdProvider
即可 -
sq l语句中可以使用 databaseid 指定这条 sql 语句是在何种厂商的数据库环境下执行
我们就可以在sql语句中指定不同的数据库执行不同的sql语句:
<select id="selectEmp" resultType="com.nhky.entityes.Emp" databaseId="oracle"> select empno empId,ename empName from emp </select> <select id="selectEmp" resultType="com.nhky.entityes.Emp" databaseId="mysql"> select * from emp </select>
-
映射注册(mappers)
使用 mappers 标签可以注册 sql 映射文件,将 sql 映射文件注册到全局配置文件中是必不可少的步骤,正常开发来说,一个 SQL 映射文件对应到一个 DAO[Mapper] 接口。
首先,我们需要告诉 MyBatis 到哪里去寻找 sql 语句。对于指定资源位置,可以使用相对于类路径的资源引用、完全限定定位符(URL)、使用映射器接口实现类的完全限定类名、将包内的映射器接口实现全部注册为映射器
- 使用相对于类路径的资源引用
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="com/nhky/dao/EmpDao.xml"/>
</mappers>
- 使用完全限定资源定位符(URL)
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper resource="file:///com/nhky/dao/EmpDao.xml"/>
</mappers>
- 使用映射器接口实现类的完全限定类名
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="com.nhky.dao.EmpDao"/>
</mappers>
- 将包内的映射器接口实现全部注册为映射器
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="com.nhky.dao"/>
</mappers>
- mappers:可以注册多个sql映射文件
- mapper : 注册单个sql映射文件
- resource : 表示配置类路径中的 sql 映射文件
- url:表示配置网络中或者硬盘中的sql映射文件
- class : 表示引用接口注册,
- mapper : 注册单个sql映射文件
- 细节:
- class 属性要求
- sql 映射文件和接口要同名同包
- 也可以不使用 sql 映射文件,而是在接口方法上注解(如 @Select ) sql。但是不提倡,因为 MyBatis 本来就是想将 sql 和 Java 代码相分离。
- package 标签要求
- 和 class 属性要求一样
- class 属性要求