如何在数据库中存储无固定模型的JSON为CLOB/JSON类型?含@RestController与Model示例
动态JSON/CLOB存储实现方案
刚好做过类似的需求,给你捋捋最简单的实现方式——不用定义固定的模型字段,完全动态存储任意JSON内容:
核心思路
- 数据库层面:根据你的数据库类型选存储方式:
- 通用方案:用CLOB类型存储JSON字符串,适配Oracle、MySQL、PostgreSQL等所有支持大文本的数据库
- 性能优化方案:用数据库原生JSON类型(比如MySQL的
json、PostgreSQL的jsonb),支持直接对JSON内容做查询操作
- 模型层:只需要定义一个字段来承载整个JSON内容,不用写
color、miles这类固定属性 - 接口层:直接接收前端传来的JSON请求体,映射到模型的对应字段后存入数据库
1. Model编写示例
方案一:CLOB存储(通用型)
适合需要兼容多数据库的场景,用@Lob注解标记大文本字段:
import jakarta.persistence.*; import lombok.Data; // 用Lombok简化getter/setter,也可以手动写 @Entity @Table(name = "dynamic_json_data") @Data public class DynamicJsonEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 用CLOB存储完整的JSON字符串 @Lob @Column(name = "json_content", nullable = false) private String jsonContent; }
方案二:原生JSON字段存储(性能型)
适合用MySQL/PostgreSQL等支持原生JSON的数据库,直接用Map接收动态键值对:
import jakarta.persistence.*; import lombok.Data; import java.util.Map; @Entity @Table(name = "dynamic_json_data") @Data public class DynamicJsonEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 映射到数据库的JSON类型字段,自动完成Map和JSON的转换 @Column(name = "json_content", nullable = false, columnDefinition = "json") private Map<String, Object> jsonContent; }
2. @RestController编写示例
这里用JpaRepository来简化数据库操作(比EntityManager更易用),先定义一个Repository接口:
import org.springframework.data.jpa.repository.JpaRepository; public interface DynamicJsonRepository extends JpaRepository<DynamicJsonEntity, Long> { }
然后写Controller接口,支持接收并存储JSON:
import org.springframework.web.bind.annotation.*; import org.springframework.beans.factory.annotation.Autowired; @RestController @RequestMapping("/api/json") public class DynamicJsonController { @Autowired private DynamicJsonRepository jsonRepository; // 存储CLOB格式的JSON(接收字符串类型的JSON) @PostMapping("/save/clob") public String saveJsonAsClob(@RequestBody String jsonString) { DynamicJsonEntity entity = new DynamicJsonEntity(); entity.setJsonContent(jsonString); jsonRepository.save(entity); return "JSON已存入CLOB,ID:" + entity.getId(); } // 存储原生JSON格式(接收Map类型的JSON,自动解析键值对) @PostMapping("/save/native") public String saveJsonAsNative(@RequestBody Map<String, Object> jsonMap) { DynamicJsonEntity entity = new DynamicJsonEntity(); entity.setJsonContent(jsonMap); jsonRepository.save(entity); return "JSON已存入原生JSON字段,ID:" + entity.getId(); } // 新增查询接口,返回存储的JSON内容 @GetMapping("/{id}") public Object getJsonById(@PathVariable Long id) { return jsonRepository.findById(id) .map(DynamicJsonEntity::getJsonContent) .orElse("未找到对应ID的JSON数据"); } }
额外说明
- 如果用Oracle数据库,只需要用方案一的CLOB存储即可,Spring会自动处理字符串和CLOB的转换
- 若使用MySQL的原生JSON字段,需要确保数据库驱动版本在8.0以上(自动支持JSON和Map的映射)
- 你测试的时候直接POST你的示例JSON
{"color": "Blue", "miles": 100, "vin": "1234"}到对应的接口就行,完全不用修改模型
内容的提问来源于stack exchange,提问作者jocom
相关产品推荐
相关产品推荐

