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

ibatis获取主键自动增长ID

阅读更多

三种数据库

本文和大家讲一下如何使用ibatis来获取刚刚插入数据的ID的方法,也是在网上找到的,挺实用。

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

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

MS SQL Server配置

1<!-- Microsoft SQL Server IDENTITY Column -->   
2<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">   
3    <![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#) ]]>   
4    <selectKey resultClass="int" keyProperty="id" type="post">   
5        <![CDATA[SELECT @@IDENTITY AS ID ]]> 
6        <!-- 该方法不安全 应当用SCOPE_IDENTITY() 但这个函数属于域函数,需要在一个语句块中执行。 --> 
7    </selectKey>   
8</insert> 
上述MS SQL Server配置随是官网提供的配置,但实际上却恰恰隐患重重!按下述配置,确保获得有效主键。
1<!-- Microsoft SQL Server IDENTITY Column 改进-->   
2<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">   
3    <selectKey resultClass="int" keyProperty="id">   
4        <![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#) 
5        SELECT SCOPE_IDENTITY() AS ID ]]> 
6    </selectKey>   
7</insert> 
MySQL配置
1<!-- MySQL Last Insert Id --> 
2<insert id="insertProduct-Mysql" parameterClass="com.domain.Product"> 
3    <![CDATA[insert into PRODUCT(PRD_DESCRIPTION) values(#description#)]]>   
4    <selectKey resultClass="int" keyProperty="id"> 
5        <![CDATA[SELECT LAST_INSERT_ID() AS ID ]]>   
6        <!-- 该方法LAST_INSERT_ID()与数据库连接绑定,同属统一会话级别,不会发生上述MS SQL Server的函数问题。 --> 
7    </selectKey> 
8</insert>
通过以上方式,可以最大程度上确保插入数据的时候获得当前自增主键。

引用:http://sunbin.iteye.com/blog/1450943

分享到:
评论

相关推荐

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

    在Ibatis中,只需在Mapper XML文件中的`&lt;insert&gt;`标签中设置`useGeneratedKeys="true"`和`keyProperty="id"`,就可以让数据库自动生成主键。 4. **雪花算法(Snowflake Algorithm)**: 在分布式环境下,为了保证...

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

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

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

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

    iBatis_SqlMap的配置总结[1]

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

    Ibatis入门级教程

    Ibatis提供了多种主键生成策略,比如`identity`(标识列,适用于自动增长类型)、`sequence`(序列,Oracle常用)和`guid`(全局唯一标识符)。在Oracle环境下,我们通常会创建一个序列对象,然后在映射文件中配置...

    经典开源插件之ibatis

    - **创建数据库与表结构**:根据示例中的SQL语句创建名为`itcast`的数据库及`student`表,表中包括`id`(主键自增长)、`firstname`和`lastname`三个字段。 - **实体类定义**:定义一个名为`Student`的Java类,...

    一个最简单的IBatis增删改查操作例子

    例如,可以创建一个名为`users`的表,包含`id`(主键)、`username`和`password`等字段。 2. Java实体类:根据数据库表结构,创建对应的Java对象,如`User`类,包含相应的属性。 3. SQL映射文件(Mapper XML):在...

    ibatis PPT

    对于自动增长的主键,iBatis 提供了 `&lt;selectKey&gt;` 标签来处理。在插入数据后,这个标签会执行一个单独的 SELECT 语句来获取新生成的主键值,并将其绑定到 Java 对象的相应属性上。 **优点** iBatis 的优点包括: 1...

    Ibatis入门教程

    - 接着创建`t_user`表,包含三个字段:`id`(自增长主键)、`user_name`(用户名)和`email`(邮箱)。 2. **创建存储过程**: - 定义一个存储过程`showUserData`,用于从`t_user`表中查询所有用户的详细信息,并...

    mybatis insert返回主键代码实例

    在上面的代码中,`selectKey` 元素将获取最后插入的自动增长的主键值,并将其赋值给参数对象的 `id` 字段。 在实际应用中,我们可能需要在插入数据之后执行其他操作,例如,获取插入后的主键值,以便进行下一步的...

    Hibernate笔记

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

    Java程序员面试综合

    - 示例:在 1NF 的基础上增加主键,并确保所有非主键字段直接依赖于主键。 - **第三范式 (3NF)** - 在满足 2NF 的基础上,消除传递依赖。 - 示例:从表中移除可以通过其他非主键字段间接获得的信息。 #### 存储...

    mybatis第一天课堂笔记.docx

    - **查询**:根据用户ID查询用户信息,可以使用`select`标签定义SQL语句。 - **模糊查询**:根据用户名模糊查询,利用动态SQL功能实现。 - **添加**:使用`insert`标签定义插入语句,并处理自增主键返回。 - **删除*...

    高效使用JavaEE+ORM框架.pdf

    4. Delete(删除):删除操作通常基于主键ID,但建议先通过ORM查询对象,确保正确的目标被删除。 在实际开发中,选择合适的ORM框架,理解并熟练掌握其原理和最佳实践,是提高效率、减少错误的关键。常见的ORM框架如...

    springmybatis

    &lt;id column="id" property="id" /&gt; 查询列表的语句在 User.xml 中 程序代码 程序代码 &lt;!-- 返回list 的select 语句,注意 resultMap 的值是指向前面定义好的 --&gt; &lt;select id="selectUsers" ...

    JdbcTemplateTool.zip

    但是前提是需要在主键的getter上标上 @Id 注解@Id public Integer getId() {  return id; }例子@Test public void testGet() throws NoIdAnnotationFoundException, NoColumnAnnotationFoundException, ...

    java面试知识

    - **内存泄露**:不再使用的对象没有被垃圾回收机制及时回收,导致内存占用持续增加。 - **内存溢出**:当程序申请内存超过系统所能提供的最大内存时,会出现内存溢出错误。 ##### 单例 - **目的**:确保某个类...

Global site tag (gtag.js) - Google Analytics