🙊🙊作者主页:🔗求不脱发的博客
📔📔 精选专栏:🔗SSM直击大厂
📋📋 精彩摘要:MyBatis 核心配置文件(xxxConfig.xml),该文件配置了MyBatis的一些全局信息,,包含数据库连接信息和MyBatis运行时所需的各种特性,以及设置和响应MyBatis行为的一些属性。本文将深入浅出的介绍MyBatis核心配置文件中常用的标签配置。
💞💞觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论💬支持博主🤞
📚目录
📖MyBatis 核心配置文件深入浅出
1️⃣层级关系
- configguration 配置
- properties 属性
- settings 设置
- typeAliases 类型别名
- typeHandlers 类型处理器
- objectFactory 对象工厂
- plugins 插件
- environments 环境
- environment 环境变量
- transactionManager 事务管理器
- dataSource数据源
- environment 环境变量
- databaseIdProvider 数据库厂商标识
- mappers 映射器
2️⃣environments 环境标签
事务管理器(transactionManager)类型有两种:
事务管理器(transactionManager) | |
JDBC: | 直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。 |
MANAGED: | 它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置 为 false 来阻止它默认的关闭行为。 |
数据源(dataSource)类型有三种:
数据源(dataSource) | |
UNPOOLED: | 这个数据源的实现只是每次被请求时打开和关闭连接。 |
POOLED: | 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。 |
JNDI: | 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置 一个 JNDI 上下文的引用 |
📝3️⃣mapper 映射标签
该标签用于加载映射,加载方式有如下几种:
加载方式 | 例: |
使用相对于类路径资源引用(常用) | <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> |
使用完全限定资源定位符(URL) | <mapper url="file:///var/mappers/AuthorMapper.xml"/> |
使用映射器接口实现类完全限定类名 | <mapper class="org.mybatis.builder.AuthorMapper"/> |
包内映射器接口实现全部注册映射器 | <package name="org.mybatis.builder"/> |
4️⃣Properties 配置文件标签
实际开发中,习惯将数据源的配置信息单独抽取成一个properties文件,该标签可以加载额外配置的properties文件。
<!--1、加载数据库相关配置文件db.properties-->
<properties resource="db.properties"/>
<!--2、配置数据源环境-->
<environments default="mybatis">
<environment id="mybatis">
<transactionManager type="JDBC"></transactionManager>
<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>
5️⃣typeAliases 定义别名标签
User全限定名:com.mybatis.domain.User
使用typeAliases标签定义别名
<!--定义别名-->
<typeAliases>
<typeAlias type="com.mybatis.domain.User" alias="user"/>
</typeAliases>
上面我们是自定义的别名,mybatis框架已经为我们设置好的一些常用的类型的别名
别名 | 数据类型 |
string | String |
long | Long |
int | Integer |
double | Double |
boolean | Boolean |
... | ... |
📝6️⃣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 |
ClobTypeHandler | java.lang.String | CLOB, LONGVARCHAR |
NStringTypeHandler | java.lang.String | NVARCHAR, NCHAR |
NClobTypeHandler | java.lang.String | NCLOB |
ByteArrayTypeHandler | byte[] | 数据库兼容的字节流类型 |
BlobTypeHandler | byte[] | BLOB, LONGVARBINARY |
DateTypeHandler | java.util.Date | TIMESTAMP |
DateOnlyTypeHandler | java.util.Date | DATE |
TimeOnlyTypeHandler | java.util.Date | TIME |
SqlTimestampTypeHandler | java.sql.Timestamp | TIMESTAMP |
SqlDateTypeHandler | java.sql.Date | DATE |
SqlTimeTypeHandler | java.sql.Time | TIME |
ObjectTypeHandler | Any | OTHER 或未指定类型 |
EnumTypeHandler | Enumeration Type | VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引) |
EnumOrdinalTypeHandler | Enumeration Type | 任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(而不是名称)。 |
可以重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型。
具体的做法为:
- 实现org.apache.ibatis.type.TypeHandler接口,或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler,
- 然后可以选择性地将它映射到一个JDBC类型。
例如需求:
一个Java中的Date数据类型,我想将之存到数据库的时候存成一个1970年至今的毫秒数,取出来时转换成java的Date,即java的Date与数据库的varchar毫秒值之间转换。
开发步骤:
① 定义转换类继承类BaseTypeHandler<T>
② 覆盖4个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult 为查询时 mysql的字符串类型转换成 java的Type类型的方法
public class MyDateTypeHandler extends BaseTypeHandler<Date> {
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType type) {
preparedStatement.setString(i, date.getTime() + "");
}
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
return new Date(resultSet.getLong(s));
}
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
return new Date(resultSet.getLong(i));
}
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return callableStatement.getDate(i);
}
}
③ 在MyBatis核心配置文件中进行注册
<!--注册类型自定义转换器-->
<typeHandlers>
<typeHandler handler="com.mybatis.typeHandlers.MyDateTypeHandler"></typeHandler>
</typeHandlers>
④ 直接使用即可
7️⃣plugins 第三方插件标签
MyBatis 可以使用第三方的插件来对功能进行扩展。
例如分页助手 PageHelper 是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据。
开发步骤:
- 在 pom.xml 导入通用PageHelper的坐标
<!-- 分页助手 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>3.7.5</version> </dependency> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>0.9.1</version> </dependency>
- 在mybatis核心配置文件中配置PageHelper插件
<!-- 注意:分页助手的插件 配置在mapper之前 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <!-- 指定方言 --> <property name="dialect" value="mysql"/> </plugin>
- PageHelper相关API
PageHelper.
startPage
(
int pagenum
,
int pagesize
);
|
设置分页参数,当前页,当前页展示的条数
|
pageInfo.getTotal()
| 总条数 |
pageInfo.getPages()
| 总页数 |
pageInfo.getPageNum()
| 当前页 |
pageInfo.getPageSize())
| 当前页展示的条数 |
pageInfo.isIsFirstPage()
| 当前页是否为第一页 |
pageInfo.isIsLastPage()
| 当前页是否为最后一页 |
8️⃣本章小结
MyBatis核心配置文件常用标签: