最近新开发的一个功能使用到postgresql中的jsonb数据类型。架构师可能考虑到这种数据格式更加便于存储json格式的数据,因此考虑使用这种数据类型。自己以前未曾使用过这种数据类型,因此需要现学现用。同事给我指点了一下,说这种数据类型可以当做字符串来处理。马上去搜索引擎中查找学习资料,看看这种数据类型的应用场景,以及如何使用这种数据类型。看了很多篇博文,认识到这种数据类型不能直接使用mybatis插入,需要单独使用转换类。自己试着按照网友提供的教程测试,发现可以正常新增数据。注意事项:需要使用JSON.toJSONString()方法将需要处理的数据进行转换,并且这种转换是在转换类中完成的。

转换类的示例代码如下:

@MappedTypes({Object.class})

public class JsonbTypeHandler extends BaseTypeHandler<Object> {

 

    private static final PGobject pGobject = new PGobject();

 

    @Override

    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {

        pGobject .setType("jsonb");

        pGobject .setValue(JSON.toJSONString(o));

        preparedStatement.setObject(i,  pGobject);

    }

 

    @Override

    public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {

        return resultSet.getString(s);

    }

 

    @Override

    public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {

        return resultSet.getString(i);

    }

 

    @Override

    public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {

        return callableStatement.getString(i);

    }

}

mybatisxml文件中的用法为ac_title = #{addition, typeHandler=包路径.JsonbTypeHandler},

  开发的功能中页面传入的数据是数组类型,后端Java接收的时候使用的Object类型。使用mybatis逆向工程插件生成的实体类中,jsonb类型对应的java数据类型也是Object类型。新增数据的时候,通过上面的转换类Object类型转换为jsonb类型,这样即可新增成功。修改操作和新增操作一样,不再赘述。新增操作完成后下一步就是查询,取数据的时候mybatis中直接使用varchar类型接收,代码中还是使用Object接收即可。

  根据业务需求,开发过程中还需要解析jsonb格式的数据。由于数据格式不一样,解析的方式也不一样,自己使用的JSON框架是fastJson框架。第一种情况,从页面中传入的json数组数据,解析的时候直接使用JSON.parseArray()由于是使用Object数据类型接收,需要使用JSON.toJSONString()方法转换一下,才可以转换为list集合。示例代码如下

List<String> dataList = JSON.parseArray(JSON.toJSONString(Object类型的数据), String.class)

这样就可以获取到页面中传入的JSON数组数据,然后在做进一步的处理即可。第二种情况,如果是已经保存到数据库中的数据,则直接使用JSON.parseArray()进行转换即可,不需要其他操作。示例代码如下:

List<String> dataList = JSON.parseArray(数据库中的数据.toString(), String.class)

测试过程中,解析json数据遇到的一些问题,主要就是转换错误的问题。经过反反复复的尝试,最终才确定下来如何进行转换,如何进行解析。已经部署在测试环境中正常运行,各种功能都正常,即将发布新版本,到此功能完成。

 

参考博文:

https://www.cnblogs.com/liangyy/p/13573043.html