8、MyBatis自定义TypeHandler

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 {

    // 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中定义的typeHandler只有在查询的时候有用,如果想在insert / update时使用自定义typeHandler,需要在SQL中配置

而且typeHandler是不需要加引号的


  INSERT INTO user(name, age) VALUES (#{name, typeHandler=com.cmb.test.handler.MyStringHandler}, #{age})

 

  update user set name = #{name, typeHandler=com.cmb.test.handler.MyStringHandler}, age = #{age} where id = #{id}

你可能感兴趣的:(8、MyBatis自定义TypeHandler)