TypeHandler是MyBatis的类型转换器,用于java类型和数据库类型的转换,如java类型是jva.util.Date,数据库类型是timestamp
MyBatis提供了大量的类型转换器,如
StringTypeHandler,String和CHAR/VARCHAR的转换
IntegerTypeHandler,Integer和INTEGER
LongTypeHandler,Long和BIGINT
FloatTypeHandler:Float和FLOAT
DoubleTypeHandler:Doule和DOUBLE
ArrayTypeHandler:Array和ARRAY
BigDecimalTypeHandler:BigDecimal和REAL/DECIMAL/NUMERIC
DateTypeHandler,用于Date和timestamp的转换
........
自定义TypeHandler可以选择实现TypeHandler接口或者继承BaseTypeHandler,
MappedTypes和MappedJdbcTypes,分别指定了javaType和jdbcType
@MappedTypes(String.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyStringHandler extends BaseTypeHandler<String> {
// insert / update 时调用
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter + "abc");
}
// 查询时使用
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getString(columnName) + "efg";
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getString(rs.getString(columnIndex)) + "efg";
}
// CallableStatement和存储过程相关
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getString(columnIndex) + "efg";
}
}
然后在yaml文件中配置typeHandler所在的包
mybatis.type-handlers-package=com.cmb.test.handler
在ResultMap中配置typeHandler
<resultMap id="BaseResultMap" type="com.cmb.test.entity.User" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" typeHandler="com.cmb.test.handler.MyStringHandler" />
<result column="age" property="age" jdbcType="INTEGER" />
</resultMap>
在ResultMap中定义的typeHandler只有在查询的时候有用,如果想在insert / update时使用自定义typeHandler,需要在SQL中配置
而且typeHandler是不需要加引号的
<insert id="insert" parameterType="com.cmb.test.entity.User" >
INSERT INTO user(name, age) VALUES (#{name, typeHandler=com.cmb.test.handler.MyStringHandler}, #{age})
</insert>
<update id="update" parameterType="com.cmb.test.entity.User" flushCache="false">
update user set name = #{name, typeHandler=com.cmb.test.handler.MyStringHandler}, age = #{age} where id = #{id}
</update>