这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
pgsql的json类型初探
前文
在使用pgsql数据库的过程中,存在json这种存储类型。本文主要是对于在使用数据库该类型时的一些方法及总结,可能不完善并存在一些问题,作为笔记使用。
关于pgsql的json类型
相比于正常的字符串类型插入数据库,采用该类型可以在取出数据的过程中,直接从中读取json字段,避免了取出数据库后的解析操作,在查询语句中即可直接进行处理。由于该类型中包含的若干函数,可以使数据的处理速度加快,免除后续的解析操作。同样类似的还有jsonb格式。json是对输入的完整拷贝,使用时才解析,会保留输入的空格,重复键以及顺序等。而jsonb是解析输入后保存的二进制,它在解析时会删除不必要的空格和重复的键,顺序和输入可能也不相同。使用时不用再次解析。两者对重复键的处理都是保留最后一个键值对。效率的差别:json类型存储快,使用慢,jsonb类型存储稍慢,使用较快。更具体的细节,还有一些内容,但本文暂时不进行讨论。在使用该类型的过程中有一点需要注意,如果是数组类型的数据无法直接插入。本人的处理方法是使用一个类,将字符串存入类中,再将类转为该类型对象,然后存入数据库。而在取数据时自然要额外进行一步取值操作。这样可以解决数组类型存储时出现的异常问题。
如何在mybatis框架中使用json类型
由于该类型并非为mybatis的常规类型,因此在使用该类型时,需要指定该类型对应的类型处理器。也就是自定义一个类,继承BaseTypeHandler。这里由于要进行该类型处理,因此此处利用阿里巴巴的fastJson作为对应的解析类型。在将数据插入到数据库该类型的字段时,需要在插入时指定如下的解析器,也就可以顺利将数据插入。如果不进行该操作,由于mybatis中不存在该类型的解析处理器,会因此产生数据库插入异常。
@Override
public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter,
JdbcType jdbcType) throws SQLException {
}
@Override
public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
}
@Override
public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
}
@Override
public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
}
return null;
}
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。