【MyBatis】自定义TypeHandler的使用

97 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

什么是typeHandle

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为我们实现了许多TypeHandler, 当我们没有配置指定TypeHandler时,Mybatis会根据参数或者返回结果的不同,默认为我们选择合适的TypeHandler处理。

TypeHandle作用

实现一个简单的自定义TypeHandler

1、创建一个自定义的typeHandler类 @MappedJdbcTypes(JdbcType.VARCHAR) 指定转换之后的数据类型 @MappedTypes({Date.class}) 指定要被转换的类型

@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes({Date.class})
public class MyTypeHandler extends BaseTypeHandler<Date> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Date date, JdbcType jdbcType) throws SQLException {
        ps.setString(i, String.valueOf(date.getTime()));
    }

    @Override
    public Date getNullableResult(ResultSet rs, String s) throws SQLException {
        return new Date(rs.getLong(s));
    }

    @Override
    public Date getNullableResult(ResultSet rs, int i) throws SQLException {
        return new Date(rs.getLong(i));
    }

    @Override
    public Date getNullableResult(CallableStatement cs, int i) throws SQLException {
        return cs.getDate(i);
    }
}

2、mapper接口

public interface TestMapper {

    User getById();

    void insertUser(User user);

}

3、mapper.xml

<resultMap id="TestMap" type="com.demo.entity.User" >
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="age" jdbcType="INTEGER" property="age" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" typeHandler="com.demo.mydate.MyTypeHandler" />
</resultMap>

<insert id="insertUser" parameterType="com.demo.entity.User">
    INSERT INTO user(id,name,age, create_time) VALUES (#{id}, #{name}, #{age},#{createTime,javaType=Date,jdbcType=VARCHAR,typeHandler=com.demo.mydate.MyTypeHandler})
</insert>

4、在这里需要指定自定义TypeHandler类的包路径,我这里是用的springboot框架,所以在配置文件中进行配置。

mybatis:
  type-aliases-package: com.demo.entity
  #自定义typeHandler类包路径
  type-handlers-package: com.demo.mydate
  mapper-locations: classpath:mapping/*.xml
  configuration:
    map-underscore-to-camel-case: true

总结:

TypeHandler意思就是类型处理器,这里类型指的是数据库类型和java类型之间的处理。使用ta我们可以任意的转换数据库类型(JdbcType)和java类型。