MyBatis全局配置文件
xml配置文件标签的使用
properties (引入外部配置文件)
<?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、mybatis可以使用properties来引入外部properties配置文件内容;
resource:引入类路径下的资源
url:引入网络路径或者磁盘路径下的资源
-->
<properties resource="dbconfig.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
<!--将我们写好的sql映射文件一定要注册到全局配置文件中-->
<mappers>
<mapper resource="EmployeeMapper.xml"/>
</mappers>
</configuration>
dbconfig.properties文件示例
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=111111
settings (设置项)
Setting | Description(描述) | Valid Values(取值范围) | Default (默认值) |
---|---|---|---|
cacheEnabled | 改配置影响的所有映射器中配置的缓存的全局开关 | true / false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。在特定的关联关系中可通过设置fetchType属性来覆盖该项开关的状态。 | true/false | false |
useColumnLabel | 使用列标签代替列名。不同的驱动在这方面会有不同的表现,具体可以参考相关的驱动文档或通过测试这两种不同的模式来观察所用驱动的结果 | true / false | true |
defaultStatementTimeout | 设置超时时间,它决定驱动等待数据库响应的秒数。 | Any positive integer | Not Set (null) |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名A_COLUMN 到经典java属性名为aColumn 的类似映射 | true/false | False |
更多见mybatis官方文档中文版
使用示例:
<!--
settings包含很多重要的设置项,所有的设置项都放在settings里面
setting:用来设置每一个设置项
name:设置项的名字
value:设置项的取值
-->
<settings>
<!-- mapUnderscoreToCamelCase:
是否开启自动驼峰命名规则(camel case)映射,
即从经典数据库列名`A_COLUMN`到经典java属性名为`aColumn`的类似映射,
可用值为true和false,
默认为False -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
typeAliases (别名处理器)
<!--
typeAliases,别名处理器:可以为我们的java类型起别名
别名不区分大小写
-->
<typeAliases>
<!-- typeAlias:为某个java类型起别名
type:指定要起别名的类型的全类名;默认别名就是类名小写:employee
alias:指定新的别名
-->
<!--<typeAlias type="com.szm.mybatis.bean.Employee" alias="emp"/>-->
<!-- package:为某个包下的类批量起别名
name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写),)
-->
<package name="com.szm.mybatis.bean"/>
</typeAliases>
批量起别名会在后代包中有相同类名的类时,产生别名冲突,mybatis会在运行时报错
解决方案:可以在类前使用注解来起别名@Alias("别名")
示例:
package com.szm.mybatis.bean;
import org.apache.ibatis.type.Alias;
@Alias("emp")
public class Employee {
......
}
注意:@Alias("别名")
注解只能在使用批量起别名也就是使用<package/>
标签时使用,否则会报错
注意:MyBatis已经为许多常见的 Java 类型内建 了相应的类型别名。它们都是大小写不敏感的,我们在起 别名的时候千万不要占用已有的别名。
别名 | 映射的类型 | 别名 | 映射的类型 | 别名 | 映射的类型 |
---|---|---|---|---|---|
_byte | byte | string | String | date | Date |
_long | long | byte | Byte | decimal | BigDecimal |
_short | short | long | Long | bigdecimal | BigDecimal |
_int | int | short | Short | object | Object |
_integer | int | int | Integer | map | Map |
_double | double | integer | Integer | hashmap | HashMap |
_float | float | double | Double | list | List |
_boolean | boolean | float | Float | arraylist | ArrayList |
boolean | Boolean | collection | Collection | ||
iterator | Iterator |
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 或 SHORT 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.math.BigDecimal | 数据库兼容的 NUMERIC 或 DECIMAL |
StringTypeHandler | java.lang.String | CHAR, VARCHAR |
日期类型的处理
日期和时间的处理,JDK1.8以前一直是个头疼的问题。我们通常使用JSR310规范领导者Stephen Colebourne创建的Joda-Time来操作。1.8已经实现全部的JSR310规范了。
日期时间处理上,我们可以使用MyBatis基于 JSR310(Date and Time API)编写的各种日期 时间类型处理器。
MyBatis3.4以前的版本需要我们手动注册这些处 理器,以后的版本都是自动注册的。
objectFactory (对象工厂)
mybatis查出数据要封装对象的时候,要创建对象实例,就会利用对象工厂来创建
作为了解,一般情况下不会更改objectFactory的配置,使用默认即可
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 接口,并指定想要拦截的方法签名即可。
environments (环境配置)
<!--
environments:环境们,mybatis可以配置多种环境,default指定使用某种环境。可以达到快速切换环境。
-->
<environments default="development">
<!--environment:配置一个具体的环境信息;必须有以下两个标签;id代表当前环境的唯一标识-->
<environment id="development">
<!--transactionManager:事务管理器
type:事务管理器的类型;JDBC(JdbcTransactionFactory)
|MANAGED(ManagedTransactionFactory)
自定义事务管理器:实现TransactionFactory接口.type指定为全类名-->
<transactionManager type="JDBC"/>
<!--dataSource:数据源
type:数据源类型;UNPOOLED(UnpooledDataSourceFactory)
|POOLED(PooledDataSourceFactory)
|JNDI(JndiDataSourceFactory)
自定义数据源:实现DataSourceFactory接口.type指定为全类名-->
<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>
databaseIdProvider (数据库厂商标识)
<!--
databaseIdProvider:数据库厂商标识,支持多数据库厂商;
type="DB_VENDOR":VendorDatabaseIdProvider
作用就是得到数据库厂商的标识(驱动getDatabaseProductName()),
mybatis就能根据数据库厂商标识来执行不同的sql;
MySQL,Oracle,SQL Server,xxxx
-->
<databaseIdProvider type="DB_VENDOR">
<!--为不同的数据库厂商起别名-->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
在sql映射文件中使用databaseId属性来指定数据库厂商
<select id="getEmpById" resultType="emp" databaseId="mysql">
select * from tbl_employee where id = #{id}
</select>
<select id="getEmpById" resultType="emp" databaseId="oracle">
select * from tbl_employee where id = #{id}
</select>
mappers(sql映射注册)
<!--
mappers:将sql映射注册到全局配置中
-->
<mappers>
<!--
mapper:注册一个sql映射
注册配置文件
resource:引用类路径下的sql映射文件
mybatis/mapper/EmployeeMapper.xml
url:引用网络路径或者磁盘路径下的sql映射文件
file:///var/mappers/EmployeeMapper.xml
注册接口
class:引用(注册)接口
1、有sql映射文件,映射文件名必须和接口同名,并且放在同一目录下;
2、没有sql映射文件,所有的sql都是利用注解写在接口上;@Select等
推荐:比较重要的,复杂的Dao接口使用sql映射文件
不重要的,简单的Dao接口使用注解
注意:同一个Dao接口不能同时使用注解和映射文件的方式,
但是同一个项目中不同的Dao接口可以同时使用注解和映射文件的方式
-->
<!--<mapper url="file:///var/mappers/EmployeeMapper.xml"/>-->
<mapper resource="mybatis/mapper/EmployeeMapper.xml"/>
<mapper class="com.szm.mybatis.dao.EmployeeMapperAnnotation"/>
<!--
package:批量注册
name:指定包名(为当前包以及下面所有的后代包的每一个接口都进行注册)
1、有sql映射文件,映射文件名必须和接口同名,并且放在同一目录下;
2、没有sql映射文件,所有的sql都是利用注解写在接口上;
-->
<!--<package name="com.szm.mybatis.dao"/>-->
</mappers>
所有的sql都是利用注解写在接口上代码实例:
public interface EmployeeMapperAnnotation {
@Select("select * from tbl_employee where id = #{id}")
Employee getEmpById(Integer id);
}
以上标签在xml文件中有顺序要求
- properties,
- settings,
- typeAliases,
- typeHandlers,
- objectFactory,
- objectWrapperFactory,
- reflectorFactory,
- plugins,
- environments,
- databaseIdProvider,
- mappers
可以缺少某个标签,但是顺序不能打乱