typehandles(类型处理器)
MyBatis 在设置预处理SQL语句(PreparedStatement)中所需要的 参数 或从 结果集 ResultSet 中获取对象时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。
类型处理器,主要用于处理 Java 类型与 JDBC 类型的映射匹配关系处理,下表描述了一些默认的类型处理器。
- 类型处理器 BooleanTypeHandler
- Java 类型:java.lang.Boolean, boolean
- JDBC 类型:数据库兼容的 BOOLEAN
- 类型处理器 ByteTypeHandler
- Java 类型:java.lang.Byte, byte
- JDBC 类型:数据库兼容的 NUMERIC 或 BYTE
- 类型处理器 ShortTypeHandler
- Java 类型:java.lang.Short, short
- JDBC 类型:数据库兼容的 NUMERIC 或 SMALLINT
- 类型处理器 IntegerTypeHandler
- Java 类型:java.lang.Integer, int
- JDBC 类型:数据库兼容的 NUMERIC 或 INTEGER
- 类型处理器 LongTypeHandler
- Java 类型:java.lang.Long, long
- JDBC 类型:数据库兼容的 NUMERIC 或 BIGINT
- 类型处理器 FloatTypeHandler
- Java 类型:java.lang.Float, float
- JDBC 类型:数据库兼容的 NUMERIC 或 FLOAT
- 类型处理器 DoubleTypeHandler
- Java 类型:java.lang.Double, double
- JDBC 类型:数据库兼容的 NUMERIC 或 DOUBLE
- 类型处理器 BigDecimalTypeHandler
- Java 类型:java.math.BigDecimal
- JDBC 类型:数据库兼容的 NUMERIC 或 DECIMAL
- 类型处理器 StringTypeHandler
- Java 类型:java.lang.String
- JDBC 类型:CHAR, VARCHAR
- 类型处理器 ClobReaderTypeHandler
- Java 类型:java.io.Reader
- JDBC 类型:-
- 类型处理器 ClobTypeHandler
- Java 类型:java.lang.String
- JDBC 类型:CLOB, LONGVARCHAR
- 类型处理器 NStringTypeHandler
- Java 类型:java.lang.String
- JDBC 类型:NVARCHAR, NCHAR
- 类型处理器 NClobTypeHandler
- Java 类型:java.lang.String
- JDBC 类型:NCLOB
- 类型处理器 BlobInputStreamTypeHandler
- Java 类型:java.io.InputStream
- JDBC 类型:-
- 类型处理器 ByteArrayTypeHandler
- Java 类型:byte[]
- JDBC 类型:数据库兼容的字节流类型
- 类型处理器 BlobTypeHandler
- Java 类型:byte[]
- JDBC 类型:BLOB, LONGVARBINARY
- 类型处理器 DateTypeHandler
- Java 类型:java.util.Date
- JDBC 类型:TIMESTAMP
- 类型处理器 DateOnlyTypeHandler
- Java 类型:java.util.Date
- JDBC 类型:DATE
- 类型处理器 TimeOnlyTypeHandler
- Java 类型:java.util.Date
- JDBC 类型:TIME
- 类型处理器 SqlTimestampTypeHandler
- Java 类型:java.sql.Timestamp
- JDBC 类型:TIMESTAMP
- 类型处理器 SqlDateTypeHandler
- Java 类型:java.sql.Date
- JDBC 类型:DATE
- 类型处理器 SqlTimeTypeHandler
- Java 类型:java.sql.Time
- JDBC 类型:TIME
- 类型处理器 ObjectTypeHandler
- Java 类型:Any
- JDBC 类型:OTHER 或未指定类型
- 类型处理器 EnumTypeHandler
- Java 类型:Enumeration Type
- JDBC 类型:VARCHAR 或任何兼容的字符串类型,用来存储枚举的名称(而不是索引序数值)
- 类型处理器 EnumOrdinalTypeHandler
- Java 类型:Enumeration Type
- JDBC 类型:任何兼容的 NUMERIC 或 DOUBLE 类型,用来存储枚举的序数值(而不是名称)。
- 类型处理器 SqlxmlTypeHandler
- Java 类型:java.lang.String
- JDBC 类型:SQLXML
- 类型处理器 InstantTypeHandler
- Java 类型:java.time.Instant
- JDBC 类型:TIMESTAMP
- 类型处理器 LocalDateTimeTypeHandler
- Java 类型:java.time.LocalDateTime
- JDBC 类型:TIMESTAMP
- 类型处理器 LocalDateTypeHandler
- Java 类型:java.time.LocalDate
- JDBC 类型:DATE
- 类型处理器 LocalTimeTypeHandler
- Java 类型:java.time.LocalTime
- JDBC 类型:TIME
- 类型处理器 OffsetDateTimeTypeHandler
- Java 类型:java.time.OffsetDateTime
- JDBC 类型:TIMESTAMP
- 类型处理器 OffsetTimeTypeHandler
- Java 类型:java.time.OffsetTime
- JDBC 类型:TIME
- 类型处理器 ZonedDateTimeTypeHandler
- Java 类型:java.time.ZonedDateTime
- JDBC 类型:TIMESTAMP
- 类型处理器 YearTypeHandler
- Java 类型:java.time.Year
- JDBC 类型:INTEGER
- 类型处理器 MonthTypeHandler
- Java 类型:java.time.Month
- JDBC 类型:INTEGER
- 类型处理器 YearMonthTypeHandler
- Java 类型:java.time.YearMonth
- JDBC 类型:VARCHAR 或 LONGVARCHAR
- 类型处理器 JapaneseDateTypeHandler
- Java 类型:java.time.chrono.JapaneseDate
- JDBC 类型:DATE
自定义类型处理器:
首先需要继承baseTypehandler或实现typehandler接口。
具体实现如下,先自定义类型处理器类 MyExampleTypeHandler :
// MyExampleTypeHandler.java
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyExampleTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter);
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getString(columnName);
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getString(columnIndex);
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getString(columnIndex);
}
}
自定义类已设定:JdbcType.VARCHAR 与 String 类做映射转换(注解和泛型已体现)。
其次,在核心配置文件中设置类型处理器:
<!-- mybatis-config.xml -->
<typeHandlers>
<typeHandler handler="org.mybatis.example.MyExampleTypeHandler"/>
</typeHandlers>
或者不使用注解方式的话,取消 @MappedJdbcTypes(JdbcType.VARCHAR) 注解,直接在 xml 配置中指定 jdbcType 与 javaType 映射 :
<!-- mybatis-config.xml -->
<typeHandlers>
<typeHandler jdbcType="VARCHAR" javaType="string" handler="org.mybatis.example.MyExampleTypeHandler"/>
</typeHandlers>
这里,自定义类型处理器将会覆盖已有的处理 Java String 类型的属性以及 VARCHAR 类型的参数和结果的类型处理器,基本以上步骤就已经自定了 JdbcType.VARCHAR 与 String类做映射转换。
某个时候只希望自定义的类型处理器只用在某一个类中或某一个类的一个字段,其它都用默认的转换,这时候这样做。我们只需要把以上两步都去掉,在自定义类型处理类的注解@javaType和@MappedJdbcTypes都移除,配置文件中把 typehandler 属性配置移除,直接在映射文件中编写:
<resultMap id="MyResultMap" type="com.panshenlian.pojo.User">
<!-- id为int类型,但是没指定自定义类型处理器,不受影响-->
<id column="id" property="id" />
<!-- username为String类型,但是没指定自定义类型处理器,不受影响-->
<id column="username" property="username" />
<!-- password为String类型,但是没指定自定义类型处理器,不受影响-->
<id column="password" property="password" />
<!-- birthday为String类型,指定自定义类型处理器,受影响!-->
<id column="birthday" property="birthday" typeHandler="com.panshenlian.typeHandler.MyStringHandler"/>
</resultMap>
<select id="findAll" resultType="com.panshenlian.pojo.User" resultMap="MyResultMap">
select * from User
</select>