大家都知道像mysql,serveSql这样的数据库都提供有自增id的功能,而像oracle这样的数据库采取的是序列的方式来实现自增主键的,所以如果通过mybatis插入一条数据后返回主键id的方式也是不同的,网上有很多种说法,大都没说太明白,下面举个例子,详细说明一下,避免再入坑
建表语句
CREATE TABLE sys_student
(
id int PRIMARY KEY NOT NULL AUTO_INCREMENT,
name varchar(50) COMMENT '名字'
);
ALTER TABLE sys_student COMMENT = '学生表';
一、mysql
mysql有自增功能,可以采用useGeneratedKeys="true"开启判断是否是自增ID, keyProperty="id" 指定插入数据后自增ID返回时赋值给实体类的那个属性(这里是id属性)
<insert id="insertStudent" useGeneratedKeys="true" keyProperty="id">
insert into sys_student(name) values(#{name})
</insert>
二、oracle
创建序列语句:
CREATE SEQUENCE student_seq
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE ;
创建触发器:
CREATE OR REPLACE TRIGGER student_trigger
BEFORE INSERT ON sys_student
FOR EACH ROW
BEGIN
SELECT student_seq.NEXTVAL INTO :NEW.id FROM DUAL;
END;
这里要说明一下,通常oracle实现自增,是通过触发器实现的。先建一个序列,再建一个触发器,每次在执行插入时,都会触发触发器实现自动加1。
像Oracle数据库采用序列来作为自增主键,可以通过 selectKey子来获取主键值
<insert id="insertStudent" useGeneratedKeys="false">
<selectKey resultType="java.lang.Integer" keyProperty="id" order="BEFORE">
select student_seq.nextval from dual
</selectKey>
insert into sys_student(name) values(#{name})
</insert>
网上很多都是这样说的,但是最后的你可能会发现每次都自增2,而不是自增1,那么问题出在哪了呢?
问题就出在了这句‘ select student_seq.nextval from dual’,这句的意思就是每执行一次,自增序列都会加1,如果你的oracle是通过触发器实现的,那么恭喜你,你会发现每插入一条数据,都会自增2,之所以这样是因为你执行了两次 student_seq.nextval 。
还有一种就是利用max()函数,这种也是有问题的,而这个问题还不太容易发现,如果刚开始你的表里一条数据都没有,第一次执行,你会发现返回自增主键id,居然是null,这个问题应该也很好解决,把order="BEFORE" 改成 order="AFTER",没准能行,我没有试,有兴趣可以自己试一下。
<insert id="insertStudent" useGeneratedKeys="false">
<selectKey resultType="java.lang.Integer" keyProperty="id" order="BEFORE">
select max(id) from sys_student
</selectKey>
insert into sys_student(name) values(#{name})
</insert>
正确的方法是什么呢?
如果你有需要返回自增后的主键id,如果已经建了触发器,那么就删掉触发器,每次执行插入时,手动实现自增,如下,注意标红的地方,如果没有需要要返回自增id,那么采用触发器实现自增是完全没有问题的。
删除触发器:
DROP TRIGGER student_trigger;
<insert id="insertStudent" useGeneratedKeys="false">
<selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER">
select student_seq.currval from dual
</selectKey >
insert into sys_student(id,name) values(student_seq.nextval,#{name})
</insert>
文章浏览阅读190次。导读:该文是关于静电点电荷论文范文,为你的论文写作提供相关论文资料参考。王静 王亚芳 董爱国 程方锐 张瑞杰 吕砚荻(中国地质大学(北京)物理实验示范中心 北京 100083)摘 要:Matlab是一种功能强大、效率高、便于进行科学和工程计算的交互式软件包.本文使用Matlab软件,给出点电荷和“无限长”直导线,以及同轴圆柱电极产生的静电场的等势线分布图.结果表明利用Matlab软件..._程方锐博士
文章浏览阅读1.5k次。前面跟大家提到过 elementUI验证的问题,那么今天就来看看 点击对话框和关闭按钮 怎么清空验证,清空form表单,避免二次点击还会有 验证错误的提示1、首先在你的对话框 取消按钮 加一个click事件,例如:(ps::callOf里面的addGroupData和ref一 一对应起来)取 消确 定2、点击取消按钮,关闭对话框,清除表单验证callOf(formName){this.creatG..._清除所有elementui form清楚表格交验
文章浏览阅读3.7k次。一开始用localStorage,不论打开多少个页面,哪怕关掉重新打开,同一个网站下的存储的数值还在,问题是,不能同时登录多个账户,以及设置过期时间等后来启用sessionStorage,可以登录多个账户了,页面一关存储的数值也会自动被清掉,不存在安全问题;但来了新的问题,登录后,父页面跳转打开的新页面,两个页面之间的值无法共享了。后来想了一下,可以利用window.opener来解决,自己写..._sessionstorage 不共享
文章浏览阅读1.2k次。我这里用的是idea2019.2的版本第一步:第二步:第三步:第四步:剩下的直接next_idea怎么导入父子结构的maven项目
文章浏览阅读102次。Communication channels are an essential element of every communication system. These channels actually carry the data from one computer to another. There are two categories of communication channels. ..._fiber-optic cable transmits data
文章浏览阅读67次。using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;...
文章浏览阅读3.1k次。win7系统发现桌面右下角网络图标显示红叉或图标正常不能上网,并且打开网络和共享中心显示,依赖的服务或组无法启动,这时候我们需要打开Wlan autoconfig服务。但是在服务项目中找到Wlan autoconfig服务是启用时显示错误代码为1068,怎么才能解决这个问题呢?接下去系统城小编为大家讲解解决方法。1、我们来win7系统的桌面,点击开始在菜单中点击“运行”;2、点击运行弹出来的运行..._win7wlan依赖服务1068错误 csdn
文章浏览阅读400次。附加进程调试_插件附加进程调试的步骤
文章浏览阅读6k次。《java笔试题答案详解[共7页]》由会员分享,可在线阅读,更多相关《java笔试题答案详解[共7页](7页珍藏版)》请在人人文库网上搜索。1、java笔试题以及答案详解 一 一、单项选择题 1Java是从()语言改进重新设计。AAda BC+ CPasacal DBASIC答案:B2下列语句哪一个正确()A Java程序经编译后会产生machine codeB Java程序经编译后会产生byte..._数组是一种对象还是原生类
文章浏览阅读141次。Starting with Oracle9i you have the ability to view the estimated CPU, TEMP and I/O costs for every SQL execution ..._optimizer_cost
文章浏览阅读88次。主机 iprouter 192.168.10.254 192.168.24.254web分发器 192.168.24.1mysql分发器 192.168.24.2web服务器1192.168.24.10web服务器2 192...._keepalive+lvs+mysql+apache+lamp的目的
文章浏览阅读1.4w次,点赞5次,收藏23次。CPC客户端安装经验总结!_cpc客户端