[什么鬼]
ibatis在使用SqlMapClientTemplate的 insert(String statementName, Object parameterObject) 或 insert(String statementName) 的插入操作时,会返回一个Object对象,该Object其实就是我们插入时的主键值。
但是我返回的却是一个null。
当时我上网查了一下,大部分的人都是说给<insert>标签内添加一个:
<selectKey resultClass="int" keyProperty="id">
... ...
</selectKey>
在MySQL中我们可以这样实现:
<selectKey resultClass="int" keyProperty="id">
SELECT @@IDENTITY AS ID
</selectKey>
其中id(ID)必需是那个表对应的Bean属性。
但是在Oracle中并没有identity,而只有sequence(序列),所以这上面例子不能使用在oracle中。
[疑问] :那么oracle该写什么?或者该怎么写?
[解决方法]:
在这里我先直接贴解决方法:
<insert id="add">
<selectKey resultClass="int" keyProperty="id" >
SELECT seq_t_user.nextval AS id FROM dual
</selectKey>
insert into t_user(id,name) values(seq_t_user.currval,#name#)
</insert>
[解释一下] :
不管在Mysql还是oracle数据库中的insert语句都是没有返回值的,但是,SqlMapClientTemplate的insert方法却有返回值,那它的值从哪里来呢?
我们一般要获得当前表中的最新id,就恰恰是我们上面写的<selectKey>标签的内容:
MySQL获取最新的id: SELECT @@IDENTITY AS ID (用select @@identity是为了得到上一次插入记录时自动产生的ID。)
Oracle获取最新的id: SELECT seq_t_user.nextval AS id FROM dual (seq_t_user是一个sequence对象,seq_t_user.nextval是获取下一个id)
所以,我们可知<selectKey>的返回值便是我们SqlMapClientTemplate中insert方法的返回值。
[说多点] :
1. 关于MySQL和Oracle的获取最新的id的语句不一样的问题
因为MySQL有auto_increment属性,可以给需要自动增长的主键赋予这个属性,便可以实现自动增长的效果,而这个@@identity就可以获取得到上次操作后的产生的id。
虽然oracle没有auto_increment属性,但是有sequence,我们可以给表创建一个sequence,让它实现自动增长。然后再通过sequence的属性currval或者nextval获取当前的id号或下一个操作的id号。
2. 关于Sequence与indentity的区别与联系
Sequence与indentity的基本作用都差不多。都可以生成自增数字序列。
Sequence是数据库系统中的一个对象,可以在整个数据库中使用,和表没有任何关系;indentity仅仅是指定在表中某一列上,作用范围就是这个表。