暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

面试题系列:Mybatis中的TypeHandler你用过吗

1024笔记 2023-05-20
120

作者平台:

| CSDN:https://blog.csdn.net/qq_41153943(ID:江夏、)

| 掘金:https://juejin.cn/user/651387938290686(ID:jiangxia_1024

| 知乎:https://www.zhihu.com/people/1024-paper-96(ID:江夏)

| GitHub:https://github.com/JiangXia-1024?tab=repositories

| 微信公众号:1024笔记

本文一共1484字,预计阅读7分钟

什么是TypeHandler

MyBatis中的TypeHandler是用来实现Java类型和JDBC类型之间相互转换的一个接口。

在MyBatis的映射文件中,可以通过指定ResultMap或ParameterMap的typeHandler属性或直接在SQL语句中使用TypeHandler来完成不同数据类型之间的转换。

例子

例如,在Mapper接口方法的参数中传递了一个Java类型为Date的参数,但是对应SQL查询需要使用的是数据库中的Timestamp类型,这时就可以通过TypeHandler来解决这个问题。

具体来说,我们需要定义一个继承自org.apache.ibatis.type.BaseTypeHandler抽象类的自定义TypeHandler类,并实现其中的getNullableResult、setNonNullParameter等方法。例如,实现Date与Timestamp类型之间的相互转换的例子代码如下:

    public class TimestampHandler extends BaseTypeHandler<Date> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
    ps.setTimestamp(i, new Timestamp(parameter.getTime()));
    }

    @Override
    public Date getNullableResult(ResultSet rs, String columnName) throws SQLException {
    Timestamp sqlTimestamp = rs.getTimestamp(columnName);
    return (sqlTimestamp != null ? new Date(sqlTimestamp.getTime()) : null);
    }

    @Override
    public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    Timestamp sqlTimestamp = rs.getTimestamp(columnIndex);
    return (sqlTimestamp != null ? new Date(sqlTimestamp.getTime()) : null);
    }

    @Override
    public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    Timestamp sqlTimestamp = cs.getTimestamp(columnIndex);
    return (sqlTimestamp != null ? new Date(sqlTimestamp.getTime()) : null);
    }
    }
    在MyBatis的映射文件中,我们可以使用typeHandler属性来指定该类型处理器类:
      <resultMap id="orderDetailRM" type="OrderDetail">
      <id column="id" property="id" >
      <result column="order_time" property="orderTime" jdbcType="TIMESTAMP" typeHandler="com.example.TimestampHandler"/>
      </resultMap>

      上面的例子指定了一个自定义的TimestampHandler作为对应orderTime字段的TypeHandler,表示将结果集中的Timestamp数据(JDBC类型)以Date类型返回给Java程序。

      另外,在Parameter Map中也可以使用typeHandler属性来指定该参数对应的TypeHandler。例如:

        <select id="selectUser" resultMap="userResultMap">
        <parameterMap id="getUserMap" type="User">
        <parameter property="birthday" jdbcType="DATE" typeHandler="com.example.DateToStringTypeHandler" >
        </parameterMap>
        SELECT * FROM user WHERE birthday = #{birthday}
        </select>

        上述代码中,通过在ParameterMap中指定typeHandler属性,将Java对象中的Date类型转化为String类型,传递到SQL语句中进行查询。

        总结

        MyBatis 中的 TypeHandler 是连接 Java 类型和 JDBC 类型之间的桥梁,可以实现 Java 对象到数据库类型之间相互转换。其作用是让 MyBatis 支持更多数据类型的处理,以及自定义类型的数据库映射。

        Mybatis 是一种轻量级的 ORM(对象关系映射)框架,它提供了持久化的简单性和灵活性,可以帮助开发人员快速地连接数据库并且进行数据操作。而且 Mybatis 的 SQL 映射配置文件也十分简洁清晰,更加贴近于 SQL 语句本身。在大型项目中得到了广泛的应用和验证,是 Java Web 开发的重要技术组件之一。所以学习mybatis也是十分有必要的。

        最后感谢大家的关注!

        -END-


        相关推荐:
                         我就知道你在看!

        文章转载自1024笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论