`

iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)

阅读更多
iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成(pre)还是后生成(post)。

Oracle设置
<!-- Oracle SEQUENCE --> 
<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product"> 
    <selectKey resultClass="int" keyProperty="id" type="pre"> 
        <![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]> 
    </selectKey> 
    <![CDATA[insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values(#id#,#description#)]]> 
</insert> 

MS SQL Server配置
<!-- Microsoft SQL Server IDENTITY Column --> 
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product"> 
    <![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#) ]]> 
    <selectKey resultClass="int" keyProperty="id" type="post"> 
        <![CDATA[SELECT @@IDENTITY AS ID ]]>
        <!-- 该方法不安全 应当用SCOPE_IDENTITY() 但这个函数属于域函数,需要在一个语句块中执行。 -->
    </selectKey> 
</insert>

上述MS SQL Server配置随是官网提供的配置,但实际上却恰恰隐患重重!按下述配置,确保获得有效主键。
<!-- Microsoft SQL Server IDENTITY Column 改进--> 
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product"> 
    <selectKey resultClass="int" keyProperty="id"> 
        <![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#)
        SELECT SCOPE_IDENTITY() AS ID ]]>
    </selectKey> 
</insert>

MySQL配置
<!-- MySQL Last Insert Id -->
<insert id="insertProduct-Mysql" parameterClass="com.domain.Product">
    <![CDATA[insert into PRODUCT(PRD_DESCRIPTION) values(#description#)]]> 
    <selectKey resultClass="int" keyProperty="id">
        <![CDATA[SELECT LAST_INSERT_ID() AS ID ]]> 
        <!-- 该方法LAST_INSERT_ID()与数据库连接绑定,同属统一会话级别,不会发生上述MS SQL Server的函数问题。 -->
    </selectKey>
</insert>

通过以上方式,可以最大程度上确保插入数据的时候获得当前自增主键。
分享到:
评论
5 楼 snowolf 2009-07-15  
xnxqs 写道
Xml代码
<!-- Microsoft SQL Server IDENTITY Column 改进-->   
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">   
    <selectKey resultClass="int" keyProperty="id">   
        <![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#) 
        SELECT SCOPE_IDENTITY() AS ID ]]> 
    </selectKey>   
</insert>

这个你试过吗?如果直接在selectKey里面写插入语句是会报错的:
by: com.microsoft.sqlserver.jdbc.SQLServerException: 未能准备语句。
我现在也是被这个问题所困扰,用 @@IDENTITY 如果在同一事务内插入二个表,得到的结果不一定是你想要的,但用SCOPE_IDENTITY() 又没法用。不知道其它人是怎么解决。其实网上很多例子是这样写的。
<!-- Microsoft SQL Server IDENTITY Column 改进-->   
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">  
insert into PRODUCT (PRD_DESCRIPTION) values(#description#) 

    <selectKey resultClass="int" keyProperty="id">   
        <![CDATA[        SELECT SCOPE_IDENTITY() AS ID ]]> 
    </selectKey>   
</insert>

但实际这样就把它当二条语句执行了。依旧得不到ID。按你的方法又会报错。怎么办???请楼下的给出解答。我这边IE有问题,没法用UBB。还请见谅

我写出来,当然是我测试过的!环境是 sql server 2005 绝对没有问题
4 楼 xnxqs 2009-07-15  
Xml代码
<!-- Microsoft SQL Server IDENTITY Column 改进-->   
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">   
    <selectKey resultClass="int" keyProperty="id">   
        <![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#) 
        SELECT SCOPE_IDENTITY() AS ID ]]> 
    </selectKey>   
</insert>

这个你试过吗?如果直接在selectKey里面写插入语句是会报错的:
by: com.microsoft.sqlserver.jdbc.SQLServerException: 未能准备语句。
我现在也是被这个问题所困扰,用 @@IDENTITY 如果在同一事务内插入二个表,得到的结果不一定是你想要的,但用SCOPE_IDENTITY() 又没法用。不知道其它人是怎么解决。其实网上很多例子是这样写的。
<!-- Microsoft SQL Server IDENTITY Column 改进-->   
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">  
insert into PRODUCT (PRD_DESCRIPTION) values(#description#) 

    <selectKey resultClass="int" keyProperty="id">   
        <![CDATA[        SELECT SCOPE_IDENTITY() AS ID ]]> 
    </selectKey>   
</insert>

但实际这样就把它当二条语句执行了。依旧得不到ID。按你的方法又会报错。怎么办???请楼下的给出解答。我这边IE有问题,没法用UBB。还请见谅
3 楼 penghao122 2008-07-23  
单独写一个主键生成器啦。没有配置那么麻烦
2 楼 snowolf 2008-07-20  
tibetjungle 写道
snowolf 写道
iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成还是后生成。


<!-- Mysql Last Insert Id -->
<insert id="insertProduct-Mysql" parameterClass="com.domain.Product">
<![CDATA[insert into PRODUCT(PRD_DESCRIPTION) values (#description#)]]> 
<selectKey resultClass="int" keyProperty="id">
<![CDATA[SELECT LAST_INSERT_ID() AS ID ]]> <!-- 该方法LAST_INSERT_ID()与数据库连接绑定,不会发生上述MS SQL Server的函数问题。 -->
</selectKey>
</insert>


通过以上方式,可以最大程度上确保插入数据的时候获得当前自增主键。



mysql中不是可以用auto_increment吗?为什么要这样在ibatis中用?ms sql中也有identity可以用啊,干吗用这么麻烦的方法?如果是为了兼容其他数据库,还是可以考虑。

可能我没有说清楚,我要在插入表的时候获得的当前的主键,自增是有的。如果你要再插入动作的时候获得,一般都怎么做呢?
1 楼 tibetjungle 2008-07-19  
snowolf 写道
iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成还是后生成。


<!-- Mysql Last Insert Id -->
<insert id="insertProduct-Mysql" parameterClass="com.domain.Product">
<![CDATA[insert into PRODUCT(PRD_DESCRIPTION) values (#description#)]]> 
<selectKey resultClass="int" keyProperty="id">
<![CDATA[SELECT LAST_INSERT_ID() AS ID ]]> <!-- 该方法LAST_INSERT_ID()与数据库连接绑定,不会发生上述MS SQL Server的函数问题。 -->
</selectKey>
</insert>


通过以上方式,可以最大程度上确保插入数据的时候获得当前自增主键。



mysql中不是可以用auto_increment吗?为什么要这样在ibatis中用?ms sql中也有identity可以用啊,干吗用这么麻烦的方法?如果是为了兼容其他数据库,还是可以考虑。

相关推荐

    08_ibatis教程_sql主键生成方式.rar

    MySQL、SQL Server等数据库支持字段的自动递增特性。在Ibatis中,只需在Mapper XML文件中的`&lt;insert&gt;`标签中设置`useGeneratedKeys="true"`和`keyProperty="id"`,就可以让数据库自动生成主键。 4. **雪花算法...

    08_ibatis教程_sql主键生成方式.zip

    3. **Identity(自动增长)**:对于支持自动增长主键的数据库,如MySQL,Ibatis可以通过`identityInsert`属性开启自动增长功能。插入数据后,数据库会自动为新记录分配一个唯一的主键值。 4. **HiLo算法**:在大...

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

    2. **身份列(Identity)**:在MySQL、SQL Server等支持自动增长的数据库中,可以设置某一列为主键并自动递增。在Ibatis中,可以在插入语句后直接获取生成的主键值。 3. **雪花算法(Snowflake)**:这是一种分布式...

    iBATIS开发教程.docx

    iBATIS支持多种数据库管理系统,如Oracle、MySQL、SQL Server等。 二、SQL Maps概念 SQL Maps是iBATIS的核心组件,负责将Java对象与数据库表之间的映射。SQL Maps提供了一个灵活的方式来定义数据库表的结构和关系...

    ibatis框架实现的增删改查

    本篇文章将深入探讨如何使用Ibatis框架实现对`student`表的增删改查操作,包括模糊查询以及利用序列自动生成主键。 首先,我们来理解Ibatis的基本概念。Ibatis是由Apache基金会维护的一个开源项目,它是一个SQL映射...

    ibatis 开发指南

    3. **支持多种数据库**:ibatis支持多种数据库,包括MySQL、Oracle、SQL Server等。 4. **易于调试**:由于SQL语句是在应用中明确编写的,因此更容易调试和维护。 #### 三、ibatis快速入门 1. **准备工作** - 下载...

    iBatis_SqlMap的配置总结[1]

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

    ibatis 中sqlMap配置

    对于MySQL等支持自增主键的数据库,`&lt;selectKey&gt;`通常配置在插入语句之后,用于获取新插入记录的自增主键。 5. **SQL输入参数(ParameterClass)**: 在SQL语句中,通过`parameterClass`属性指定输入参数的类型。...

    ibatis_sqlMap的配置总结

    例如,在Oracle或DB2等数据库中,可以通过序列(sequence)来生成主键。为此,需要在插入语句之前配置主键生成逻辑: ```xml SELECT SEQ_TEST.NEXTVAL FROM DUAL insert into ... ``` 对于MySQL这样的自增...

    ibatis net 指导 手册

    - 包括各种主流关系型数据库系统,如MySQL、Oracle、SQL Server等。 - **3.7 缓存模型** - iBATIS提供了缓存机制来提高性能。 - **3.7.1 读取只读与读写缓存(仅Java)** - 读取只读缓存不会被更新,而读写缓存...

    ibatis常见案例

    Ibatis提供了两种主要的分页方式:一是使用`limit`和`offset`(MySQL),二是使用`rownum`(Oracle)。在映射文件中,可以通过动态SQL来实现分页功能。 ```xml SELECT * FROM users WHERE 1=1 != null"&gt; AND ...

    java+ibatis的自我学习编码的论坛

    "sequence.sql"可能是一个数据库脚本,通常用于创建序列,序列在关系型数据库中常用于生成唯一的ID,比如在主键字段上。在Oracle数据库中,序列是自增ID的一种常见实现方式,而在MySQL或PostgreSQL等数据库中,可能...

    好用的代码生成源码

    基于数据库,内建好数据库的model,并支持多种数据库(mysql,sql server,oracle测试通过) 半手工方式,生成的代码放在某个目录,再手工拷贝回来工作区 易于做二次开发,整个生成器本身就是java源代码,源代码核心十分精简,...

    ibatis学习笔记

    4. **高性能查询**:由于Ibatis允许开发者自定义SQL语句,可以根据数据库特性进行优化,因此相比Hibernate等全自动ORM框架,能够提供更高性能的查询能力。 5. **广泛应用**:包括阿里巴巴、慧点科技在内的多家知名...

    iBATIS有关资料

    对于主键自动赋值,iBATIS提供了`&lt;selectKey&gt;`标签来处理。在Oracle中,我们可以这样实现: ```xml SELECT STU_SEQ.NEXTVAL FROM DUAL INSERT INTO STUDENT(ID,NAME,BIRTH_DATE) VALUES(#id#,#name#,#...

    ibatis 批量 增删改查

    3. 考虑数据库的特性,如MySQL的`ON DUPLICATE KEY UPDATE`或Oracle的`BULK COLLECT INTO`。 在Ibatis中,批量操作提供了更高效、更灵活的方式处理大量数据。理解并熟练应用这些技巧,能显著提升应用程序的性能和可...

    repid-framework 使用说明.docx

    - Ibatis 和 Ibatis3:直接修改生成的 `.java` 或 `.xml` 文件中的主键生成策略,如 MySQL 的 `auto_increment`。 - Spring_jdbc:根据策略类型修改 `DAO` 文件中的 `save()` 方法,例如针对 Oracle 的 `sequence`...

    Hibernate笔记

    - **identity:** 如果数据库支持自动增长,设计表时指定该功能适用于MySQL, SQLServer。 - **sequence:** 如果数据库支持sequence,主键由sequence生成,适用于Oracle。 - **native:** 根据数据库类型自动选择...

    初识MyBatis

    MyBatis支持多种数据库,包括MySQL、Oracle、SQL Server等。 2. **MyBatis核心组件** - **SqlSessionFactory**: 是MyBatis的核心,用于创建SqlSession对象,它是线程不安全的,通常在应用启动时创建一个实例并全局...

    hibernate概述

    - **identity**:适用于支持自动增长列的数据库,如MySQL和SQL Server。 - **sequence**:针对Oracle、DB2等支持序列的数据库。 - **uuid**:生成128位的UUID字符串主键。 **Configuration类** `Configuration`类...

Global site tag (gtag.js) - Google Analytics