问题(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
分享到:
相关推荐
Ibatis允许开发者自定义SQL、存储过程以及高级映射,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。在主键生成方面,Ibatis提供了多种策略来适应不同的数据库系统和业务需求。 1. **手工设置主键(Manual...
3. **Identity(自动增长)**:对于支持自动增长主键的数据库,如MySQL,Ibatis可以通过`identityInsert`属性开启自动增长功能。插入数据后,数据库会自动为新记录分配一个唯一的主键值。 4. **HiLo算法**:在大...
我做的是 spring + quartz+ mysql and oracle 持久层 ibatis and hibernate 项目用eclipse 导入 不同的数据库 请在数据库运行不同的SQL 脚本 用hibernate 时注意 是什么数据库 hibernate.properties 文件第一二行...
Mybatis-plus 实现主键自增和自动注入时间的示例代码 Mybatis-plus 是一个基于 Mybatis 的增强型 ORM 框架,它提供了许多实用的功能来简化数据库操作。在本文中,我们将通过示例代码,介绍如何使用 Mybatis-plus ...
通过学习“08_传智播客ibatis教程_sql主键生成方式”,开发者能够熟练掌握如何在Ibatis中配置和使用各种主键生成策略,从而提高代码的灵活性和数据库操作的效率。在实际开发中,还需要注意不同数据库对主键生成策略...
《Ibatis/mybatis代码生成工具详解》 在Java开发领域,Ibatis和Mybatis作为两款广泛应用的持久层框架,极大地简化了数据库操作。为了进一步提高开发效率,开发者们设计了一系列的代码生成工具,如"Ibatis Helper"和...
C#中iBatis连接mySQL使用的DLL
在IT行业中,数据库管理和持久化框架的使用是至关重要的,特别是在Web开发中。这个"ibatis + mysql 实例...通过学习和分析这个实例,你可以更好地掌握Ibatis与MySQL的协同工作方式,以及如何在实际项目中应用这些技术。
本文将详细讨论“ibatis驱动+Mysql驱动+SQL驱动”这个组合在软件开发中的应用及其重要性。 首先,让我们从Ibatis开始。Ibatis是一个优秀的持久层框架,它允许开发者将SQL语句直接集成到Java代码中,从而提供了比...
本教程将围绕“简单的ibatis与mysql的交互”这一主题展开,帮助初学者理解如何在Eclipse环境下使用Ibatis与MySQL数据库进行交互。 首先,Ibatis的核心理念是将SQL语句写在XML配置文件中,这样既保持了代码的整洁,...
总的来说,Spring MVC Ibatis Bean 根据mysql数据表的代码生成工具是提升开发效率、降低维护成本的有效手段,它整合了Spring MVC的控制层、Ibatis的数据访问层以及Java Bean的业务实体,帮助开发者快速构建基于MySQL...
总的来说,Ibatis连接MySQL数据库实例展示了如何通过Ibatis进行数据库操作,包括数据源配置、Mapper接口设计、XML映射文件编写,以及Spring整合等关键环节。理解并熟练掌握这些步骤,将有助于开发出更加灵活和高效的...
目前网上罕见的JSF+iBATIS+MySQL示例代码,公司某软件项目所需而做的前期DEMO,只有两个Web页面,用户登录和用户列表,但已经能够说明JSF+iBATIS的典型应用方式。 MyEclipse6.5 项目工程文件,内含SQL建库指令。 ...
经过不断的搜寻,发现很多大神提供的springmvc开发实例存在某些漏洞,对我等又赶时间,又静不下心的人甚是难过,本人经过几天的努力终于在前人基础上做出了完善,提供一个实例给大家,让大家能通过直观的认识快速学习
通过解压"Ibatis01MySql"这个文件,你可以看到实际的项目结构,包括Ibatis的配置文件、Mapper接口、映射文件以及数据库的SQL脚本。这将帮助你更直观地了解Ibatis是如何与MySql协作的,同时也方便你动手实践,加深...
*mysql5.0 *jdk 1.6 *带有所有jar包,可直接运行 本实例实现了用户登陆,用户信息CRUD相关操作。让你感受到了ibatis做o/r mapping的方便快捷。 下次集成dwr进来 create table users( id INT NOT NULL AUTO_...
本工程用于研究Ibatis和MySQL结合使用的方法 本工程编码方式:UTF-8 须执行的SQL语句: CREATE DATABASE `test`; USE `test`; DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` char(36) NOT NULL...
在构建大型分布式系统时,数据库集群是至关重要的组成部分,它能提供高可用性、负载均衡以及数据冗余。本教程将深入探讨如何将Spring、Ibatis框架与MySQL集群集成,以实现高效、可靠的数据库操作。 首先,让我们...
ibatismysql.jar ibatismysql.jar
本实例聚焦于`iBatis` 在实际项目中的应用,以及如何与MySQL数据库相结合。MySQL是广泛使用的开源关系型数据库管理系统,以其高效、稳定和易用性而备受青睐。 `iBatis` 的核心概念包括配置文件、映射文件、...