目录
1、简介
2、DTD
3、typeHandlers
3.1、默认类型处理器
3.2、自定义类型处理器
4、plugins
⭐MyBatis系列①:增删改查
⭐MyBatis系列②:两种Dao开发方式
⭐MyBatis系列③:动态SQL
1、简介
MyBatis的核心配置文件(通常命名为mybatis-config.xml)是配置MyBatis框架的重要文件之一。
它定义了全局性的设置,包括数据库连接信息、对象关系映射(ORM)设置、插件配置、类型处理器等。
文档声明:
这部分内容是用于声明MyBatis核心配置文件的文档类型定义(DOCTYPE)。它告诉XML解析器如何解释这个XML文件。内容解释如下:
- <!DOCTYPE configuration:这部分表示这是一个文档类型声明,指定了文档的类型为configuration,也就是MyBatis的核心配置文件。
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN":这是一个标识符,用于指定文档类型的公共标识符(Public Identifier)。在这里,-//mybatis.org//DTD Config 3.0//EN指定了MyBatis配置文件的版本和语言。
- "http://mybatis.org/dtd/mybatis-3-config.dtd":这是文档类型定义的系统标识符(System Identifier),它指定了DTD文件的位置。在这个例子中,它指向了MyBatis配置文件的DTD(Document Type Definition)文件的URL。
综合起来,这个文档类型声明告诉XML解析器如何解释这个XML文件,以及该XML文件遵循的DTD规范版本和位置。在这里,它指定了MyBatis核心配置文件的版本为3.0,并且使用MyBatis官方提供的DTD文件进行解析。
2、DTD
这段XML文件是一个DTD(Document Type Definition)文档,用于定义MyBatis的核心配置文件结构和元素的规范。这个DTD文件描述了MyBatis配置文件中可以使用的元素、属性以及它们之间的关系。
这个DTD文件中的注释和标签解释了各个元素的含义、属性和子元素。
元素 | 描述 |
configuration | 根元素,表示MyBatis的配置信息,包括数据库连接、映射器配置等。 |
databaseIdProvider | 数据库ID提供者元素,用于为不同数据库提供不同的配置。 |
properties | 属性元素,用于设置全局属性,可以从外部资源加载。 |
property | 属性元素,具有name和value属性,用于定义属性的名称和值。 |
settings | 设置元素,用于定义全局设置。 |
setting | 单个设置元素,具有name和value属性。 |
typeAliases | 类型别名元素,用于定义Java类的别名。 |
typeAlias | 类型别名元素,具有type和alias属性,用于定义类型别名。 |
typeHandlers | 类型处理器元素,用于自定义类型处理器。 |
typeHandler | 类型处理器元素,具有javaType、jdbcType和handler属性。 |
objectFactory | 对象工厂元素,用于自定义对象的创建方式。 |
objectWrapperFactory | 对象包装器工厂元素,用于自定义对象包装器。 |
reflectorFactory | 反射器工厂元素,用于自定义反射器。 |
plugins | 插件元素,用于添加插件拦截器。 |
plugin | 插件元素,具有interceptor属性,指定插件拦截器的类名。 |
environments | 数据库环境元素,用于定义事务管理器和数据源。 |
environment | 环境元素,具有id属性,用于定义一个数据库环境。 |
transactionManager | 事务管理器元素,用于定义事务管理器类型。 |
dataSource | 数据源元素,用于定义数据源类型。 |
mappers | 映射器元素,用于定义映射器配置。 |
mapper | 映射器元素,具有resource、url和class属性,用于定义映射器文件的位置。 |
package | 包元素,用于定义Java包。 |
这个DTD文件描述了MyBatis核心配置文件中可以使用的各种元素和属性,帮助开发者编写符合规范的配置文件。
3、typeHandlers
typeHandlers 是 MyBatis 配置文件中的一个元素,用于自定义处理数据库与 Java 类型之间的转换。
数据库和 Java 类型之间可能存在类型不匹配的情况,比如将数据库中的数字类型映射到 Java 中的枚举类型,或者处理日期时间的转换等。
typeHandlers 允许你编写自定义的类型处理器,以确保正确地在数据库与 Java 之间进行数据转换。
3.1、默认类型处理器
下表描述了一些默认的类型处理器:
类型处理器 | 对应的Java类型 | 对应的JDBC类型 |
BooleanTypeHandler | Boolean | 数据库兼容的BOOLEAN |
ByteTypeHandler | Byte | 数据库兼容的NUMERIC或BYTE |
ShortTypeHandler | Short | 数据库兼容的NUMERIC或SHORT INTEGER |
IntegerTypeHandler | Integer | 数据库兼容的NUMERIC或INTEGER |
LongTypeHandler | Long | 数据库兼容的NUMERIC或LONG INTEGER |
StringTypeHandler | String | VARCHAR, CHAR |
DateTypeHandler | Date | DATE, TIMESTAMP |
EnumTypeHandler | Enum | VARCHAR |
ArrayTypeHandler | Array | ARRAY |
MapTypeHandler | Map | MAP |
ObjectTypeHandler | Object | VARIOUS |
3.2、自定义类型处理器
可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。
具体做法为:
实现 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类型的方法
③ 在MyBatis核心配置文件中进行注册
④ 测试转换是否正确
下面是代码实现:
①编写转换类,继承BaseTypeHandler<T>,重写方法:
package com.xzl.handle;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
/**
* @author 逐梦苍穹
* @date 2023/8/24 23:30
* setNonNullParameter为java程序设置数据到数据库的回调方法
* getNullableResult为查询时 mysql的字符串类型转换成 java的Type类型的方法
* i 是一个整数,表示要设置的参数在 SQL 语句中的位置。
* s 表示数据库列名
*/
public class DateTypeHandle extends BaseTypeHandler<Date> {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
// 在预处理语句中设置非空参数
// 将 Date 类型的数据转换为 long 类型的时间戳,并以字符串形式设置到 PreparedStatement 中
preparedStatement.setString(i, date.getTime() + "");
}
@Override
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
// 从结果集中获取可空结果(根据列名)
// 将结果集中的 long 类型的时间戳转换为 Date 类型并返回
return new Date(resultSet.getLong(s));
}
@Override
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
// 从结果集中获取可空结果(根据列索引)
// 将结果集中的 long 类型的时间戳转换为 Date 类型并返回
return new Date(resultSet.getLong(i));
}
@Override
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
// 从存储过程的调用结果中获取可空结果
// 直接获取存储过程的 Date 类型数据并返回
return callableStatement.getDate(i);
}
}
②配置mybatis-config.xml
这一步配置要注意这个标签相对于其他标签的位置顺序,如果标签的相对位置不对,则会出现:
③数据库表单和实体类要新增:
④测试效果:
首先是测试存入时间戳到数据库中:
结果如下:
然后是测试将数据库中的时间毫秒值取出并且转换为正常的日期类对象:
结果如下:
4、plugins
MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据。
开发步骤:
① 导入通用PageHelper的坐标
<!-- 分页助手 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>3.7.5</version>
</dependency>
<!-- sql解析 -->
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>0.9.1</version>
</dependency>
② 在mybatis核心配置文件中配置PageHelper插件
③ 测试分页数据获取
关键代码:PageHelper.startPage(1,3); 表示当前在第一页、展现三条数据
如下:
获得分页相关的其他参数:
测试代码如下: