关于ibatis insert返回值

来源:互联网 发布:云计算 校园招聘 编辑:程序博客网 时间:2024/05/18 02:02

[什么鬼]

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仅仅是指定在表中某一列上,作用范围就是这个表。



0 0
原创粉丝点击