mybatis+postgresql,无感读写json字段

嚴華  金牌会员 | 2024-11-12 01:51:59 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 915|帖子 915|积分 2745

1.实体类中字段类型

  1. import com.alibaba.fastjson.JSONObject;
  2. @Data
  3. public class TestDto {
  4.     private String name;
  5.     //对应数据库的JSON字段
  6.     private JSONObject page_detail;
  7. }
复制代码
2.自界说实现typeHandler

  1. package base.utils;
  2. import com.alibaba.fastjson.JSONObject;
  3. import org.apache.ibatis.type.*;
  4. import java.sql.CallableStatement;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. @MappedTypes(JSONObject.class)
  9. @MappedJdbcTypes(JdbcType.VARCHAR)
  10. public class JsonTypeHandler extends BaseTypeHandler<JSONObject>{
  11.      /**
  12.      * 设置非空参数
  13.      * @param ps
  14.      * @param i
  15.      * @param parameter
  16.      * @param jdbcType
  17.      * @throws SQLException
  18.      */
  19.     @Override
  20.     public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
  21.         ps.setString(i,String.valueOf(parameter.toJSONString()));
  22.     }
  23.     /**
  24.      * 根据列名,获取可以为空的结果
  25.      * @param rs
  26.      * @param columnName
  27.      * @return
  28.      * @throws SQLException
  29.      */
  30.     @Override
  31.     public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
  32.         String sqlJson = rs.getString(columnName);
  33.         if (null != sqlJson) {
  34.             return JSONObject.parseObject(sqlJson);
  35.         }
  36.         return null;
  37.     }
  38.     /**
  39.      * 根据列索引,获取可以为内控的接口
  40.      * @param rs
  41.      * @param columnIndex
  42.      * @return
  43.      * @throws SQLException
  44.      */
  45.     @Override
  46.     public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
  47.         String sqlJson = rs.getString(columnIndex);
  48.         if (null != sqlJson) {
  49.             return JSONObject.parseObject(sqlJson);
  50.         }
  51.         return null;
  52.     }
  53.     /**
  54.      *
  55.      * @param cs
  56.      * @param columnIndex
  57.      * @return
  58.      * @throws SQLException
  59.      */
  60.     @Override
  61.     public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
  62.         String sqlJson = cs.getNString(columnIndex);
  63.         if (null != sqlJson) {
  64.             return JSONObject.parseObject(sqlJson);
  65.         }
  66.         return null;
  67.     }
  68. }
复制代码
3.SQL文件

  1. <insert id="addTest">
  2.         insert into test (name,page_detail)
  3.             values (#{name},#{page_detail})
  4. </insert>
复制代码
4.修改配置文件

4.1 mybatis-spring-boot-starter

由于mybatis-spring-boot-starter可无需Mybatis配置文件,可直接在项目配置文件application.properties中举行配置
  1. #指定类型处理器的所在包的路径
  2. mybatis.type-handlers-package=base.utils
复制代码
4.1 mybatis-spring

mybatis-spring则在mybatis-config.xml中增加typeHandler 
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3. <configuration>
  4.     <settings>
  5.         //略...
  6.     </settings>
  7.     <typeAliases>
  8.         //略...
  9.     </typeAliases>
  10.     <typeHandlers>
  11.         <typeHandler handler="base.utils.JsonTypeHandler"/>
  12.     </typeHandlers>
  13. </configuration>
复制代码
5.JDBC URL 增加配置

  1. #jdbc增加配置stringtype=unspecified
  2. spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/test?stringtype=unspecified
复制代码
6.附加说明
   jdbc url 使用stringtype=unspecified 的话,字符串字段会报无法判断数据类型,都必要增加类型转换,比力贫苦。
  还是建议jdbc url不使用stringtype=unspecified,在json字段的SQL中,为json字段的写入增加::json的转型,如:
  1. <insert id="addTest">
  2.         insert into test (name,page_detail)
  3.             values (#{name},#{page_detail}::json)
  4. </insert>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表