ibatis psql/mysql 主键 自增 以及ibatis代码分析

问题(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

你可能感兴趣的:(sql,mysql,ibatis,SQL Server,PostgreSQL)