还是用触发器吧,类似下面这样:
create or replace
TRIGGER "GEW"."TRI_AUTHORITY"
BEFORE INSERT ON GEW_AUTHORITY
FOR EACH ROW
BEGIN
SELECT SEQ_AUTHORITY.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
----------------------------
SEQ_AUTHORITY是序列;
最终选择触发器而非Java写个方法,是从性能和易维护性两个角度进行比较得出的结论:
1、性能更高,肯定的,不解释;
2、易维护性上讲,
有些人总是一刀切地认为数据库的机制,
肯定没有伟大的面向对象语言Java来得更易维护;
但是,
我认为这是,
人云亦云的说法,
死脑筋的想法,
不知变通的做法;
深入进去看,
触发器,主体逻辑就一句SQL语句——从序列取个值,
这难维护个毛啊~~~~~~~~~
so,易维护性同样没有下降;
直接写个方法,触发器移植性不好,一般不用。现在一般就是在mybatis的xml中用sql跑序列做id
你的意思是,序列依然建立在数据库里面,然后mybatis里面写一个SQL语句,去数据库的序列里取nextval?
@lrj1596: 就是selectKey 的使用。你可以看看这个:
1.https://www.cnblogs.com/erma0-007/p/8616256.html
2.https://blog.csdn.net/nangeali/article/details/81278802
@小言W: 我不是问“立即返回最新插入记录的id的方法”;我是问,插入记录的时候,怎么生成被插入记录的id的方法............
如果不用UUID,也不是MySQL(我题目里面说了是用oracle的序列的方式),现在只差一步,从序列里取值,这个“取”的动作,是交给触发器好呢?or在java里面直接写个方法好呢?
@小言W: 哦!!!!sorry,sorry,我误解了你的意思,你这个方案确实是可以的,
但是,我是觉得实际项目中,一般不会出现中途改数据库的情况,也就是说,一般不会出现需要移植的情况,所以,移植性方面的因素,我个人是觉得不必考虑;肯定是项目启动时,就已经定好数据库用哪个了;
另外,持久层框架,我们也不一定用mybatis,这里就跟持久层框架的选择又扯上关系了;
再次,触发器只要写一次就行了,如果用selectKey方案,每个插入记录的地方,都要写一次selectKey逻辑,这个也有点重复的味道~~
所以,我最终还是选择用触发器。
这个mybaits增加
<insert id="insert">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select seq.nextval from dual
</selectKey>
insert into t_user values(#{id},#{name},#{age},#{salary})
</insert>
你这个方案确实是可以的,
但是,我是觉得实际项目中,一般不会出现中途改数据库的情况,也就是说,一般不会出现需要移植的情况,所以,移植性方面的因素,我个人是觉得不必考虑;肯定是项目启动时,就已经定好数据库用哪个了;
另外,持久层框架,我们也不一定用mybatis,这里就跟持久层框架的选择又扯上关系了;
再次,触发器只要写一次就行了,如果用selectKey方案,每个插入记录的地方,都要写一次selectKey逻辑,这个也有点重复的味道~~
所以,我最终还是选择用触发器。