1.0
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
2.0默认的TypeHandlers
下表描述了一些默认的类型处理器。
TypeHandler类 java类型 数据库类型
BooleanTypeHandler java.lang.Boolean, boolean 数据库兼容的 BOOLEAN
ByteTypeHandler java.lang.Byte, byte 数据库兼容的 NUMERIC 或 BYTE
ShortTypeHandler java.lang.Short, short 数据库兼容的 NUMERIC 或 SMALLINT
IntegerTypeHandler java.lang.Integer, int 数据库兼容的 NUMERIC 或 INTEGER
LongTypeHandler java.lang.Long, long 数据库兼容的 NUMERIC 或 BIGINT
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
ClobReaderTypeHandler java.io.Reader -
ClobTypeHandler java.lang.String CLOB, LONGVARCHAR
NStringTypeHandler java.lang.String NVARCHAR, NCHAR
NClobTypeHandler java.lang.String NCLOB
BlobInputStreamTypeHandler java.io.InputStream -
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 类型,存储枚举的序数值(而不是名称)。
SqlxmlTypeHandler java.lang.String SQLXML
InstantTypeHandler java.time.Instant TIMESTAMP
LocalDateTimeTypeHandler java.time.LocalDateTime TIMESTAMP
LocalDateTypeHandler java.time.LocalDate DATE
LocalTimeTypeHandler java.time.LocalTime TIME
OffsetDateTimeTypeHandler java.time.OffsetDateTime TIMESTAMP
OffsetTimeTypeHandler java.time.OffsetTime TIME
ZonedDateTimeTypeHandler java.time.ZonedDateTime TIMESTAMP
YearTypeHandler java.time.Year INTEGER
MonthTypeHandler java.time.Month INTEGER
YearMonthTypeHandler java.time.YearMonth VARCHAR 或 LONGVARCHAR
JapaneseDateTypeHandler java.time.chrono.JapaneseDate DATE
3.0自定义TypeHandler
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个 JDBC 类型。比如:
import org.apache.ibatis.type.*;
import java.sql.*;
/**
* 必须继承BaseTypeHandler 或者实现 TypeHandler接口
* 加了下面连个注解之后就不用在xml里面写jdbctyoe 和 javatype了
*/
@MappedJdbcTypes({JdbcType.TINYINT})
@MappedTypes({java.lang.String.class})
public class MyTypeHandler extends BaseTypeHandler {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object param, JdbcType jdbcType) throws SQLException {
System.out.println("**********************入参转换************************************");
Boolean parameter = (Boolean) param;
preparedStatement.setInt(i, parameter ? 1 : 0);
}
@Override
public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {
System.out.println("********************结果转换******************************");
//把数字转为boolean
return resultSet.getInt(s) == 1 ? Boolean.TRUE : Boolean.FALSE;
}
@Override
public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {
return null;
}
@Override
public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return null;
}
}
4.0使用方式
4.1全局定义
mybatis-config中
<typeHandlers>
<typeHandler handler="com.hhz.util.MyTypeHandler"/>
</typeHandlers>
4.2局部xml中
<resultMap id="BaseResultMap" type="com.hhz.entity.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="age" column="age"/>
<result property="sex" column="sex" typeHandler="com.hhz.util.MyTypeHandler"/>
</resultMap>
<select id="list" resultMap="BaseResultMap">
select * from user
</select>
5.0测试
@Test
public void listTest(){
UserMapper dao = sqlSession.getMapper(UserMapper.class);
List<User> list = dao.list();
System.out.println(list);
}
打印日志:
[DEBUG] ==> Preparing: select * from user
[DEBUG] ==> Parameters:
********************结果转换******************************
********************结果转换******************************
********************结果转换******************************
********************结果转换******************************
[DEBUG] <== Total: 4
[User{id=1, username='花花', age=20, sex='false'}, User{id=2, username='点点', age=30, sex='true'}, User{id=3, username='yuanyuan', age=25, sex='true'}, User{id=5, username='品牌', age=35, sex='false'}]