1 properties属性
1) 可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来配置
<properties>
<property name="username" value="name"/>
<property name="password" value="123456"/>
</properties>
2) 然而properties的作用并不单单是这样,你可以创建一个资源文件,名为jdbc.properties的文件,将四个连接字符串的数据在资源文件中通过键值 对(key=value)的方式放置,不要任何符号,一条占一行
a) jdbc.properties
jdbc.username=root
jdbc.password=root
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.driver=com.mysql.cj.jdbc.Driver
b) 通过properties标签引入jdbc.properties文件
<properties resource="jdbc.properties"></properties>
c) 在environment元素的dataSource元素中为其动态设置
<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>
3) 如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:
a) 首先读取在 properties 元素体内指定的属性。
b) 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
c) 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。
2 settings设置
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项常见设置的含义、默认值等
3 typeAliases 别名处理
- 通过子标签typeAlias设置别名
<typeAliases>
<!--
子标签typeAlias:用来给某些类指定别名
type属性:指定起别名的类的全类名
alias属性:指定别名,如果没有指定则是类命的首字母小写,但是别名大小写不敏感
-->
<typeAlias type="com.atguigu.mybatis.entities.Employee" alias="employee"></typeAlias>
</typeAliases>
- 通过子标签package设置别名
<typeAliases>
<!--
子标签package:通过指定包名给包下所有的类起别名
name属性:指定包名
-->
<package name="com.atguigu.mybatis.entities"/>
</typeAliases>
4 typeHandlers 类型处理器
- 无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型
- MyBatis中提供的类型处理器:
- 日期和时间的处理,JDK1.8以前一直是个头疼的问题。我们通常使用JSR310规范领导者Stephen Colebourne创建的Joda-Time来操作。1.8已经实现全部的JSR310规范了
- 日期时间处理上,我们可以使用MyBatis基于JSR310(Date and Time API)编写的各种日期时间类型处理器。
- 自定义类型转换器
① 我们可以重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类 型
② 步骤
实现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)
6 environments 环境配置
- MyBatis可以配置多种环境,比如开发、测试和生产环境需要有不同的配置
- 每种环境使用一个environment标签进行配置并通过id属性指定唯一标识符
- 可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境
- environment-指定具体环境
a) id:指定当前环境的唯一标识
b) transactionManager和dataSource都必须有
<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>
<!--生产环境-->
<environment id="online">
<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>
- transactionManager
type: JDBC | MANAGED | 自定义
JDBC:使用了 JDBC 的提交和回滚设置,依赖于从数据源得到的连接来管理事务范 围。 JdbcTransactionFactory
MANAGED:不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 ManagedTransactionFactory
自定义:实现TransactionFactory接口,type=全类名/别名 - dataSource
type: UNPOOLED | POOLED | JNDI | 自定义
UNPOOLED:不使用连接池, UnpooledDataSourceFactory
POOLED:使用连接池, PooledDataSourceFactory
JNDI: 在EJB 或应用服务器这类容器中查找指定的数据源
自定义:实现DataSourceFactory接口,定义数据源的获取方式。 - 可以通过org.apache.ibatis.session. Configuration查询上述信息
7 databaseIdProvider数据库厂商标识
- MyBatis 可以根据不同的数据库厂商执行不同的语句
<!--设置数据库厂商标识-->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
- type: DB_VENDOR, 使用MyBatis提供的VendorDatabaseIdProvider解析数据库厂商标识。也可以实现DatabaseIdProvider接口来自定义。
VendorDatabaseIdProvider会通过 DatabaseMetaData#getDatabaseProductName() 返回的字符串进行设置。由于通常情况下这个字符串都非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其变短。
name:数据库厂商标识
value:为标识起一个别名,方便SQL语句使用databaseId属性引用 - 配置了databaseIdProvider后,在SQL映射文件中的增删改查标签中使用databaseId
来指定数据库标识的别名
<select id="getEmployeeById" resultType="employee" databaseId="mysql">
select id,last_name,email,salary,dept_id
from employees
where id = #{id}
</select>
- MyBatis匹配规则如下:
① 如果没有配置databaseIdProvider标签,那么databaseId=null
② 如果配置了databaseIdProvider标签,使用标签配置的name去匹配数据库信息,匹配上则设置databaseId=配置指定的值,否则依旧为null
③ 如果databaseId不为null,他只会找到配置databaseId的sql语句
④ MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库databaseId 属性的所有语句。如果同时找到带有 databaseId 和不带databaseId 的相同语句,则后者会被舍弃。
9 mappers 映射器
- 用来在mybatis初始化的时候,告诉mybatis需要引入哪些Mapper映射文件
- mapper标签:逐个注册SQL映射文件
a) resource属性:引入类路径下的文件
b) url 属性:引入网络路径或者是磁盘路径下的文件
c) class属性:设置Mapper接口的全类名
i. 如果有SQL映射文件,要求Mapper接口与 SQL映射文件同名同包。
ii. 如果没有SQL映射文件 ,使用注解在接口的方法上写SQL语句。
<mappers>
<mapper resource="com/mybatis/dao/EmployeeMapper.xml"/>
</mappers>
- package标签:批量注册SQL映射文件
a) name 属性:设置Mapper接口的全类名
i. 如果有SQL映射文件 ,要求Mapper接口与 SQL映射文件同名同包。
ii. 如果没有SQL映射文件,使用注解在接口的方法上写SQL语句。
<mappers>
<package name="com.mybatis.dao"/>
</mappers>
全局配置文件(完整):
<?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.properties标签-->
<!--
resource属性:引入类路径下的属性文件
url属性:引入网络或磁盘路径下的属性文件
-->
<properties resource="jdbc.properties">
<property name="password" value="123456"/>
</properties>
<!-- 2.settings标签-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 3. typeAliases标签别名处理
1子标签typeAlias:用来给某些类指定别名
type属性:指定起别名的类的全类名
alias属性:指定别名,如果没有指定则是类命的首字母小写,但是别名大小写不敏感
-->
<typeAliases>
<typeAlias type="com.mybatis.entities.Employee" alias="employee"></typeAlias>
<!-- 2) 通过子标签package设置别名
子标签package:通过指定包名给包下所有的类起别名
name属性:指定包名
-->
<!-- <package name="com.mybatis.entities.Employee" />-->
</typeAliases>
<!-- 4.typeHandlers 标签 类型处理器 -->
<!--<typeHandlers>-->
<!-- <typeHandler handler="配置类处理器的全类名"></typeHandler>-->
<!--</typeHandlers>-->
<!-- 5.plugins标签 配置插件-->
<!-- <plugins>
<plugin interceptor="配置插件对应的全类名"></plugin>
</plugins>-->
<!-- 6. environments标签 环境配置
environment-指定具体环境
id:指定当前环境的唯一标识
transactionManager和dataSource都必须有
-->
<environments default="development">
<!-- 开发环境-->
<environment id="development">
<transactionManager type="JDBC"/>
<!-- value值加载的顺序:
1.首先读取properties中property指定的值
2.如果外部属性文件的值(如果引入的外部属性文件中指定的key与第一步中一致,则覆盖第一步中的值)
3.最后如果都加载不到则使用当前property标签指定的${password}作为值
-->
<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>
<!--7. 设置数据库厂商标识
给不同数据库厂商指定别名
-->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
<!-- 8.mappers :注册Mapper映射文件(sql映射文件)-->
<mappers>
<!-- 子标签:mapper
resource属性:引入类路径下的文件
url 属性:引入网络路径或者是磁盘路径下的文件
class属性:设置Mapper接口的全类名
注意:使用class属性注册sql映射文件时,要求Mapper接口与 SQL映射文件同名同包。
如果没有SQL映射文件(EmployeeMapper.xml),使用注解在接口的方法上写SQL语句
-->
<!-- <mapper resource="com/mybatis/mapper/EmployeeMapper.xml"/>-->
<!-- <mapper class="com.mybatis.mapper.EmployeeMapper"></mapper>-->
<!-- package标签:批量注册SQL映射文件
name 属性:设置Mapper接口的全类名
如果有SQL映射文件 ,要求Mapper接口与 SQL映射文件同名同包。
如果没有SQL映射文件,使用注解在接口的方法上写SQL语句。-->
<package name="com.mybatis.mapper"/>
</mappers>
</configuration>