以下是 MyBatis 中 内置的 JDBC 类型与 Java 类型的默认映射关系,涵盖所有官方支持的 TypeHandler。
一、MyBatis 内置的 TypeHandler 映射表
| JDBC 类型 | Java 类型 | 说明 |
|---|---|---|
ARRAY | java.sql.Array | 数据库数组类型 → Java Array 对象 |
BIT | Boolean | 数据库的 BIT 类型 → Java Boolean |
TINYINT | Integer | 1字节整数 → Java Integer |
SMALLINT | Integer | 2字节整数 → Java Integer |
INTEGER | Integer | 4字节整数 → Java Integer |
BIGINT | Long | 8字节整数 → Java Long |
FLOAT | Float | 单精度浮点数 → Java Float |
REAL | Float | 同 FLOAT |
DOUBLE | Double | 双精度浮点数 → Java Double |
DECIMAL | BigDecimal | 高精度小数 → Java BigDecimal |
NUMERIC | BigDecimal | 同 DECIMAL |
CHAR | String | 定长字符串 → Java String |
VARCHAR | String | 变长字符串 → Java String |
LONGVARCHAR | String | 长文本 → Java String |
NCHAR | String | Unicode 定长字符串 → Java String |
NVARCHAR | String | Unicode 变长字符串 → Java String |
LONGNVARCHAR | String | Unicode 长文本 → Java String |
BOOLEAN | Boolean | 布尔值 → Java Boolean |
DATE | java.util.Date java.sql.Date | 日期 → java.util.Date 或 java.sql.Date(取决于配置) |
TIME | java.sql.Time | 时间 → java.sql.Time |
TIMESTAMP | java.sql.Timestamp | 时间戳 → java.sql.Timestamp |
CLOB | java.sql.Clob | 大文本 → Clob 对象 |
BLOB | byte[] java.sql.Blob | 二进制数据 → 字节数组或 Blob 对象(取决于配置) |
BINARY | byte[] | 定长二进制 → 字节数组 |
VARBINARY | byte[] | 变长二进制 → 字节数组 |
LONGVARBINARY | byte[] | 长二进制 → 字节数组 |
NULL | null | 数据库 NULL → Java null |
OTHER | Object | 未明确定义的类型 → Java Object |
CURSOR | ResultSet | 数据库游标 → ResultSet(用于存储过程) |
二、特殊类型映射
1. 枚举类型
-
默认行为:MyBatis 默认将枚举的
name()存储为VARCHAR类型。 -
自定义映射:若需存储枚举的
ordinal()(序号)或其他字段,需实现TypeHandler。// 示例:将枚举存储为序号 public class EnumOrdinalTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> { private final Class<E> type; public EnumOrdinalTypeHandler(Class<E> type) { this.type = type; } @Override public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) { ps.setInt(i, parameter.ordinal()); } // 其他方法实现(略) }
2. 集合类型
-
List/Array:通过
<foreach>标签动态生成IN查询。<select id="selectUsersByIds" resultType="User"> SELECT * FROM user WHERE id IN <foreach item="id" collection="ids" open="(" separator="," close=")"> #{id} </foreach> </select>
三、隐式类型转换
MyBatis 支持以下 隐式类型转换(无需配置):
| Java 类型 | 可转换的 JDBC 类型 |
|---|---|
String | CHAR, VARCHAR, LONGVARCHAR, CLOB |
Integer | INTEGER, SMALLINT, TINYINT |
Long | BIGINT |
Double | DOUBLE, FLOAT |
BigDecimal | DECIMAL, NUMERIC |
Boolean | BIT, BOOLEAN |
四、自定义类型映射
1. 实现 TypeHandler 接口
public class JsonTypeHandler<T> extends BaseTypeHandler<T> {
private final Class<T> type;
public JsonTypeHandler(Class<T> type) {
this.type = type;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) {
ps.setString(i, JSON.toJSONString(parameter));
}
@Override
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
return JSON.parseObject(rs.getString(columnName), type);
}
// 其他方法实现(略)
}
2. 注册自定义 TypeHandler
-
全局注册(
mybatis-config.xml):<typeHandlers> <typeHandler handler="com.example.JsonTypeHandler" javaType="com.example.DataModel"/> </typeHandlers> -
局部指定(Mapper XML):
<resultMap id="dataMap" type="DataModel"> <result property="metadata" column="metadata" typeHandler="com.example.JsonTypeHandler"/> </resultMap>
五、总结
-
默认覆盖范围:MyBatis 内置了所有基础类型和常见 JDBC 类型的映射。
-
隐式转换:支持数值、字符串等类型的自动转换。
-
扩展性:通过自定义
TypeHandler可处理复杂类型(如枚举、JSON、自定义对象)。 -
常见问题:
- 类型不匹配:检查
jdbcType和javaType是否正确定义。 - 枚举存储:默认存储
name(),需自定义实现存储序号或其他字段。
- 类型不匹配:检查
完整官方文档参考:MyBatis TypeHandlers