mysql typehandler_Mybatis自定义TypeHandler解决特殊类型转换问题

我们知道,Java和MySQL中的数据类型是不同的,Java中除了基本数据类型,还有对象。

有时候使用MySQL存储数据,或者从MySQL中读取数据时,会有一些特殊需求 ,比如:

将Integer数组直接存入MySQL,保存为BLOB形式,读取出来时又是正常的Integer数组

将Integer数组转换为String,然后存入MySQL,使用varchar类型,读取出来时又是正常的Integer数组

这也太难了叭!

解决办法有两种:

Basic Method:Java在存入数据之前,或读取数据之后,做手动类型转换

Clever Method:定义TypeHandler,并在Mybatis对应位置指明

关于第一种方法这里不予赘述,不够Smart。这里主要讲述如何自定义Handler,来解决Java数据->MySQL数据的特殊类型转换问题

这种Handler不仅方便了我们的数据库操作,还有利于代码的复用。

这里以Integer[]数组的存储为形如,1,2,3,的varchar字符串为例。

问题示例

我们定义一个role类,与数据库的role表对应:

public class Role {

private Integer id;

private String name;

private Integer[] accessIds;

private Date createTime;

// ... ignore get and set met

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis中,可以通过自定义TypeHandler来解析MySQL的Point类型数据。具体步骤如下: 1. 实现PointTypeHandler类,继承自BaseTypeHandler<Point>。在实现过程中,需要重写getNullableResult()和setNonNullParameter()方法,分别用于将数据库中的Point类型数据转换为Java中的Point对象,以及将Java中的Point对象转换为数据库中的Point类型数据。 ``` public class PointTypeHandler extends BaseTypeHandler<Point> { @Override public Point getNullableResult(ResultSet rs, String columnName) throws SQLException { String pointStr = rs.getString(columnName); return parsePoint(pointStr); } @Override public Point getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String pointStr = rs.getString(columnIndex); return parsePoint(pointStr); } @Override public Point getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String pointStr = cs.getString(columnIndex); return parsePoint(pointStr); } @Override public void setNonNullParameter(PreparedStatement ps, int i, Point parameter, JdbcType jdbcType) throws SQLException { String pointStr = "POINT(" + parameter.getX() + " " + parameter.getY() + ")"; ps.setString(i, pointStr); } private Point parsePoint(String pointStr) { if (pointStr == null || pointStr.isEmpty()) { return null; } String[] pointArr = pointStr.replace("POINT(", "").replace(")", "").split(" "); double x = Double.parseDouble(pointArr[0]); double y = Double.parseDouble(pointArr[1]); return new Point(x, y); } } ``` 注意:这里的Point是Java自带的类,用于表示二维平面上的一个点。 2. 在Mapper XML文件中使用typeHandler指定自定义TypeHandler,例如: ``` <resultMap id="pointResultMap" type="com.example.Point"> <result column="point" property="point" typeHandler="com.example.PointTypeHandler"/> </resultMap> ``` 这里的com.example.Point是自定义的Java类,用于表示Point类型的数据。 3. 在Java代码中获取Point类型数据时,需要使用自定义TypeHandler。 ``` Point point = sqlSession.selectOne("com.example.mapper.selectPoint", 1); ``` 这里的com.example.mapper.selectPoint是Mapper XML文件中定义的查询语句的ID。 需要注意的是,自定义TypeHandler的实现方式可能因具体需求而异,上述步骤仅供参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值