今天说说MyBatis的全局配置文件,用MyBatis就要熟悉配置文件,可以让我们更好的去掌握MyBatis。
一、MyBatis全局配置文件有哪些?
1)The MyBatis configuration contains settings and properties that have a dramatic effect on how MyBatis behaves.
MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息。
2)文件结构如下:
configuration 配置
properties 属性
typeAliases 类型命名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
databaseIdProvider 数据库厂商标识
mappers 映射器
二、详细说明
1、properties-属性
1)可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,亦可通过properties
元素的子元素来配置。
<properties>
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test_mybatis" />
<property name="username" value="root" />
<property name="password" value="1234" />
</properties>
2)然而properties
的作用并不单单是这样,你可以创建一个资源文件,名为jdbc.properties
的文件,将四个连接字符串的数据在资源文件中通过键值对[key=value]
的方式放置,不要任何符号,一条占一行。
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_1129
jdbc.username=root
jdbc.password=1234
<!--
properties: 引入外部的属性文件
resource: 从类路径下引入属性文件
url: 引入网络路径或者是磁盘路径下的属性文件
-->
<properties resource="db.properties" ></properties>
3)在environment
元素的dataSource
元素中为其动态设置。
<environments default="oracle">
<environment id="mysql">
<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>
2、setting设置
1)这是MyBatis中极为重要的调整设置,它们会改变MyBatis的运行时行为。
2)包含如下的setting设置:
<settings>
<!-- 该配置影响的所有映射器中配置的缓存的全局开关。默认值true -->
<setting name="cacheEnabled" value="true"/>
<!--延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。默认值false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 是否允许单一语句返回多结果集(需要兼容驱动)。 默认值true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。默认值true -->
<setting name="useColumnLabel" value="true"/>
<!-- 允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 默认值false -->
<setting name="useGeneratedKeys" value="false"/>
<!-- 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。 -->
<!-- 默认值PARTIAL -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<!-- 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。默认SIMPLE -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 设置超时时间,它决定驱动等待数据库响应的秒数。 -->
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<!-- 允许在嵌套语句中使用分页(RowBounds)默认值False -->
<setting name="safeRowBoundsEnabled" value="false"/>
<!-- 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 默认false -->
<setting name="mapUnderscoreToCamelCase" value="false"/>
<!-- MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。
默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。
若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 -->
<setting name="jdbcTypeForNull" value="OTHER"/>
<!-- 指定哪个对象的方法触发一次延迟加载。 -->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
3、别名处理
1)类型别名是为Java类型设置一个短的名字,可以方便我们引用某个类。
<typeAliases>
<typeAlias type="com.mybatis.beans.Employee" alias="emp">
</typeAliases>
2)类很多的情况下,可以批量设置别名这个包下的每一个类创建一个默认的别名,就是简单类名小写。
<typeAliases>
<package name="com.mybatis.beans">
</typeAliases>
3)MyBatis已经取好的别名。
4、typeHandlers 类型处理器
1)无论是MyBatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成Java类型。
2)MyBatis中提供的类型处理器:
3)日期和时间的处理,JDK1.8以前一直是个头疼的问题。我们通常使用JSR310规范领导者Stephen Colebourne创建的Joda-Time来操作。1.8已经实现全部的JSR310规范了。
4)日期时间处理上,我们可以使用MyBatis基于JSR310(Date and Time API)编写的各种日期时间类型处理器。
5)MyBatis3.4以前的版本需要我们手动注册这些处理器,以后的版本都是自动注册的,如需注册,需要下载mybatistypehandlers-jsr310,并通过如下方式注册:
6)自定义类型转换器
① 我们可以重写类型处理器或创建自己类型处理器来处理不支持的或非标准的类型。
② 步骤:
- 实现org.apache.ibatis.type.TypeHandler接口或者继承org.apache.ibatis.type.BaseTypeHandler
- 指定其映射某个JDBC类型(可选操作)
- 在mybatis全局配置文件中注册
5、plugins插件机制
1)插件是MyBatis提供的一个非常强大的机制,可以通过插件来修改MyBatis的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行。
2)四大对象
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
mybatis的插件机制很重要的,后面会再说到的。
6、environments 环境配置
1)MyBatis可以配置多种环境,比如开发、测试和生产环境需要有不同的配置。
2)每种环境使用一个environment
标签进行配置并指定唯一标识符。
3)可以通过environment
标签中的default属性指定一个环境的标识符来快速的切换环境。
4)environment
-指定具体环境。
id:指定当前环境的唯一标识
transactionManager和dataSource都必须有
<environments default="oracle">
<environment id="mysql">
<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>
<environment id="oracle">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${orcl.driver}" />
<property name="url" value="${orcl.url}" />
<property name="username" value="${orcl.username}" />
<property name="password" value="${orcl.password}" />
</dataSource>
</environment>
</environments>
5)transactionManager
type: JDBC|MANAGED|自定义
JDBC
:使用了 JDBC 的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围。JdbcTransactionFactory
MANAGED
:不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如 JEE应用服务器的上下文)。ManagedTransactionFactory
- 自定义:实现
TransactionFactory
接口,type=全类名/别名.
6)dataSource
type: UNPOOLED|POOLED|JNDI|自定义
UNPOOLED
:不使用连接池,UnpooledDataSourceFactory
POOLED
:使用连接池,PooledDataSourceFactory
JNDI
: 在EJB 或应用服务器这类容器中查找指定的数据源- 自定义:实现
DataSourceFactory
接口,定义数据源的获取方式。
7)实际开发中我们使用Spring管理数据源,并进行事务控制的配置来覆盖上述配置。
7、databaseIdProvider 数据库厂商标识
1)MyBatis 可以根据不同的数据库厂商执行不同的语句
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
2)Type: DB_VENDOR
, 使用MyBatis提供的VendorDatabaseIdProvider
解析数据库厂商标识。也可以实现DatabaseIdProvider
接口来自定义。会通过 DatabaseMetaData#getDatabaseProductName()
返回的字符串进行设置。由于通常情况下这个字符串都非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其变短.
Property-name
:数据库厂商标识。Property-value
:为标识起一个别名,方便SQL语句使用databaseId属性引用。
3)配置了databaseIdProvider
后,在SQL映射文件中的增删改查标签中使用databaseId
来指定数据库标识的别名。
<select id="getEmployeeById"
resultType="com.mybatis.beans.Employee"
databaseId="mysql">
select * from tbl_employee where id = #{id}
</select>
4)MyBatis匹配规则如下:
① 如果没有配置databaseIdProvider
标签,那么databaseId=null
② 如果配置了databaseIdProvider
标签,使用标签配置的name去匹配数据库信息,匹配上设置databaseId=配置指定的值,否则依旧为null
③ 如果databaseId
不为null,他只会找到配置databaseId的sql语句
④ MyBatis 会加载不带 databaseId
属性和带有匹配当前数据库databaseId
属性的所有语句。如果同时找到带有databaseId
和不带databaseId
的相同语句,则后者会被舍弃。
8、mappers 映射器
1)作用:用来在mybatis初始化的时候,告诉mybatis需要引入那些Mapper映射文件。
2)mapper逐个注册SQL映射文件。
- resource : 引入类路径下的文件 。
- url : 引入网络路径或者是磁盘路径下的文件。
- class : 引入Mapper接口。
有SQL映射文件 , 要求Mapper接口与 SQL映射文件同名同位置.。
没有SQL映射文件 , 使用注解在接口的方法上写SQL语句。
<mappers>
<mapper resource="EmployeeMapper.xml" />
<mapper class="com.mybatis.dao.EmployeeMapper"/>
<package name="com.mybatis.dao"/>
</mappers>
3)使用批量注册,这种方式要求SQL映射文件名必须和接口名相同并且在同一目录。
<mappers>
<package name="com.mybatis.dao"/>
</mappers>
关于MyBatis中关于全局配置的内容就说到这里了,有问题及时交流。