MyBatisPlus:PG数组类型自动映射问题
引言:
PostGreSQL数据库提供了丰富的数据类型,通过查看官网文档,我们也可以发现,PG也提供了对数组类型的支持。

但是在实际开发中,我们通常是使用MyBatis/MyBatisPlus这种半自动ORM映射框架来实现数据库/表数据基本的增删改查,以及其它操作。那么,问题来了,如何实现Java数据类型与PG数据库数组类型之间的自动映射呢?其实就是要搞明白两者之间的对应关系,然后以自定义TypeHandler类型映射器的方式,来解决这个问题。
PostGreSQL基本数据类型
PostGreSQL基本数据类型如下表所示,具体如何对各种数据类型进行操作,可参考官网文档(PostgreSQL 12.2 手册)。
PostGreSQL:数组类型
PostGreSQL数组类型,官网文档描述如下:
PostgreSQL允许一个表中的列定义为变长多维数组。可以创建任何内建或用户定义的基类、枚举类型、组合类型或者域的数组。
如何理解呢?举一个简单的例子,假设我们现在有一张表:tb_demo,不包含任何数组类型字段的建表语句如下,
-- Table: public.tb_array-- DROP TABLE IF EXISTS public.tb_array;CREATE TABLE IF NOT EXISTS public.tb_demo
(id integer NOT NULL DEFAULT nextval('tb_array_id_seq'::regclass),types integer,names character varying,longs bigint,bools boolean,decimals numeric,doubles double precision,dates date,timestamps timestamp with time zone,notimestamps timestamp without time zone,CONSTRAINT tb_array_pkey PRIMARY KEY (id)
)
注意到:我们的字段名都是以s复数形式结尾,这意味着它可能是包含>=1个值,那么,基本数据类型在这里显然是不合适的,因为是要存放一组值。这里就要用到数组类型了。我们先看官网给出的一个例子,
CREATE TABLE sal_emp (name text,pay_by_quarter integer[],schedule text[][] );如上所示,一个数组数据类型可以通过在数组元素的数据类型名称后面加上方括号(
[])来命名。上述命令将创建一个名为sal_emp的表,它有一个类型为text的列(name),一个表示雇员的季度工资的一维integer类型数组(pay_by_quarter),以及一个表示雇员每周日程表的二维text类型数组(schedule)。
仿照上面的例子,我们将之前的tb_demo表改为tb_array表,
-- Table: public.tb_array-- DROP TABLE IF EXISTS public.tb_array;CREATE TABLE IF NOT EXISTS public.tb_array
(id integer NOT NULL DEFAULT nextval('tb_array_id_seq'::regclass),types integer[],names character varying[] COLLATE pg_catalog."default",longs bigint[],bools boolean[],decimals numeric[],doubles double precision[],dates date[],timestamps timestamp with time zone[],notimestamps timestamp without time zone[],CONSTRAINT tb_array_pkey PRIMARY KEY (id)
)
接着,来添加一条记录(这里一定要熟悉基本数据类型值的书写方式,否则此处看起来可能会比较费劲),
INS相关文章:
MyBatisPlus:PG数组类型自动映射问题
引言: PostGreSQL数据库提供了丰富的数据类型,通过查看官网文档,我们也可以发现,PG也提供了对数组类型的支持。 但是在实际开发中,我们通常是使用MyBatis/MyBatisPlus这种半自动ORM映射框架来实现数据库/表数据基本的增删改查,以及其它操作。那么,问题来了,如何…...
Data-Shape制作UI节点简介
很多小伙伴对于Data-Shape制作简单的UI都是似懂非懂,群里很多小伙伴也总是询问相关的问题,那么,今天我就简单举几个例子,专门介绍下Data-Shape创建简单UI的教程。 首先,本次教程,使用的是Data-Shape 2021.…...
kubernetes负载均衡部署
目录 1.新master节点的搭建 对master02进行初始化配置(192.168.88.31) 将master01的配置移植到master02 修改master02配置文件 2.负载均衡的部署 两台负载均衡器配置nginx 部署keepalived服务 所有node节点操作 总结 实验准备: k8s…...
NestJS入门6:日志中间件
前文参考: NestJS入门1 NestJS入门2:创建模块 NestJS入门3:不同请求方式前后端写法 NestJS入门4:MySQL typeorm 增删改查 NestJS入门5:加入Swagger 1. 安装 nest g middleware logger middleware 2. lo…...
CommonJS、require、moudle实现两个文件传参
目的:实现两个文件传参 文件A给B传入一个参数,并且文件B代码执行后再传回A。 场景 拆分express项目中的app.js文件中的路由、项目越大会使app.js文件变大,复杂 如何使用 app.js文件 导入路由文件调用路由文件,调用的时候传入…...
关于php、php-fpm的解释
PHP语言是由PHP程序解释的,而不是由php-fpm程序解释的。 PHP(Hypertext Preprocessor)是一种通用开源脚本语言,最初是为创建动态Web页面而设计的,但现在也可以用于命令行脚本编写等用途。PHP程序通常由Web服务器&…...
【CMake】(8)包含库文件
示例项目结构 假设你的项目结构如下所示: 项目根目录/ ├── CMakeLists.txt ├── include/ │ └── head.h ├── lib/ │ └── libcalc.a └── src/└── main.cpp链接库 link_directories和target_link_libraries指令用于配置和链接库文件。 link_direc…...
【 JS 进阶 】Web APIs (二)
“人生如舞台,每一个瞬间都是一场精彩的表演。在舞台的灯光下,以坚韧为舞伴,跳出自己的独特舞步,创造属于自己的绚丽人生芳华。” - 露易丝梭罗 学习会为 DOM 注册事件,实现简单可交互的网页特交。 事件是编程语言中的…...
解决弹性布局父元素设置高自动换行,子元素均分高度问题(align-content: flex-start)
案例: <view class"abc"><view class"abc-item" v-for"(item,index) in 8" :key"index">看我</view> </view> <style lang"less">.abc{height: 100px;display: flex;flex-wrap: …...
什么是负载均衡集群?
目录 1、集群是什么? 2、负载均衡集群技术 3、负载均衡集群技术的实现 4、实现效果如图 5、负载均衡分类 6、四层负载均衡(基于IP端口的负载均衡) 7、七层的负载均衡(基于虚拟的URL或主机IP的负载均衡) 8、四层负载与七层…...
【es6】的新特性
声明语法 letconstclass字符串/函数/对象/数组的新语法/扩展功能模版字符串 反引号标签函数Proxy /ReflectPromiseclsss & static 静态方法 & extends 继承SetMapSymbolfor of 可迭代对象迭代器模式 通过 Symbol.interator 对外提供统一个接口外部可以通过 for...of 去…...
Java中的多线程是如何实现的?
在Java中,多线程的实现主要依赖于java.lang.Thread类和java.util.concurrent包中的类。以下是Java实现多线程的基本方法和概念: 1. **继承Thread类:** - 创建一个新的类继承自Thread类。 - 重写Thread类的run()方法,定义线…...
C++知识点总结(22):模拟算法
一、概念 模拟算法 根据题目描述进行筛选提取关键要素,按需求书写代码解决实际问题的算法。 二、步骤 1、提取题目的关键要素 2、根据关键要素的需求完成代码 三、关键要素 1、题目目的 2、样例的执行逻辑(样例分析) 3、数据范围(…...
opengl 学习纹理
一.纹理是什么? 纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;类似于图像一样,纹理也可以被用来储存大量的数据,这些数据可以发送到着色器上。 采样是指用纹理坐标来获取纹…...
STM32控制max30102读取血氧心率数据(keil5工程)
一、前言 MAX30102是一款由Maxim Integrated推出的低功耗、高精度的心率和血氧饱和度检测传感器模块,适用于可穿戴设备如智能手环、智能手表等健康管理类电子产品。 该传感器主要特性如下: (1)光学测量:MAX30102内置…...
高级语言期末2011级A卷
1.编写函数,判定正整数m和n(均至少为2)是否满足:数m为数n可分解的最小质因数(数n可分解的最小质因数为整除n的最小质数) 提示:判定m为质数且m是n的最小因数 #include <stdio.h> #include…...
SpringAMQP消息队列
引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>配置文件 spring:rabbitmq:host: 172.27.99.52 # rabbitMQ的ip地址port: 5672 # 端口username: abcpa…...
二次元风格个人主页HTML源码
源码介绍 直接上传服务器压缩包解压就完事了,修改index.html内代码即可,注释写的很全,替换图片在文件夹img,只有前端,没有后台,大佬如果需要,可以自行添加后台。本源码非常适合个人工作室主页。…...
每日学习录
目录 [蓝桥杯 2022 省 A] 求和 题目描述 [蓝桥杯 2019 省 B] 特别数的和 题目描述 [蓝桥杯 2023 省 A] 填空问题 题目描述 [蓝桥杯 2020 省 AB1] 走方格 题目描述 [蓝桥杯 2017 省 AB] 分巧克力 [蓝桥杯 2016 省 B] 交换瓶子 题目描述 [蓝桥杯 2022 省 A] 求和 题目描…...
linux docker部署深度学习环境(docker还是conda)
在深度学习中,避免不了在远程服务器上进行模型的训练,如果直接在服务器裸机的基础环境跑显然是不可取的,此时搭建用于模型训练的docker环境显得尤为重要。 在深度学习中,避免不了在远程服务器上进行模型的训练,如果直…...
从MAX30102项目实战出发:解决Keil5编译STM32时ARMCLANG和头文件缺失的连环坑
从MAX30102项目实战解析Keil5编译STM32的深度排坑指南 当你在深夜调试MAX30102血氧传感器时,Keil5突然弹出一连串编译器报错——这种经历对STM32开发者来说绝不陌生。本文将以真实项目为背景,拆解那些官方文档从未提及的编译陷阱。不同于常规操作手册&a…...
别再只会用‘Let‘s think step by step’了:DeepSeek-R1原生CoT机制详解与实战调优
解锁DeepSeek-R1推理潜能:原生思维链技术深度解析与高阶应用指南 当我们在数学考试中遇到复杂题目时,老师总会强调"把解题过程写清楚"。这种分步思考的方式,正是人类解决复杂问题的核心方法。如今,大语言模型也掌握了这…...
WarcraftHelper:让魔兽争霸3重获新生的兼容性增强工具
WarcraftHelper:让魔兽争霸3重获新生的兼容性增强工具 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否曾在现代电脑上尝试重温魔兽争…...
3步实现视频硬字幕精准提取:本地化多语言解决方案如何解决你的字幕难题
3步实现视频硬字幕精准提取:本地化多语言解决方案如何解决你的字幕难题 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区…...
Chandra AI在教育领域的应用:智能学习助手开发
Chandra AI在教育领域的应用:智能学习助手开发 1. 引言 想象一下这样的场景:一个学生在深夜复习功课,遇到一道数学难题却找不到老师请教;一个上班族想学习新技能,但时间碎片化难以系统学习;一个老师面对几…...
Cursor Composer 2 技术报告拆解:MoE 预训练、RL 环境设计与 CursorBench 基准的工程实践
在生产级代码仓库里,一个 AI Agent 面对的往往不是“实现某个功能”这样清晰的任务,而是“新特性上线后出现诡异 bug,日志里只有 954 个 JSON 响应,栈踪迹完全不可靠”。它必须自己跨文件定位、写启发式检测器、调参避免误报&…...
5分钟零代码部署:Live2D AI虚拟助手让你的网站活起来
5分钟零代码部署:Live2D AI虚拟助手让你的网站活起来 【免费下载链接】live2d_ai 基于live2d.js实现的动画小人ai,拥有聊天功能,还有图片识别功能,可以嵌入到网页里 项目地址: https://gitcode.com/gh_mirrors/li/live2d_ai …...
GLM-OCR部署避坑:CPU模式也能用,无显卡用户详细指南
GLM-OCR部署避坑:CPU模式也能用,无显卡用户详细指南 你是不是也遇到过这种情况:看到别人用AI模型轻松识别文档、提取表格,自己也想试试,结果一查部署要求——“需要NVIDIA显卡,显存8GB以上”。手头只有一台…...
ostringstream清空缓存的正确姿势:str()与clear()的深度解析
1. 为什么ostringstream清空缓存这么让人困惑? 第一次用ostringstream的时候,我也被它坑过。记得当时写了个日志记录功能,反复往同一个ostringstream对象里写入内容,结果发现每次输出的日志都越积越长。我本能地调用了clear()&…...
嵌入式状态机设计与实现全解析
1. 嵌入式状态机基础概念状态机(State Machine)是嵌入式系统开发中最核心的设计模式之一,它通过定义系统可能处于的状态集合、状态之间的转换条件以及状态转换时执行的动作,为复杂系统行为建模提供了清晰框架。在嵌入式环境中&…...
