ibatis实战之插入数据(自动生成主键)

---------

如果你将数据库设计为使用自动生成的主键,就可以使用ibatis的<selectKey>元素(该元素是<insert>元素的一个专用子元素)来获取这些自动生成的主键的值并将其保存在对象中。完成这项工作可以有两种方式,具体选择何种方式由你所使用的具体的主键生成技术来确定。

第一种方式是,当你把记录插入到数据库中并且数据库为该记录自动生成了主键值之后,就立即抓取该键值。此时要注意的是,必须确保所使用的数据库驱动程序确实能返回你执行上一条insert语句所得到的键值。

第二种方式是在插入记录之前就获取键值。如果你使用数据库交互工具来插入记录,那么这种方式需要更多的工作量,因为你必须在插入记录之前先分配一个键值。然而,这种策略可以避免因为多线程同时插入数据并在记录插入之后才获取键值所带来的潜在风险,并且通常是最安全的方式,因为它几乎不需要对代码作任何假定。使用第一种方式可能会出现潜在的问题,使得应用程序无法像期望的那样顺利执行。但是使用这种方式,我们所需要的就是确保所得到的键值是唯一的。我们不需要数据库在当前会话中管理键值,只需要它生成并把键值返回给我们即可。

对于这两种方式,ibatis都可以帮助更轻松地成任务。<selectKey>元素使得这个任务对于你的应用程序来说完全是透明

的(至少在调和代码中)。insert方法的签名如下:

Java代码  

  1. Object insert(String id,Object parameterObject)throws SQLException;

insert方法返回一个Object对象的原因是:使你能够得到所生成的键值。例如,假设你的应用程序中有如下这个已映射语句和代码(使用了前面所介绍的第二种方式):

Xml代码  

  1. <insert id="insert">
  2. <selectKey keyProperty="accountId" resultClass="int">
  3. SELECT nextVal(‘account_accountId_seq‘)
  4. </selectKey>
  5. INSERT INTO Account(
  6. accountId,username,password
  7. )VALUES(
  8. #accountId#,#username#,#password#
  9. )
  10. </insert>

Java代码  

  1. Integer returnValue = (Integer)sqlMap.insert("Account.insert",account);

returnValue变量将包含所生成的键值。但是还不止这些---<selectKey>元素中的keyProperty属性会告诉ibatis获取

键值并将其插入对象的相应属性的值。这意味着如果你愿意,你甚至可以忽略返回值,因为被插入的对象的主键已经被设置为了该值。

需要记住的是:<selectKey>元素其实也定义了一个已映射语句,并且该已映射语句可以访问的参数映射与包含该已映射

语句的insert相同。因此,在一上个示例中,如果想要选择用于记录插入的序列(sequence),就可以使用这样一个已映射

语句:

Xml代码  

  1. <insert id="insertSequence">
  2. <selectKey keyProperty="accountId" resultClass="int">
  3. SELECT nextVal(#sequence#)
  4. </selectKey>
  5. INSERT INTO Account(
  6. accountId,username,password
  7. )VALUES(
  8. #accountId#,#username#,#password#
  9. )
  10. </insert>

原文地址:https://www.cnblogs.com/mabingxue/p/8990837.html

时间: 2024-10-10 06:30:01

ibatis实战之插入数据(自动生成主键)的相关文章

Mybatis 插入数据后返回主键值

Oracle中获取刚刚插入记录的主键值: <insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo">     <selectKey resultType="java.math.BigDecimal" order="BEFORE" keyProperty="id">    SELECT U_US

MyBatis在Oracle中插入数据并返回主键的问题解决

引言:  在MyBatis中,希望在Oracle中插入数据之时,同时返回主键值,而非插入的条数... 环境:MyBatis 3.2 , Oracle, Spring 3.2   SQL Snippet in XML Configuration: <insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo"> <selectKey resultType="

ORACLE uuid自动生成主键

-- Create table create table TECHNOLOGYCOMPANY ( ID VARCHAR2(32) default SYS_GUID() not null, FLOWID VARCHAR2(50), CONPANYID NUMBER, ISCOMMUNICATION VARCHAR2(10) ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1

数据库插入数据返回当前主键ID值方法

环境:SQL Anywhere 9.0.2 创建语句: create table test(    id int primary key identity(1,1),    name varchar(20)) 当我们插入一条数据的时候,我们很多时候都想立刻获取当前插入的主键值返回以做它用.我们通常的做法有如下几种: 1. 先 select max(id) +1 ,然后将+1后的值作为主键插入数据库: 2. 使用特定数据库的 auto_increment 特性,在插入数据完成后,使用 select

java UUID.randomUUID()自动生成主键作为Id或文件路径

UUID.randomUUID().toString()是javaJDK(1.5以上的版本)提供的一个自动生成主键的方法,它生成的是以为32位的数字和字母组合的字符,中间还参杂着4个 - 符号. 作用:它可以作为我们表的标识列来增加,比序列增长更加方便.当然还可以用来拼接作为路径,或者图片的前缀名等等. 使用原因: 文件命名或者其他使用时间命名对于高并发会存在风险,使用UUID会规避风险, import java.util.UUID: UUID.randomUUID().toString():

如何使用myBatis在数据库中插入数据并返回主键

在MyBatis中,希望在Oracle中插入数据的同时返回主键值,而非插入的条数. ① oracle使用 selectKey. U_USER_INFO_SEQ 是在数据库中定义好的这张表关联的序列sequence, Nextval是获取自增的id <insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo"> <selectKey resultType=&quo

Laravel 5 插入数据后返回主键ID

方法一: $info = DB::table('表名')->insertGetId(['imgName' => $fileName]);//图片名入库后返回添加数据行的主键ID 方法二:(适用于Mysql数据库) 执行原生SQL,然后返回新添加的主键ID值 语法:INSERT INTO 表名(字段1, 字段2, 字段3) VALUES (值1, 值2, 值3);SELECT @@IDENTITY AS returnName; #返回刚插入的数据的主键ID并起别名为 "returnNa

mybatis插入数据并返回主键(oracle)

通常我们执行一个inser语句,即使有返回,也只是会返回影响了多少条数据 @insert("insert into t_user (id,name) values (suser.nextval,#{item.name,jdbcType=VARCHAR})") void insert(@Param("item") TUser t); 但在有些时候,我们还需要获得插入数据的主键,在oracle数据库中,主键并没有办法自动增长,无法使用insert对应的useGenera

DAO以及获取自动生成主键值

package com.alibaba.sql; import java.lang.reflect.InvocationTargetException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.A