`
superfofo
  • 浏览: 129828 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

oracle和mysql在ibatis中对自增ID的控制以及MYSQL LAST_INSERT_ID相关说明

阅读更多
sql-map.xml中的代码:(orcale数据库)

<insert id="user.addMember" parameterClass="memberInfo">
    <selectKey resultClass="long" type="pre" keyProperty="membId">
    SELECT SEQ_MC_MEMB.nextval AS VALUE FROM DUAL
   </selectKey>

     insert into
     MC_MEMB
     (
     MEMB_ID,MEMB_LOGIN_NAME,MEMB_REAL_NAME,MEMB_TYPE,MEMB_PASSWORD,REG_IP,REG_DATE
     )
     values
     (
     #membId#,#membLoginName:varchar#,
     #membRealName:varchar#,#membType:varchar#,
     #password:varchar#,#regIp:varchar#,#regDate:TIMESTAMP#
     )
</insert>

========================================

daoimpl层的方法:

public Long addMember(Member member) {
 
   Long pk = (Long)getSqlMapClientTemplate().insert("user.addMember",member);
   return pk;
 
}

得到主键。

以上的ibatis配置是oracle,如果数据库为mysql的话应该这样:(mysql数据库)

<insert id="user.addMember" parameterClass="memberInfo">
    <selectKey resultClass="long" keyProperty="membId">
        SELECT LAST_INSERT_ID();
   </selectKey>

     insert into
     MC_MEMB
     (
     MEMB_ID,MEMB_LOGIN_NAME,MEMB_REAL_NAME,MEMB_TYPE,MEMB_PASSWORD,REG_IP,REG_DATE
     )
     values
     (
     #membId#,#membLoginName:varchar#,
     #membRealName:varchar#,#membType:varchar#,
     #password:varchar#,#regIp:varchar#,#regDate:TIMESTAMP#
     )
</insert>

转帖:http://hi.baidu.com/mutourenoo/blog/item/63f43035f45f1083a71e121d.html

以下补充一下自己的使用心得:
mysql与oracle有一点点的区别,oracle中设置sequenceId作为自增的变量,而mysql则通过LAST_INSERT_ID来获取控制这个字段的自增属性。关于LAST_INSERT_ID,有以下的解释:
引用

LAST_INSERT_ID 是与table无关的。
1、如果向表a插入多条数据后,LAST_INSERT_ID返回的是第一条插入的record的Id;
2、如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID就会改变。

一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。
但在多线程情况下,就不行了。在多用户交替插入数据的情况下max(id),显然不能用。
如:
用户a插入后,用户b插入,此时用户a旨在获取刚刚用户a插入的自增id,但此时却因为用户b对该自增id进行了操作而通过通过max(id)获取了此时b已操作过的自增id。

这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update操作生成的第一个record的ID。
这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。

查看LAST_INSERT_ID相关说明如下:
自动返回最后一个 INSERT 或 UPDATE 操作为 AUTO_INCREMENT 列设置的第一个发生的值。
The ID that was generated is maintained in the server on a per-connection basis.
Important: If you insert multiple rows using a single INSERT statement, LAST_INSERT_ID() returns the value generated for the first inserted row only.

最后,使用以上的mysql配置,需要对主键设置为自增,否则会在插入的时候出现以下的异常:
SqlMapClient operation; SQL [];  
--- The error occurred in com/dao/ibatis/sqlmap/info_SqlMap.xml. 
--- The error occurred while applying a parameter map. 
--- Check the question_info.insert-InlineParameterMap. 
--- Check the statement (update failed). 
--- Cause: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '0' for key 1; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:  
--- The error occurred in com/dao/ibatis/sqlmap/info_SqlMap.xml. 
--- The error occurred while applying a parameter map. 
--- Check the question_info.insert-InlineParameterMap. 
--- Check the statement (update failed). 
--- Cause: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '0' for key 1
Caused by: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '0' for key 1
分享到:
评论

相关推荐

    mysql中实现sequence.pdf

    在MySQL中,序列(Sequence)通常用于生成...总的来说,虽然MySQL不像某些数据库那样直接支持序列,但通过`LAST_INSERT_ID()`函数和巧妙的数据表设计,我们仍然可以在MySQL中实现序列的功能,满足获取唯一标识的需求。

    ibatis_sqlMap的配置总结

    对于MySQL这样的自增主键数据库,则可以在插入语句之后通过`LAST_INSERT_ID()`来获取新生成的主键值: ```xml &lt;insert id="insertAccount" parameterClass="Account"&gt; SELECT LAST_INSERT_ID() insert into ....

    08_传智播客ibatis教程_sql主键生成方式

    这段配置表示在插入用户后,使用MySQL的`LAST_INSERT_ID()`函数获取自增主键的值,并将其赋给User对象的id属性。 通过学习“08_传智播客ibatis教程_sql主键生成方式”,开发者能够熟练掌握如何在Ibatis中配置和使用...

    ibatis 中sqlMap配置

    在 iBatis 框架中,SQLMap配置是整个应用程序的核心部分,占据了大部分的开发工作。下面将详细解析 iBatis 中SQLMap配置的关键知识点: 1. **命名空间(Namespace)**: 命名空间是iBatis配置中的一个重要概念,它...

    iBatis_SqlMap的配置总结[1]

    - **后获取主键**:对于自动增长的主键,如MySQL,`&lt;selectKey&gt;`可以在插入语句之后配置,利用`LAST_INSERT_ID()`获取自增主键。 5. **SQL参数(ParameterClass)**: - 插入操作:`parameterClass`指定传入参数...

    sqlmap配置.pdf

    在 MySQL 中,可以使用 LAST_INSERT_ID() 函数来获取主键值。 SQL 入参 SQL 入参是指在 SqlMap 中定义的 parameterClass 属性。例如:&lt;insert id="insertAccount" parameterClass="Account"&gt;...&lt;/insert&gt;。SQL 入...

    ibaits配置总结[参考].pdf

    而对于MySQL等支持自增主键的数据库,通常在插入语句后配置`&lt;selectKey&gt;`,如`SELECT LAST_INSERT_ID()`,以获取新插入行的主键。 **参数类(Parameter Class)**在iBatis中扮演着重要角色。插入语句的参数可以是类...

    mybatis insert返回主键代码实例

    SELECT LAST_INSERT_ID() AS ID &lt;/insert&gt; ``` 在上面的代码中,`selectKey` 元素将获取最后插入的自动增长的主键值,并将其赋值给参数对象的 `id` 字段。 在实际应用中,我们可能需要在插入数据之后执行其他...

    mybatis文档

    - MySQL:利用自增长特性,通过 SQL 语句 `SELECT LAST_INSERT_ID()` 获取最后插入行的 ID。 #### 7. 关联关系处理 - **处理方式**:支持多种关联查询方式,包括连接查询和两次查询方式。 - 一对多:使用连接...

    springmybatis

    3. 在session 中完成对数据的增删改查和事务提交等. 4. 在用完之后关闭session 。 5. 在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。 mybatis实战教程(mybatis in action)之一:开发环境搭建 ...

Global site tag (gtag.js) - Google Analytics