• Mybatis&MybatisPlus 操作 jsonb 格式数据


    最近有用到postgresql,里面的一个特色数据类型便是jsonb,和json差不多,但是查询比较快,关于概念,这里就提一句,不赘述。

    我们先来看下用mybatisplus,首先是查询数据。

    依赖:

    1. <dependency>
    2. <groupId>com.baomidougroupId>
    3. <artifactId>mybatis-plus-boot-starterartifactId>
    4. <version>3.5.1version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.mybatis.spring.bootgroupId>
    8. <artifactId>mybatis-spring-boot-starterartifactId>
    9. <version>2.2.2version>
    10. dependency>

    然后数据库:

    1. CREATE TABLE employees (
    2. id SERIAL PRIMARY KEY,
    3. name TEXT,
    4. age INTEGER,
    5. address JSONB
    6. );
    7. INSERT INTO employees (name, age, address) VALUES
    8. ('Alice', 25, '{"city": "New York", "street": "123 Main St"}'),
    9. ('Bob', 30, '{"city": "San Francisco", "street": "456 Elm St"}'),
    10. ('Charlie', 35, '{"city": "Seattle", "street": "789 Oak St"}'),
    11. ('David', 28, '{"city": "Chicago", "street": "678 Walnut St"}'),
    12. ('Eve', 27, '{"city": "Los Angeles", "street": "234 Pine St"}'),
    13. ('Frank', 32, '{"city": "Boston", "street": "345 Maple St"}'),
    14. ('Grace', 29, '{"city": "Austin", "street": "567 Birch St"}');

    前面的都无所谓,主要来看实体类,实体类中有两个地方注意:

    因为是用的MP,所以在这里直接就注解上配置了  (这里是为了扩展性,所以才自定义的,其实在MP中,是自带了TypeHandler 的,有Gson,FastJson等等

    1. import com.alibaba.fastjson.JSON;
    2. import org.apache.ibatis.type.BaseTypeHandler;
    3. import org.apache.ibatis.type.JdbcType;
    4. import org.apache.ibatis.type.MappedTypes;
    5. import org.postgresql.util.PGobject;
    6. import java.sql.CallableStatement;
    7. import java.sql.PreparedStatement;
    8. import java.sql.ResultSet;
    9. import java.sql.SQLException;
    10. /**
    11. * @Description:
    12. * @Author Jack_Lee
    13. * @Date 2023/9/18 11:30
    14. */
    15. @MappedTypes(Object.class)
    16. public class JsonTypeHandlerObjectextends Object> extends BaseTypeHandler {
    17. private static final PGobject jsonObject = new PGobject();
    18. @Override
    19. public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
    20. jsonObject.setType("jsonb");
    21. jsonObject.setValue(JSON.toJSONString(parameter));
    22. ps.setObject(i, jsonObject);
    23. }
    24. @Override
    25. public T getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
    26. return (T) resultSet.getString(columnName);
    27. }
    28. @Override
    29. public T getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
    30. return (T) resultSet.getString(columnIndex);
    31. }
    32. @Override
    33. public T getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
    34. return (T) callableStatement.getString(columnIndex);
    35. }
    36. }

    添加TypeHandler,用于类型处理,这个应该不陌生,如有不知道这个的小伙伴,可以去温习一下mybatis相关知识。

    定义mapper,这个不用说,最基本的

    再来看下Mybatis的,mybatis不像plus,很多都要手动进行配置

    先定义一个resultMap,然后在字段上指定TypeHandler即可

    1. <mapper namespace="com.jack.mapper.EmployeesMapper">
    2. <resultMap id="EmployeesMap" type="com.jack.entity.Employees">
    3. <id column="id" property="id"/>
    4. <result column="name" property="name"/>
    5. <result column="age" property="age"/>
    6. <result column="address" property="address" typeHandler="com.jack.handler.JsonTypeHandlerObject"/>
    7. resultMap>
    8. <select id="findList" resultMap="EmployeesMap">
    9. select * from employees;
    10. select>
    11. mapper>

    然后再写个测试类自己测一下,这里不多说

    重点说一下插入数据

    以mybatis为例,先在mapperx.xml中定义好
     

    1. <insert id="insertEmp" parameterType="com.jack.entity.Employees">
    2. insert into employees values (#{id}, {name}, {age}, {address,jdbcType=OTHER,typeHandler=com.jack.handler.JsonTypeHandlerObject})
    3. insert>
    1. @Mapper
    2. public interface EmployeesMapper {
    3. int insertEmp();
    4. }

    --------------------------------------------------------------------------------------------------------------------------------

    补充:如果要存的话,建议还是用Map进行存取,因为刚好也是键值对,比较方便,下面是我自定义的TypeHandler

    1. @MappedTypes(Map.class)
    2. public class JsonTypeHandlerMap extends BaseTypeHandler {
    3. private static final PGobject pgObject = new PGobject();
    4. @Override
    5. public void setNonNullParameter(PreparedStatement preparedStatement, int i, T parameter, JdbcType jdbcType) throws SQLException {
    6. pgObject.setType("jsonb");
    7. pgObject.setValue(JSON.toJSONString(parameter));
    8. preparedStatement.setObject(i, pgObject);
    9. }
    10. @Override
    11. public T getNullableResult(ResultSet resultSet, String s) throws SQLException {
    12. return (T) resultSet.getString(s);
    13. }
    14. @Override
    15. public T getNullableResult(ResultSet resultSet, int i) throws SQLException {
    16. return (T) resultSet.getString(i);
    17. }
    18. @Override
    19. public T getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
    20. return (T) callableStatement.getString(i);
    21. }
    22. }

     同样在实体类中指定或者在mapper.xml 中进行指定即可。

    然后去测试:

    1. @Test
    2. public void TestUsersInsert(){
    3. Users users = new Users();
    4. users.setId(13);
    5. users.setName("zhangsan");
    6. HashMap map = new HashMap<>();
    7. map.put("name","测试1111");
    8. map.put("age","测2222");
    9. System.out.println("---------------------------->>>> "+ map);
    10. users.setAddress(map);
    11. int insert = usersMapper.insert(users);
    12. System.out.println(insert > 0 ? "成功" : "失败");
    13. }

     成功存到数据库中

    -----------------------------------------------------补充完毕--------------------------------------------------------------

    测试用例自己写一下,写的比较潦草,因为是临时记录,又是在公司。

    如果有任何问题,请在下方留言,或者直接私信我,我看到都会回复!

  • 相关阅读:
    搜索引擎-01-概览
    【Nginx】在Linux上如何安装Nginx教程+Nginx基本命令的使用
    Java学习笔记6.1.3 字节流 - 字节流缓冲区与缓冲字节流
    k8s主节点与子节点的错误解决
    Theme Studio(主题工作室)
    Hystrix面试题大全
    .NET C#基础(6):命名空间 - 组织代码的利器
    《网络安全笔记》第十五章:交换机的基本配置
    乙酰基六肽-1——促进黑色素合成,调节皮肤色素沉着
    软件测试项目该如何规避风险?
  • 原文地址:https://blog.csdn.net/qq_39968986/article/details/132987040