🧃MyBatisPlus操作Oracle(插入数据主键自增)
示例代码:https://gitee.com/zhang-zhixi/springboot-mp-oracle-auto.git
代码不需要修改,需要操作的是相对应的数据库,在Oracle中是不支持ID自增的,这时候我们就需要手动设置一些规则,来让ORM框架支持自增(实际是数据库层面做的)
如图所示,使用MP插入Oracle表数据,不做设置的话是插入不了的:
MyBatisPlus操作Oracle
关于oracle 11g和12c发行时间以及区别:
Oracle 11g是Oracle公司在2007年发行的一款数据库软管理系统。而Oracle 12c则是在2013年发行的。 Oracle 11g和12c虽然都是Oracle公司的数据库管理系统,但在某些方面存在一些主要区别: Multitenant Architecture:Oracle 12c引入了新的多租户体系结构,允许多个独立的可插拔数据库(PDBs)运行在同一个容器数据库(CDB)中,而无需消耗额外的系统资源。而Oracle 11g没有这个功能。 数据优化:Oracle 12c引入了自动数据优化(ADO)功能,可根据数据的使用情况和热度,自动将数据移至优化的存储层,从而提高了整体性能和效率。而Oracle 11g并没有这项功能。 内存管理:Oracle 12c优化了内存管理,引入了自动大页特性,可以大幅度提高数据库的性能和可扩展性。而Oracle 11g对此没有明显改进。 安全性:Oracle 12c提供了更高级别的安全性,包括数据红利射(Data Redaction)、高级网络服务安全等,而Oracle 11g则没有这些新的安全特性。 性能诊断:Oracle 12c增强了对性能问题的诊断和解决能力,具备了提供实时数据的活动报告,包括活动会话历史(ASH)、自动工作负载存储库(AWR)等,而Oracle 11g的这些功能相对较弱。 兼容性:Oracle 12c拥有向下兼容性,可处理在Oracle 11g中运行的应用程序,而Oracle 11g则不能处理在Oracle 12c中运行的应用程序。
一、创建表
CREATE TABLE "STUDENT" ( "ID" NUMBER NOT NULL, "NAME" VARCHAR2(255 BYTE), "AGE" NUMBER(2,0), "SEX" NVARCHAR2(2), "TEL" NUMBER, "EMAIL" VARCHAR2(255 BYTE), "BIRTHDAY" DATE, "CREATE_TIME" DATE, "UPDATE_TIME" DATE, "IS_DELETED" NUMBER, CONSTRAINT "PK_STUDENT" PRIMARY KEY ("ID") ); COMMENT ON COLUMN "STUDENT"."ID" IS '主键'; COMMENT ON COLUMN "STUDENT"."NAME" IS '姓名'; COMMENT ON COLUMN "STUDENT"."AGE" IS '年龄'; COMMENT ON COLUMN "STUDENT"."SEX" IS '性别'; COMMENT ON COLUMN "STUDENT"."TEL" IS '电话号码'; COMMENT ON COLUMN "STUDENT"."EMAIL" IS '电子邮箱'; COMMENT ON COLUMN "STUDENT"."BIRTHDAY" IS '生日'; COMMENT ON COLUMN "STUDENT"."CREATE_TIME" IS '创建时间'; COMMENT ON COLUMN "STUDENT"."UPDATE_TIME" IS '更新时间'; COMMENT ON COLUMN "STUDENT"."IS_DELETED" IS '是否删除(0-未删除,1已删除)';
二、创建序列
Oracle 中的标识符(如表名、列名、序列名等)的长度限制为30个字符,通常的规则就是:SEQ_表名_ID
创建序列:
create sequence SEQ_STUDENT_ID minvalue 1 --最小值 nomaxvalue --不设置最大值(由机器决定),或 根据表字段的值范围设置 maxvalue start with 1 --从1开始计数,数值可变 increment by 1 --每次加1,数值可变 nocycle --nocycle:一直累加,不循环;cycle:达到最大值后,将从头开始累加 -- nocache:在内存中不缓存序列的值;cache在内存中缓存序列的值 nocache;
生成序列ID
-- 为序列生成一个新ID SELECT SEQ_STUDENT_ID.NEXTVAL FROM DUAL;
查询序列:
-- 序列名、拥有者(用户)、增量、最小值、最大值等 -- 查询所有用户的序列 SELECT * FROM ALL_SEQUENCES; -- 查询当前用户序列 SELECT * FROM USER_SEQUENCES; -- 查询序列的值 SELECT "SEQ_STUDENT_ID"."CURRVAL" FROM dual;
删除序列
-- 删除序列 DROP SEQUENCE SEQ_STUDENT_ID
三、创建触发器
说明下:我在使用Navicat给ID设置默认值为序列时,在Oracle11g-11.2.0.1.0不能正常添加,会报错,在Oracle12c-12.2.0.1.0可以正常添加
此处两种方式我都会演示,使用序列或者使用触发器:
第一种:创建触发器(通用),此处演示版本为11g
create or replace trigger SEQ_STUDENT_ID before insert on STUDENT for each row begin select SEQ_STUDENT_ID.nextval into :new.id from dual; end;
-
create or replace trigger SEQ_STUDENT_ID
:这部分指定了要创建的触发器的名称为 "SEQ_STUDENT_ID",如果同名的触发器已经存在,则会被替换。 -
before insert on STUDENT for each row
:这部分指定触发器的事件类型,即在每次往 "STUDENT" 表插入新行之前触发。 -
begin
:此关键字表示接下来是触发器的主体部分,这是一个代码块。 -
select SEQ_STUDENT_ID.nextval into :new.id from dual;
:这部分是触发器的实际操作。它使用select
语句从名为 "SEQ_STUDENT_ID" 的序列中获取下一个值,并将该值赋给触发器关联的插入行的 "id" 字段(使用:new.id
来引用插入行)。 -
end;
:此关键字表示触发器主体的结束。
因此,这个触发器的目的是在每次往 "STUDENT" 表插入新行之前,从名为 "SEQ_STUDENT_ID" 的序列中获取下一个值,并将其赋给 "id" 字段。这样可以确保每个新插入的行都有唯一的 "id" 值。
删除触发器命令:DROP TRIGGER SEQ_STUDENT_ID;
第二种:给ID默认值设置为序列,不用单独创建触发器(对11g不生效),此处演示版本为12c
前提是需要先创建好序列,然后格式为:"用户名"."序列名"."NEXTVAL"
四、插入测试数据
示例代码有,自行测试即可