mybatis全局配置文件
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) |
驼峰命名配置演示
|
|
- 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 接口,并指定想要拦截的方法签名即可。
|
|
|
|
上面的插件将会拦截在 Executor 实例中所有的 “update” 方法调用, 这里的 Executor 是负责执行底层映射语句的内部对象。
提示 覆盖配置类
除了用插件来修改 MyBatis 核心行为以外,还可以通过完全覆盖配置类来达到目的。只需继承配置类后覆盖其中的某个方法,再把它传递到 SqlSessionFactoryBuilder.build(myConfig) 方法即可。再次重申,这可能会极大影响 MyBatis 的行为,务请慎之又慎。
environments
mybatis可以配置多种环境,default指定使用某种环境。可以达到快速切换环境的目的
environment:配置某个具体的环境信息;必须有下面两个标签;id代表当前环境的唯一标识
|
|
-
transactionManager 事务管理器
- type: 事务管理器的类型,有JDBC(JdbcTransactionFactory) | MANAGED(ManagedTransactionFactory); 自定义事务管理器:实现TransactionFactory接口,type指定为全类名
-
dataSource 数据源
- type:数据源类型;
UNPOOLED(UnpooledDataSourceFactory)|POOLED(PooledDataSourceFactory)|JNDI(JndiDataSourceFactory)
自定义数据源:实现DataSourceFactory接口,type指定为全类名,比如在getDataSource()方法返回c3p0数据源就达到了自定义数据源的目的。
databaseIdProvider
不常用,了解就好
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId
属性(数据库驱动getDatabaseProductName())。 MyBatis 会加载带有匹配当前数据库 databaseId
属性和所有不带 databaseId
属性的语句。 如果同时找到带有 databaseId
和不带 databaseId
的相同语句,则后者会被舍弃。 为支持多厂商特性,只要像下面这样在 mybatis-config.xml 文件中加入 databaseIdProvider
即可:
|
|
databaseIdProvider 对应的 DB_VENDOR 实现会将 databaseId 设置为 DatabaseMetaData#getDatabaseProductName()
返回的字符串。 由于通常情况下这些字符串都非常长,而且相同产品的不同版本会返回不同的值,你可能想通过设置属性别名来使其变短:
|
|
配置好了别名后在sql映射文件中配置数据厂商别名即可
|
|
上面这个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文件夹下是两个目录
objectFactory
每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。 如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。
一般使用时不会改这个配置,了解即可。