数据库JSON类型数据,Java实体类属性类型选择

数据库字段类型为json时,实体类选择list、map类型

private List<Map<String,Object>> other;

数据转换

因为数据库json数据和list传数据的时候会出现格式转换错误

所以需要类型处理器进行处理


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

public class JsonTypeHandler extends BaseTypeHandler<List<Map<String, Object>>> {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<Map<String, Object>> parameter, JdbcType jdbcType) throws SQLException {
        try {
            ps.setString(i, objectMapper.writeValueAsString(parameter));
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public List<Map<String, Object>> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        try {
            return objectMapper.readValue(rs.getString(columnName), new TypeReference<List<Map<String, Object>>>() {});
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public List<Map<String, Object>> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        try {
            return objectMapper.readValue(rs.getString(columnIndex), new TypeReference<List<Map<String, Object>>>() {});
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public List<Map<String, Object>> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        try {
            return objectMapper.readValue(cs.getString(columnIndex), new TypeReference<List<Map<String, Object>>>() {});
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}

实体类属性添加注解

   @TableField(typeHandler = JsonTypeHandler.class)
    private List<Map<String,Object>> other;

postman请求数据json示例

{
    "id": 1,
    "flowId": 123,
    "name": "Sample Flow",
    "text": "This is some sample text.",
    "type": 2,
    "refId": [
        {
            "key1": "value1",
            "key2": "value2"
        },
        {
            "key3": "value3",
            "key4": "value4"
        }
    ],
    "nextId": [
        {
            "key5": "value5",
            "key6": "value6"
        },
        {
            "key7": "value7",
            "key8": "value8"
        }
    ],
    "other": [
        {
            "key9": "value9",
            "key10": "value10"
        },
        {
            "key11": "value11",
            "key12": "value12"
        }
    ]
}

添加结果

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你的数据库类型JSON,你可以将 JSON 数据转换为 Java 对象,然后将其封装到实体类中。以下是一个示例实体类: ```java public class Person { private String name; private int age; private List<PhoneNumber> phoneNumbers; // 省略构造方法和 getter/setter 方法 // 内部类,表示一个电话号码 private static class PhoneNumber { private String type; private String number; // 省略构造方法和 getter/setter 方法 } } ``` 假设你从数据库中获取到了以下 JSON 数据: ```json { "name": "John", "age": 30, "phoneNumbers": [ { "type": "home", "number": "123456789" }, { "type": "work", "number": "987654321" } ] } ``` 你可以使用 JSON 序列化和反序列化库将 JSON 数据转换为 Person 对象。以下是一个使用 Jackson 库将 JSON 数据转换为 Person 对象的示例代码: ```java // 假设你从数据库中获取到了上面的 JSON 数据 String jsonData = "{\"name\":\"John\",\"age\":30,\"phoneNumbers\":[{\"type\":\"home\",\"number\":\"123456789\"},{\"type\":\"work\",\"number\":\"987654321\"}]}"; // 创建 ObjectMapper 对象 ObjectMapper objectMapper = new ObjectMapper(); // 将 JSON 数据转换为 Person 对象 Person person = objectMapper.readValue(jsonData, Person.class); ``` 在上面的示例中,我们使用 Jackson 库将 JSON 数据转换为了一个 Person 对象。注意,在将 JSON 数据转换为对象时,你需要确保 JSON 数据的格式和对象属性类型对应。否则,转换过程可能会抛出异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值