引言:
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