由于MyBatis没有提供直接处理JSON的方法,因此需要自己实现处理JSON的类,并继承BaseTypeHandler来处理储存JSON字段。
首先引入pom文件:
- <dependency>
- <groupId>org.postgresqlgroupId>
- <artifactId>postgresqlartifactId>
- dependency>
实体类接收定义为Object:
- import lombok.Data;
-
-
- @Data
- public class TestJson {
- private Long id;
-
-
- private Object value;
- }
创建Handler:
- import org.apache.ibatis.type.BaseTypeHandler;
- import org.apache.ibatis.type.JdbcType;
- 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({Object.class})
- public class JsonTypeHandler extends BaseTypeHandler
- //引入PGSQL提供的工具类PGobject
- private static final PGobject jsonObject = new PGobject();
-
- @Override
- public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
- jsonObject.setType("json");
- jsonObject.setValue(parameter.toString());
- ps.setObject(i, jsonObject);
- }
-
- @Override
- public Object getNullableResult(ResultSet rs, String s) throws SQLException {
-
- return rs.getString(s);
- }
-
- @Override
- public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
- return rs.getString(columnIndex);
- }
-
- @Override
- public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
- return cs.getString(columnIndex);
- }
- }
需要在Mapper.xml文件中加入:
- <result column="classify_value" jdbcType="OTHER"
- property="classifyValue" typeHandler="xx.xx.xx.JsonTypeHandler"/>
typeHandler指的是自定义的JsonTypeHandler 的全类限定名。
存储对象实际上存储的也是JSON,只是需要对接收的参数进行一定的处理,比如传入的List
定义一个Java对象:
-
- import lombok.Data;
-
-
- import java.util.List;
-
- @Data
- public class ListObjectTest{
-
-
- private String name;
-
-
- private Stirng address;
- }
编写自定义的Handler:
- @MappedJdbcTypes({JdbcType.VARCHAR})
- @MappedTypes(value = {List.class})
- public class ListObjectHandler extends BaseTypeHandler
> {
-
- @SneakyThrows
- @Override
- public void setNonNullParameter(PreparedStatement ps, int i, List
parameter, JdbcType jdbcType) throws SQLException { - ps.setString(i, JSONUtil.toJsonStr(parameter));
- }
-
- @SneakyThrows
- @Override
- public List
getNullableResult(ResultSet rs, String columnName){ - String value = rs.getString(columnName);
- return JSONUtil.parseArray(value).toList(TestListObject.class);
- }
-
- @SneakyThrows
- @Override
- public List
getNullableResult(ResultSet rs, int columnIndex) throws SQLException { - String value = rs.getString(columnIndex);
- return JSONUtil.parseArray(value).toList(TestListObject.class);
-
- }
-
- @SneakyThrows
- @Override
- public List
getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { - String value = cs.getString(columnIndex);
- return JSONUtil.parseArray(value).toList(TestListObject.class);
- }
- }
handler编写:
- import lombok.SneakyThrows;
- 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 java.sql.CallableStatement;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
-
- @MappedJdbcTypes({JdbcType.VARCHAR})
- @MappedTypes(value = {List.class})
- public class HeadersTypeHandler extends BaseTypeHandler
> {
-
- @SneakyThrows
- @Override
- public void setNonNullParameter(PreparedStatement ps, int i, List
parameter, JdbcType jdbcType) throws SQLException { - ps.setString(i, String.join(",", parameter));
- }
-
- @SneakyThrows
- @Override
- public List
getNullableResult(ResultSet rs, String columnName) { - String value = rs.getString(columnName);
- if (value == null) {
- return new ArrayList<>();
- }
- return Arrays.asList(value.split(","));
- }
-
- @SneakyThrows
- @Override
- public List
getNullableResult(ResultSet rs, int columnIndex) throws SQLException { - String value = rs.getString(columnIndex);
- if (value == null) {
- return new ArrayList();
- }
- return Arrays.asList(value.split(","));
- }
-
- @SneakyThrows
- @Override
- public List
getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { - String value = cs.getString(columnIndex);
- if (value == null) {
- return new ArrayList<>();
- }
- return Arrays.asList(value.split(","));
- }
- }
handler:
- import cn.hutool.json.JSONUtil;
- import com.pearadmin.system.domain.ProductStrategyDetail;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.commons.lang.StringEscapeUtils;
- 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 java.sql.CallableStatement;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.List;
-
- @MappedJdbcTypes({JdbcType.OTHER})
- @MappedTypes(value = {List.class})
- @Slf4j
- public class DetailHandler extends BaseTypeHandler
{
-
- @Override
- public void setNonNullParameter(PreparedStatement preparedStatement, int i, List list, JdbcType jdbcType) throws SQLException {
- preparedStatement.setString(i, JSONUtil.toJsonStr(list));
- }
-
- @Override
- public List getNullableResult(ResultSet resultSet, String s) throws SQLException {
- String value = resultSet.getString(s);
- if (value == null) {
- return null;
- }
- return JSONUtil.toList(value, ProductStrategyDetail.class);
- }
-
- @Override
- public List getNullableResult(ResultSet resultSet, int i) throws SQLException {
- String value = resultSet.getString(i);
- if (value == null) {
- return null;
- }
- return JSONUtil.toList(value, ProductStrategyDetail.class);
- }
-
- @Override
- public List getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
- String value = callableStatement.getString(i);
- if (value == null) {
- return null;
- }
- return JSONUtil.toList(value, ProductStrategyDetail.class);
- }
- }
handler:
- import cn.hutool.json.JSONUtil;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import lombok.SneakyThrows;
- import lombok.extern.slf4j.Slf4j;
- 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 java.io.IOException;
- import java.lang.reflect.InvocationTargetException;
- import java.math.BigDecimal;
- import java.nio.charset.StandardCharsets;
- import java.sql.CallableStatement;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.HashMap;
- import java.util.Map;
-
- @MappedJdbcTypes({JdbcType.VARCHAR})
- @MappedTypes(value = {Map.class})
- @Slf4j
- public class JsonTypeHandler extends BaseTypeHandler
-
- private ObjectMapper objectMapper = new ObjectMapper();
-
- @SneakyThrows
- @Override
- public void setNonNullParameter(PreparedStatement ps, int i, Map parameter, JdbcType jdbcType) throws SQLException {
- ps.setString(i, objectMapper.writeValueAsString(parameter));
- }
-
- @SneakyThrows
- @Override
- public Map
getNullableResult(ResultSet rs, String columnName) { - String value = rs.getString(columnName);
- if (value == null) {
- return new HashMap();
- }
- Map map = objectMapper.readValue(value.getBytes(), Map.class);
- return toStructureElementObjectMap(map);
- }
-
- @SneakyThrows
- @Override
- public Map
getNullableResult(ResultSet rs, int columnIndex) throws SQLException { - String value = rs.getString(columnIndex);
- if (value == null) {
- return new HashMap();
- }
- Map map = objectMapper.readValue(value.getBytes(), Map.class);
- return toStructureElementObjectMap(map);
- }
-
- @SneakyThrows
- @Override
- public Map
getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { - String value = cs.getString(columnIndex);
- if (value == null) {
- return new HashMap();
- }
- Map map = objectMapper.readValue(value.getBytes(), Map.class);
- return toStructureElementObjectMap(map);
- }
-
-
- }