Mybatis类型转换介绍

1.介绍:

  建立TypeHandler来对特殊的javaType和jdbcType的转换

2.常用的类型转化:

 1 register(Boolean.class, new BooleanTypeHandler());  
 2 register(boolean.class, new BooleanTypeHandler());  
 3 register(Byte.class, new ByteTypeHandler());  
 4 register(byte.class, new ByteTypeHandler());  
 5 register(Short.class, new ShortTypeHandler());  
 6 register(short.class, new ShortTypeHandler());  
 7 register(Integer.class, new IntegerTypeHandler());  
 8 register(int.class, new IntegerTypeHandler());  
 9 register(Long.class, new LongTypeHandler());  
10 register(long.class, new LongTypeHandler());  
11 register(Float.class, new FloatTypeHandler());  
12 register(float.class, new FloatTypeHandler());  
13 register(Double.class, new DoubleTypeHandler());  
14 register(double.class, new DoubleTypeHandler());  
15 register(String.class, new StringTypeHandler());  
16 register(String.class, JdbcType.CHAR, new StringTypeHandler());  
17 register(String.class, JdbcType.CLOB, new ClobTypeHandler());  
18 register(String.class, JdbcType.VARCHAR, new StringTypeHandler());  
19 register(String.class, JdbcType.LONGVARCHAR, new ClobTypeHandler());  
20 register(String.class, JdbcType.NVARCHAR, new NStringTypeHandler());  
21 register(String.class, JdbcType.NCHAR, new NStringTypeHandler());  
22 register(String.class, JdbcType.NCLOB, new NClobTypeHandler());  
23 register(Object.class, JdbcType.ARRAY, new ArrayTypeHandler());  
24 register(BigInteger.class, new BigIntegerTypeHandler());  
25 register(BigDecimal.class, new BigDecimalTypeHandler());  
26 register(Byte[].class, new ByteObjectArrayTypeHandler());  
27 register(Byte[].class, JdbcType.BLOB, new BlobByteObjectArrayTypeHandler());  
28 register(Byte[].class, JdbcType.LONGVARBINARY, new BlobByteObjectArrayTypeHandler());  
29 register(byte[].class, new ByteArrayTypeHandler());  
30 register(byte[].class, JdbcType.BLOB, new BlobTypeHandler());  
31 register(byte[].class, JdbcType.LONGVARBINARY, new BlobTypeHandler());  
32 register(Object.class, UNKNOWN_TYPE_HANDLER);  
33 register(Object.class, JdbcType.OTHER, UNKNOWN_TYPE_HANDLER);  
34 register(Date.class, new DateTypeHandler());  
35 register(Date.class, JdbcType.DATE, new DateOnlyTypeHandler());  
36 register(Date.class, JdbcType.TIME, new TimeOnlyTypeHandler());  
37 register(java.sql.Date.class, new SqlDateTypeHandler());  
38 register(java.sql.Time.class, new SqlTimeTypeHandler());  
39 register(java.sql.Timestamp.class, new SqlTimestampTypeHandler());  
40 register(Character.class, new CharacterTypeHandler());  
41 register(char.class, new CharacterTypeHandler());  

3.实现

  3.1 实现TypeHandler接口或者继承BaseTypeHandler抽象类

  •   BaseTypeHandler主要是在TypeHandler接口的基础上,对数据进行判空处理,并且继承了抽象类TypeReference。
  •   TypeReference可以通过getRawType()方法可以获取到当前TypeHandler所使用泛型的原始类型

  3.2 简单介绍

    TypeHandler<T>接口 : 

      setParameter(PreparedStatement ps, int i, T parameter,JdbcType jdbcType)//实现对配置的javaType类型转换成jdbcType类型的处理

      getResult(ResultSet rs, String columnName)//以下三种方式对应 jdbcType类型转换成javaType类型的处理

      getResult(ResultSet rs, int columnIndex)

      getResult(CallableStatement cs, int columnIndex)

    BaseTypeHandler<T>抽象类:(推荐使用此种方式)

      setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType)//实现对配置的javaType类型转换成jdbcType类型的处理

      getNullableResult(ResultSet rs, String columnName)//以下三种方式对应 jdbcType类型转换成javaType类型的处理

      getNullableResult(ResultSet rs, int columnIndex)

      getNullableResult(CallableStatement cs, int columnIndex)

  3.3 配置方式

    3.3.1 纯xml

<!-- mybatis.xml配置 -->
<typeHandlers>  
       <typeHandler handler="com.*.StringArrayTypeHandler" javaType="[Ljava.lang.String;" jdbcType="VARCHAR"/>  
</typeHandlers> 

    3.3.2 注解与xml配置

<typeHandlers>  
   <typeHandler handler="com.*.StringArrayTypeHandler"/>  
</typeHandlers>

@MappedTypes({String[].class})  
@MappedJdbcTypes({JdbcType.VARCHAR})  
public class StringArrayTypeHandler implements BaseTypeHandler<String[]>   

    3.3.3 扫描包下的注解,实现类需要包含@MappedJdbcTypes和@MappedTypes

<typeHandlers>  
   <package name="com.*"/>  
</typeHandlers>
原文地址:https://www.cnblogs.com/kongkongFabian/p/9509958.html