Mybatis-TypeHandler,解析TypeHandler工作原理,案例展示实际业务场景

本文介绍了Mybatis的TypeHandler机制,它用于处理Java对象与数据库之间的类型转换。在存储和获取Blob字段如List数据时,TypeHandler负责序列化和反序列化。文章详细讲解了如何自定义TypeHandler,并通过一个Dish表的例子展示了在实际业务场景中的应用。
摘要由CSDN通过智能技术生成

Mybatis-TypeHandler

前几天在项目中发现了一个Mybatis存储List数据的操作,对应的是数据库中的Blob字段。突然让我想起来刚参加工作那会,当时也是有个需求要存一对多这种关系的数据,类似一个主键id对应某个字段是多个值这种情况,当时不懂可以序列化,每每遇到这种情况,我们都是采取多建立一张关系表来专门存储该字段,现在回忆起来觉得很搞笑。

1)TypeHandler

  TypeHandler被称作类型处理器,MyBatis在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,都会用类型处理器将Java对象转化为数据库支持的类型或者将获取到数据库值以合适的方式转换成 Java类型。简而言之,在存数据时TypeHandler可以帮我们序列化java对象,在取数据时TypeHandler可以帮我们反序列化数据库对象。

  Mybatis为我们已经提供了很多内置的TypeHandler,可以去项目中的mybatis-xxx.jar/org.apache.ibatis.type包下查看:

image-20230223220103779

// org.apache.ibatis.type.TypeHandler<T> 接口:
public interface TypeHandler<T> {
   
  // 为PreparedStatement对象设置参数,将Java类型(T parameter)设置到索引为i的值中去,对应的JdbcType=jdbcType
  void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;

  // 从数据库的返回结果集对象ResultSet中取得想要的某个列(根据列名columnName指定)数据,返回类型是Java中的类型,T为泛型
  T getResult(ResultSet rs, String columnName) throws SQLException;

  // 作用同上,不过是一索引columnIndex来指定
  T getResult(ResultSet rs, int columnIndex) throws SQLException;
  
  // 作用同上,官方的解释是:用于执行 SQL 存储过程的接口。JDBC API 提供了一种存储过程 SQL 转义语法,允许以标准方式为所有 RDBMS 调用存储过程
  T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}

定义一个自己的TypeHandler,参考了这篇博客

// 使用Jackson来转换
public class JsonTypeHandler<T> extends
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值