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

本文介绍了ibatis中如何根据不同数据库特性获取插入数据后的主键ID。对于预生成主键的数据库如PostgreSQL,使用sequence机制;对于后生成主键的数据库如MySQL,则利用LAST_INSERT_ID()函数。文中还对比了不同配置下selectKey标签的行为。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值