最近项目用到插入记录后,根据生成的主键,再做其他操作,但是mybatis返回的是影响的行书,网上搜,大部分是如下形式
<insert id="add" parameterType="..." useGeneratedKeys="true" keyProperty="id">
...
</insert>
此种用法仅限于像mysql,sqlserver这样主键有自增功能的数据库,但是oracle不行.
咱也不讨论为什么oracle不弄简单的主键自增,而要用序列来做主键,也许是让用户更自由些?但是我始终认为,主键不应该能让用户决定,应该强制由数据库来管理,能避免些错误,例如,插入时..嘿嘿.
网上搜到能用的反会主键的方法如下:
<insert id="add" parameterType="...">
<selectKey resultType="java.lang.Short" order="BEFORE" keyProperty="id">
SELECT SEQ.NEXTVAL FROM DUAL
</selectKey>
...
</insert>
这种方法确实能得到主键,但是还是那一点,我认为主键不应该是开发人员需要关心的,而是由数据库强制的,自定义的,所以,我始终坚持自增要用序列加触发器来实现
所以我放弃了这种<selectKey>的使用方法
想起了用sqlserver时怎么返回主键呢,
insert into XX表 values(aa,bb,c);select @@IDENTITY
那么我们用mybatis时,selectKey可以在插入前得到序列,是不是可以插入后,再得到刚刚序列的值呢,是不是那个before可以改成after呢,于是尝试了如下写法,成功了...
<insert id="add" parameterType="...">
<selectKey resultType="java.lang.Short" order="AFTER" keyProperty="id">
SELECT SEQ.CURRVAL FROM DUAL
</selectKey>
...
</insert>
如此,id是数据库的触发器自动生成,又可以得到插入后实体的主键,即使开发人员忘记写selectKey也不会出错(或不需要得到主键)