全局配置文件的元素顺序:
properties, settings, typeAliases, typeHandlers, objectFactory, objectWrapperFactory, reflectorFactory, plugins, environments, databaseIdProvider, mappers
1. properties属性
properties属性可以给系统配置一些运行参数,可以放在XML文件或者properties文件中。
在上一次学习笔记中,我们是将MySQL数据库的一些信息直接写在全局配置文件中,下面我们将这些数据库的一些信息抽取出来。
首先编写properties文件dbconfig.properties:
1 | ## MySQL数据库配置 |
全局配置文件mybatis-config.xml的部分内容如下:
注意:properties元素的resource用于引入properties文件;url则用于引入网络路径或磁盘路径下的文件。
2. settings设置
settings是MyBatis中最复杂的配置,它能深刻影响MyBatis底层的运行,但是在大部分情况下使用默认便可以运行,所以在大部分情况下不需要大量配置它,值需要修改一下一些常用的规则即可,比如自动映射、驼峰命名映射、级联规则、是否启动缓存和执行器类型等。以下是一些配置项说明:
在上一篇笔记中,在编写POJO类Employee类的lastName属性时命名与数据库表的字段last_name不同而造成在查询所有时lastName属性为空。下面通过在全局配置文件中使用settings的mapUnderscoreToCamelCase配置项来处理这个问题。
其中name为配置项名称,value为对应的值。
3. typeAliases别名
由于类的全限定名称很长,需要大量使用的时候,总写那么长的名称不方便。比如在如下的映射文件中,全限定名称是比较长的。
在MyBatis中允许定义一个简写来代表这个类,这就是别名。注意,在MyBatis中别名是不去等大小写的。
3.1 自定义别名
3.1.1 单个起别名
比如,我需要为上方的com.atgui.mubatis.bean.Employee类起个别名,可以采用如下操作。
1 | <!-- 设置自定义别名 --> |
也就是在Mybatis的全局配置文件mybatis-config.xml添加如上的配置语句。其中type的内容时需要起别名的类的全定限名。上面的配置默认其别名为Employee的小写,也就是employee。
进行如上配置后,在映射文件就可以进行如下编写了。
另外typeAlias还有一个alias属性,其内容为自定义别名。如下所示:
1 | <!-- 设置自定义别名 --> |
3.1.2 批量起别名
批量起别名即可以为当前包以及下面所有后带包的每一类都起一个默认别名(类名小写)。具体应用如下示:
name中的值为需要进行起别名的包名。
假设在该包及其子包内有相同的类,那么只使用package进行配置是不够的,因为这样会有出现别名冲突。这个时候可以使用MyBatis提供的注解@Alias(“emp”)来进行区分。如下示:
3.2 系统定义别名
系统定义别名为系统自定义号的别名,因此我们自定义的别名是不可以和这些系统定义别名相同的,它们都是大小写不敏感的。如下展示一些系统定义别名。
4. typeHandlers类型处理器简介
在JDBC中,需要在PreparedStatement对象中设置哪些已经预编译的SQL语句的参数。执行SQL后,会通过ResultSet对象获取得到数据库的数据,而这些MyBatis是根据数据的类型typeHandler来实现的。在typeHandler中,分为jdbcType和javaType,其中jdbcType用于定义数据库类型,而javaType用于定义Java类型,那么typeHandler的作用就是承担jdbcType和javaType之间的相互转换。具体的内容后续在讲。
5. plugins插件简介
插件是MyBatis中最强大和灵活的组件,同时也是最复杂和最难以使用的组件,因为它将覆盖MyBatis底层对象的核心方法和属性。后续讲了MyBatis的底层构成和运行机制后才能讲解这部分内容。
6. environments环境
表示运行环境,主要作用是配置数据库的信息,它可以配置多个数据库,不过一般而言只需要配置其中一个就可以了。
假设我使用MySQL数据进行开发,而测试人员则使用ORACLE数据库进行测试,那么我就可以定义如下两套环境来进行对应的操作。
environments标签中的default属性是用来指定使用某种环境的,比如上面的配置信息中的defafault的值是development说明使用的是MySQL数据库的环境。通过改变default的值可以快速的切换环境。
6.1 transactionManager事务管理器
在MyBatis中,transactionManager提供了两个实现类,它需要实现接口Transaction(org.apache.ibatis.transaction)。Transaction有两个实现类:JdbcTransaction和ManagerTransaction。于是它对应两种工厂:JdbcTransactionFactory和ManagerTransactionFactory,这两个工厂实现TransactionFactory接口,通过他们会生成对应的Transaction对象。因此事务管理器有如下两种方式:
1 | <transactionManager type="JDBC"/> |
- JDBC对应的类为JdbcTransaction,它是以JDBC的方式对数据库的提交和回滚进行操作。
- MANAGED对应的类为ManagedTransaction,它将事务交由容器处理。
另外可以通过实现TransactionFactory接口来自定义事务管理器。其中的type为全类名。
6.2 dataSource数据源
数据源类型主要有三种:UNPOOLED(UnpooledDataSourceFactory),POOLED(PooledDataSourceFactory)和JNDI(JndiDataSourceFactory)。
自定义数据源需要实现DataSourceFactory接口,其中type是全类名。
6.4 databaseIdProvider数据库提供商
databaseIdProvider的作用就是得到数据库厂商的标识(由驱动提供),mybatis就能根据数据库厂商的标识来执行不同的sql。tyep的为DB_VENDOR,对应的类为VendorDatabaseIdProvider。
下面来实现一下根据不同的数据库厂商来执行不同的代码
首先在全局配置文件做如下配置
1
2
3
4
5
6<!-- 配置数据库厂商标识 -->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="DB2" value="db2"/>
</databaseIdProvider>properties元素的属性name是数据库的名称,属性value是它的一个别名。
在映射文件作如下操作
就是添加一个databaseId属性,其中的值mysql即为之前在全局配置文件中的别名。添加这个属性之后,说明这个SQL语句对应的是MySQL数据库执行的。
6.5 mappers映射注册
这个标签就是用来引入映射器的。
用文件路径引入映射器,形如:
引用网络路径或磁盘路径下的SQL映射文件,形如:
1
<mapper uri="file:///var/mappers/AuthorMapper.xml"/>
引用注册接口,比如通过注解来实现的映射接口,形如:
其中使用注解注册的接口即为如下形式的接口:
对应的引入方式为:用包名引入映射器,形如:
注意:使用包名来实现批量映射器的引入,一般情况下需要将映射文件放在对应的包下,且映射器文件名与映射接口名必须相同,这可能也就是mybatis逆向工程自动生成接口和映射文件自动命名为*Mapper的原因。 如下示:
但是这样又会导致java文件和xml文件放在一个包下,容易混乱也不容易维护。我们可以使用如下的方法来解决这个问题,也就是在config下创建一个一样的包来存放EmployeeMapper.xml映射文件。如下所示:
因为源码文件夹下的文件都会合并在类路径下。