美文网首页
8、MyBatis自定义TypeHandler

8、MyBatis自定义TypeHandler

作者: timar | 来源:发表于2019-12-23 20:20 被阅读0次

    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>
    

    相关文章

      网友评论

          本文标题:8、MyBatis自定义TypeHandler

          本文链接:https://www.haomeiwen.com/subject/xnstoctx.html