从 MySQL 5.7.8 开始,MySQL 支持原生的 JSON 数据类型。
    使用 mybatis 操作 json 类型,需要配置一个 java json类型与 mysql json 类型的转换器

    1. package com.e6yun.project.tms.core;
    2. import com.alibaba.fastjson.JSONObject;
    3. import org.apache.ibatis.type.BaseTypeHandler;
    4. import org.apache.ibatis.type.JdbcType;
    5. import org.apache.ibatis.type.MappedJdbcTypes;
    6. import org.apache.ibatis.type.MappedTypes;
    7. import java.sql.CallableStatement;
    8. import java.sql.PreparedStatement;
    9. import java.sql.ResultSet;
    10. import java.sql.SQLException;
    11. /**
    12. * 用以mysqljson格式的字段,进行转换的自定义转换器,转换为实体类的JSONObject 属性
    13. * 原文: jianshu.com/p/700452aaae8c
    14. * @author demon
    15. * @date 2021/8/18 16:59
    16. */
    17. @MappedTypes(JSONObject.class)
    18. @MappedJdbcTypes(JdbcType.VARCHAR)
    19. public class JsonHandler extends BaseTypeHandler<JSONObject> {
    20. /**
    21. * 设置非空参数
    22. *
    23. * @param ps
    24. * @param i
    25. * @param parameter
    26. * @param jdbcType
    27. * @throws SQLException
    28. */
    29. @Override
    30. public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
    31. ps.setString(i, String.valueOf(parameter.toJSONString()));
    32. }
    33. /**
    34. * 根据列名,获取可以为空的结果
    35. *
    36. * @param rs
    37. * @param columnName
    38. * @return
    39. * @throws SQLException
    40. */
    41. @Override
    42. public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
    43. String sqlJson = rs.getString(columnName);
    44. if(null != sqlJson) {
    45. return JSONObject.parseObject(sqlJson);
    46. }
    47. return null;
    48. }
    49. /**
    50. * 根据列索引,获取可以为空的结果
    51. *
    52. * @param rs
    53. * @param columnIndex
    54. * @return
    55. * @throws SQLException
    56. */
    57. @Override
    58. public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    59. String sqlJson = rs.getString(columnIndex);
    60. if(null != sqlJson) {
    61. return JSONObject.parseObject(sqlJson);
    62. }
    63. return null;
    64. }
    65. @Override
    66. public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    67. String sqlJson = cs.getString(columnIndex);
    68. if(null != sqlJson) {
    69. return JSONObject.parseObject(sqlJson);
    70. }
    71. return null;
    72. }
    73. }

    定义 resultMap 时,指定转换器, insert 语句针对json 字段也指定类型转换器

    1. <resultMap id="BaseResultMap" type="com.e6yun.project.tms.report.po.WaybillBaseInfoPO">
    2. <!--略-->
    3. <result column="abnormal_info" jdbcType="OTHER" property="abnormalInfo" typeHandler="com.e6yun.project.tms.core.JsonHandler"/>
    4. </resultMap>
    5. insert into waybill_base_info (id, river_allowance)
    6. values( #{id,jdbcType=VARCHAR},
    7. driverAllowance,jdbcType=OTHER,typeHandler=com.e6yun.project.tms.core.JsonHandler})

    mybatis 包扫描扫描指定的类型转化器

    1. mybatis.type-handlers-package=com.e6yun.project.tms.core.JsonHandler