当前位置: 首页 > news >正文

开发中常用问题记录

MyBatis-Plus 插入数据库 JSON 字段完整方案(PostgreSQL / MySQL 两种主流)

一、两种数据库区分

  1. MySQL:字段类型json / jsonb
  2. PostgreSQL:字段类型json / jsonb(你项目用PG)
    核心:自定义类型处理器JacksonTypeHandler,自动 Java对象 ↔ 数据库JSON字符串

二、通用步骤(PG适用)

1. 数据库表字段示例

-- 附件扩展信息,存影像多波段、坐标、元数据杂项ALTERTABLEt_file_attachmentADDCOLUMNext_info JSONB;

2. 实体类

importcom.baomidou.mybatisplus.annotation.TableField;importcom.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;importlombok.Data;importjava.time.LocalDateTime;importjava.util.Map;@DatapublicclassFileAttachment{privateLongid;privateStringoriginalFileName;privateStringfilePath;privateStringsensingTime;/** * 扩展JSON:波段信息、分辨率、四角坐标等 * typeHandler = JacksonTypeHandler.class 自动序列化/反序列化 */@TableField(typeHandler=JacksonTypeHandler.class)privateMap<String,Object>extInfo;// 也可以自定义实体接收JSON// @TableField(typeHandler = JacksonTypeHandler.class)// private TiffExtInfo extInfo;}

3. 自定义JSON实体(可选,替代Map)

importlombok.Data;importjava.math.BigDecimal;@DatapublicclassTiffExtInfo{// 分辨率GSDprivateBigDecimalgsd;// 波段数量privateIntegerbandCount;// 影像宽高privateIntegerwidth;privateIntegerheight;// 四角坐标数组privatedouble[]bounds;}

三、配置全局扫描TypeHandler(无需每个字段写注解)

application.yml

mybatis-plus:configuration:# 开启驼峰转下划线map-underscore-to-camel-case:truetype-handlers-package:com.xxx.xxx.handler

四、插入使用示例

// 1. Map方式FileAttachmentattachment=newFileAttachment();attachment.setOriginalFileName("scene.tif");attachment.setSensingTime("2026-07-07T02:10:30Z");Map<String,Object>ext=newHashMap<>();ext.put("gsd",0.8);ext.put("bandCount",4);ext.put("width",10000);ext.put("height",8000);attachment.setExtInfo(ext);// MP直接插入,自动序列化为jsonb存入PGattachmentService.save(attachment);
// 2. 自定义实体对象方式TiffExtInfotiffExt=newTiffExtInfo();tiffExt.setGsd(newBigDecimal("0.8"));tiffExt.setBandCount(3);tiffExt.setBounds(newdouble[]{116.3,39.9,116.5,40.1});attachment.setExtInfo(tiffExt);attachmentService.save(attachment);

五、查询自动转对象

FileAttachmentfile=attachmentService.getById(1L);Map<String,Object>extMap=file.getExtInfo();// 或强转自定义实体// TiffExtInfo info = file.getExtInfo();

六、常见坑(PG重点)

  1. 报错:无法转换类型 text to jsonb
    • 实体必须加@TableField(typeHandler = JacksonTypeHandler.class)
    • 或全局注册typeHandler包
  2. 更新JSON局部字段(MP Lambda)
Map<String,Object>newExt=newHashMap<>();newExt.put("gsd",1.0);attachmentService.lambdaUpdate().set(FileAttachment::getExtInfo,newExt).eq(FileAttachment::getId,1L).update();
  1. JSONB条件查询(PG特有)
// 查询gsd=0.8的影像LambdaQueryWrapper<FileAttachment>wrapper=Wrappers.lambdaQuery();wrapper.apply("ext_info ->> 'gsd' = '0.8'");List<FileAttachment>list=attachmentService.list(wrapper);

七、Maven依赖(必须有jackson)

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><!-- jackson序列化依赖,否则JacksonTypeHandler失效 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>
http://www.jsqmd.com/news/1145066/

相关文章:

  • 超好用照片转GIF工具,轻松做出丝滑动图
  • 小白安装skills
  • 系统门窗行业主流品牌有哪些?2026 行业盘点
  • 一文看懂2026企业AI智能体平台:从通用型到垂直行业,谁在领跑?
  • Draw.io ECE:电气工程绘图效率提升的终极解决方案
  • 国产网络变压器替代进口:Pin-to-Pin 要核对哪些关键指标
  • 如何用Adobe Downloader在5分钟内完成Adobe全家桶下载安装?
  • 鼎博梯控 MF1 卡修复实战:PM6 设备 3 步恢复“废卡”完整流程
  • 从零构建机器学习知识体系:监督/无监督/半监督/强化学习4大分支核心算法图谱
  • 沟通书籍排行榜,三本最具代表性的经典必看书籍推荐
  • Loop Engineering:用系统设计取代手动提示,构建 AI 编码代理的自动化循环
  • Unity读取和写入本地Excel表格数据完整指南
  • Vivado 2024.1 时序约束实战:从 0 到 1 完成 100MHz FIFO 异步时钟组约束
  • 你的“老婆”正在消失:一个Galgame玩家的五年“打捞”计划,建了座8万人注册的“数字方舟”
  • 3D文件格式解析:建筑师与设计师指南
  • 从 pthread 到 std::thread:一文吃透 Linux 线程底层模型与跨平台封装本质
  • OpenFaaS:在 Kubernetes 上跑函数更简单
  • 贝叶斯优化 (BO) 实战:5 种采集函数 (EI/UCB/PI) 在超参数调优中的性能对比
  • 简化办公重复工作 OpenClaw可视化部署实操全过程
  • YOLOv5环境配置到Qt集成的完整指南
  • 3 种工业镜头景深计算方案对比:公式、查表与仿真工具实测
  • 许可管理系统的四大核心功能,你都了解吗?
  • DMA 传输方向 + 配合ADC/UART/SPI 速记笔记
  • 如何高效推广GEO优化,抢占AI本地流量蓝海
  • 2026 福州全屋定制性价比排行:不同预算的选型参考
  • Gemini-3-Pro 提示词工程规范与 Python SDK 高级集成指南
  • 智能电视上有哪些好用的软件?
  • 泛程序收录低?这些优化解决方法值得一试
  • 彻底解决Python多版本冲突!下载安装+环境变量配置全流程详解!
  • 为什么说许可管理是企业数字化的基础工程?