Spring Boot Tk Mybatis PostgreSQL 整合 实现 json 增删改查
发布时间:2020-04-08T13:46:58:手机请访问
文章目录
项目需求
需要使用 PostgreSQL 中的 Jsonb 进行查询操作
在网络上查询了大部分的资料,但是都不行,无奈只能创造了,首先 Spring Boot 中没有 json 数据类型,我们要自己实现 json 的处理
项目目录

自定义JsonTypeHandler
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
package com.mpper.configer; import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.fastjson.JSONObject; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedJdbcTypes; import org.apache.ibatis.type.MappedTypes; import org.postgresql.util.PGobject; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @MappedTypes(JSONObject.class) @MappedJdbcTypes(JdbcType.VARCHAR) public class JsonTypeHandler extends BaseTypeHandler<JSONObject>{ private static final PGobject pgObject = new PGobject(); //设置非空参数 @Override public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException { pgObject.setType("json"); pgObject.setValue(JSONUtils.toJSONString(parameter)); ps.setObject(i, pgObject); } //根据列名,获取可以为空的结果 @Override public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException { String sqlJson = rs.getString(columnName); if (null != sqlJson){ return JSONObject.parseObject(sqlJson); } return null; } //根据列索引,获取可以为空的结果 @Override public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String sqlJson = rs.getString(columnIndex); if (null != sqlJson){ return JSONObject.parseObject(sqlJson); } return null; } @Override public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String sqlJson = cs.getString(columnIndex); if (null != sqlJson){ return JSONObject.parseObject(sqlJson); } return null; } } |
定义实体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package com.mpper.model; import com.alibaba.fastjson.JSONObject; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import javax.persistence.Id; import javax.persistence.Table; @Data @Slf4j @AllArgsConstructor @NoArgsConstructor @Table(name = "usertable") public class User { @Id private Long id; private JSONObject info; } |
数据库结构如下:


定义 DAO 层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package com.mpper.dao; import com.alibaba.fastjson.JSONObject; import com.mpper.configer.MyMapper; import com.mpper.model.User; import org.apache.ibatis.annotations.Param; import java.util.List; public interface UserMapper extends MyMapper<User> { List<User> selectAllUser(); void insertJsonB(User user); Object selectDataById(Integer id); List<User> selectUserByAgeRange(@Param("ageStart") Integer ageStart, @Param("ageEnd") Integer ageEnd); // Param 绑定数据 void updateById(@Param("id") Integer id,@Param("info") JSONObject info); } |
定义 mapper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mpper.dao.UserMapper"> <!-- 插入 记得在 json 字段加入typeHandler=com.mpper.configer.JsonTypeHandler JsonTypeHandler 是咱们刚刚定义的 类 --> <insert id="insertJsonB" parameterType="com.mpper.model.User"> insert into usertable(id,info) values (${id},#{info,typeHandler=com.mpper.configer.JsonTypeHandler}) </insert> <!-- 查询 一定要写个resultMap 不然获取的 json的数据为空 --> <resultMap id="userResultMap" type="com.mpper.model.User"> <id property="id" column="id"/> <result property="info" column="info" typeHandler="com.mpper.configer.JsonTypeHandler"/> </resultMap> <select id="selectAllUser" resultMap="userResultMap"> select * from usertable where (info <![CDATA[ #>>]]> '{age}')::int between 0 and 1000; </select> <resultMap id="selectDataByIdResultMap" type="com.mpper.model.User"> <id property="id" column="id"/> <result property="info" column="info" typeHandler="com.mpper.configer.JsonTypeHandler"/> </resultMap> <select id="selectDataById" parameterType="integer" resultMap="selectDataByIdResultMap"> select id,info from usertable where id=#{id}; </select> <resultMap id="selectUserByAgeRangeResultMap" type="com.mpper.model.User"> <id property="id" column="id"/> <result property="info" column="info" typeHandler="com.mpper.configer.JsonTypeHandler"/> </resultMap> <select id="selectUserByAgeRange" resultMap="selectUserByAgeRangeResultMap"> select * from usertable where (info <![CDATA[ #>>]]> '{age}')::int between #{ageStart} and #{ageEnd}; </select> <!-- 插入 记得在 json 字段加入typeHandler=com.mpper.configer.JsonTypeHandler JsonTypeHandler 是咱们刚刚定义的 类 --> <update id="updateById"> update usertable set info = #{info,typeHandler=com.mpper.configer.JsonTypeHandler} where id = #{id}; </update> </mapper> |
数据库相关信息
Application.yml
1 2 3 4 5 6 7 8 9 10 |
spring: application: name: mmper datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.postgresql.Driver url: jdbc:postgresql://127.0.0.1:5432/xxx username: postgres password: postgres |
查询结果如下:

