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

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

Oracle设置

Xml代码  

  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配置

Xml代码  

  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配置随是官网提供的配置,但实际上却恰恰隐患重重!按下述配置,确保获得有效主键。

Xml代码  

  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配置

Xml代码  

  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>

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

时间: 2024-08-06 14:19:43

iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】的相关文章

JDBC学习笔记(6)——获取自动生成的主键值&amp;处理Blob&amp;数据库事务处理

获取数据库自动生成的主键 [孤立的技术是没有价值的],我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. 具体的代码实现: 1 /** 2 * 获取数据库自动生成的主键 3 */ 4 @Test 5 public void testGetKeyValues(){ 6 Connection connection=null; 7 PreparedStatement preparedStatement=null; 8 ResultSet rs=n

javaweb学习总结(三十七)——获得MySQL数据库自动生成的主键

测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: 1 package me.gacl.demo; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import me.gacl.utils.JdbcU

PowerDesigner中表名过长,自动生成的主键名截取的问题

在PowerDesinger中,若表名过长,自动生成的主键名会被自动截取. 解决如下:DataBase/Edit Current DBMS/Scripts/Objects/PKey/ConstName中找到Value的值,默认是 PK_%.U27:TABLE%,U27表示截取27个字符.改成PK_%TABLE%主键名就不会被截取了. 同理,对生成的约束名常常因为截断字符串而导致重名错误,可以放开. DataBase/Edit Current DBMS/Scripts/Objects/Refere

(jdbc)取得数据库自动生成的主键方法

一些类,在前面的博客中有,就不重复了 public class Test2 { TestDAO t=new TestDAO(); /*前提是数据表的主键是自动增加的, *取得数据库自动生成的主键 * */ @Test public void testGetKeyValues() throws Exception{ Connection connection=null; PreparedStatement preparedStatement=null; try { String sql="inse

得到数据库自动生成的主键值

package com.atguigu.jdbc; import java.sql.Connection;import java.sql.Date;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.Statement; import org.junit.Test; public class JDBCTest { /** * 得到

JDBC 获取自动生成的主键

为什么需要获取自动生成的主键 例如: 原文地址:https://www.cnblogs.com/wbyixx/p/12129054.html

Oracle\MS SQL Server Update多表关联更新

原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.我们先来讨论根据其他表数据更新你要更新的表   一.MS    SQL    Server   多表关联更新      sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来.虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就

获取自动生成的主键

步骤:        1)设置需要返回生成的主键,[通过preparedStatement的第二个参数]            PreparedStatement prepareStatement(String sql, int autoGeneratedKeys);//创建一个默认 PreparedStatement 对象,该对象能获取自动生成的键            参数:                autoGeneratedKeys - 指示是否应该返回自动生成的键的标志,     

mysql获取自动生成的主键报错:Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.execu

今天项目中需要获取刚插入的自动增长 的主键值: pstmt=conn.prepareStatement(sql); ... rs=pstmt.getGeneratedKeys(); 谁知道报错:Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.execu 上网查了之后才知道原来是5.1.5的包,替换成5.1.17之后,如下生成主键的代码都会报错: Gener