问题(ibatis代码分析请看最后两行):
ibatis完成插入数据后获取插入数据的id,ibatis是通过“selectKey”完成id的获取。
而对于插入的id分两种:
1.预先生成(pre-generate)主键的,如Oracle和PostgreSQL;
2.有些是事后生成(post-generate)主键的,如MySQL和SQL Server
参考自:http://www.iteye.com/post/429901
下面现给出mysql的例子:
<insert id="InsertOrganization" parameterClass="Organization" resultClass="int"> <selectKey property="Id" type="post" resultClass="int"> SELECT LAST_INSERT_ID() AS value </selectKey> INSERT INTO Organizations (Org_Code, Org_Name) VALUES (#Code#, #Name#) </insert>
这里需要注意type="post"定义了selectKey语句在insert语句之后执行type="pre"则是在前面执行,也有人说这里可以不加这个type属性,而直接将selectKey标签放到insert的后面即:
<insert id="InsertOrganization" parameterClass="Organization" resultClass="int"> INSERT INTO Organizations (Org_Code, Org_Name) VALUES (#Code#, #Name#) <selectKey property="Id" resultClass="int"> SELECT LAST_INSERT_ID() AS value </selectKey> </insert>
这个未亲自测试...
而对于psql则应该通过下面方式实现:
一下例子参考自:http://opensource.atlassian.com/confluence/oss/pages/viewpage.action?pageId=407
里面包含了很多数据库的自增的实现方式。这里没有介绍的,可以进去参考。
<insert id="InsertOrganization" parameterClass="Organization" resultClass="int"> <selectKey property="Id" type="post" resultClass="int"> SELECT cast(last_value as int) AS value FROM TableName_Colom_seq </selectKey> INSERT INTO Organizations (Org_Code, Org_Name) VALUES (#Code#, #Name#) </insert>
这里的TableName_Colom_seq其实是就是:数据表名_字段名_seq,而我这边简化成了:
SELECT last_value FROM member_id_seq,
这里需要解释的是:虽然psql是预先生成(pre-generate)主键,但这里的type="post"却是post后执行而不是pre先执行。大家可以在pgadmin里面执行一下上面的sql语句,对比一下,其实获取到的数值是最后一条记录的id值。
而psql的NEXTVAL(“member_id_seq“)获取到的是预先生成的编号。这里至于他是不是预先生成还是获取到最后一条记录,我就没那个功力去研究了。但是如果先执行:
SELECT NEXTVAL(“member_id_seq“)
再执行insert语句,你会发现:nexxtval获取到了1则insert的时候id为2
如果反过来则insert为1,nexxtval为2,
我在pgadmin里面测试过。如果连续执行:SELECT NEXTVAL(“member_id_seq“)
会发现获取到的数值是连续增加的,而不是一样的。
所以说NEXTVAL函数会增加一条记录编号,而insert又会增加一条。
因此两个无法配置使用获取到刚刚插入的数据的id,那么nextVal是作什么用的呢?文档是明明是这样写的?
http://man.chinaunix.net/database/postgresql_8.0_CN/sql-createsequence.html
http://man.chinaunix.net/database/postgresql_8.0_CN/functions-sequence.html
这个地址提到ibatis这种用法的性能问题:http://duooluu.iteye.com/blog/397763
最后有个文章提一下,说的是ibatis的主要流程,核心类,说的比较风趣,即便不学习ibatis也当看一乐子。
http://eils2000.iteye.com/blog/348722