作者平台:
| 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> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {ps.setTimestamp(i, new Timestamp(parameter.getTime()));}@Overridepublic Date getNullableResult(ResultSet rs, String columnName) throws SQLException {Timestamp sqlTimestamp = rs.getTimestamp(columnName);return (sqlTimestamp != null ? new Date(sqlTimestamp.getTime()) : null);}@Overridepublic Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException {Timestamp sqlTimestamp = rs.getTimestamp(columnIndex);return (sqlTimestamp != null ? new Date(sqlTimestamp.getTime()) : null);}@Overridepublic Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {Timestamp sqlTimestamp = cs.getTimestamp(columnIndex);return (sqlTimestamp != null ? new Date(sqlTimestamp.getTime()) : null);}}
<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-
SpringBoot整合Mybatis(上):注解版 SpringBoot整合Mybatis(下):配置版 SpringBoot系列:MybatisPlus的入门级使用教程(上) SpringBoot系列:MybatisPlus的入门级使用教程(中) SpringBoot系列:MybatisPlus的入门级使用教程(下)




