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

---------

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

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

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

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

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

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

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

  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>
  1. Integer returnValue = (Integer)sqlMap.insert("Account.insert",account);

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

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

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

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

语句:

  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>

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

  1. mysql插入数据自动生成主键uuid

    DemoMapper.java //注意方法的返回值必须是void; void add(Demo demo); ============================================ ...

  2. mybatis中Oracle及mysql插入时自动生成主键以及返回主键

    mysql的方式: 方式一: useGeneratedKeys="true" keyProperty="id" 方式二: <selectKey keyPr ...

  3. mybatis添加信息自动生成主键

    一.使用Oracle数据库 举例:添加员工的时候自动生成主键 1.在dao接口中声明方法 2.在mapper中实现该方法 需要先在数据表中创建序列 3.测试 注意:在调用过save方法之后,emp对象 ...

  4. mybatis的插入数据后的主键获取

    为什么要在插入数据后获取主键:当有一个订单表和订单详情表,当插入订单表的数据后,需要在订单详情表插入该订单的具体购物情况,订单详情表需要的一个列是订单表的主键或者订单ID.(通俗讲:A表的主键是B表的 ...

  5. mybatis 插入数据时返回主键

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:显然,假如主键是你生成后插入的,自然你已经有主键了,显然不需要我们再去获得,所以我们这里处理的是当主键 ...

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

    引言:  在MyBatis中,希望在Oracle中插入数据之时,同一时候返回主键值,而非插入的条数... 环境:MyBatis 3.2 , Oracle. Spring 3.2   SQL Snipp ...

  7. [oracle] 如何使用myBatis在数据库中插入数据并返回主键

    在MyBatis中,希望在Oracle中插入数据的同时返回主键值,而非插入的条数. ① oracle使用 selectKey. U_USER_INFO_SEQ 是在数据库中定义好的这张表关联的序列se ...

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

    方法一: $info = DB::table('表名')->insertGetId(['imgName' => $fileName]);//图片名入库后返回添加数据行的主键ID 方法二:( ...

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

    通常我们执行一个inser语句,即使有返回,也只是会返回影响了多少条数据 @insert("insert into t_user (id,name) values (suser.nextva ...

随机推荐

  1. 【PAT】B1009 说反话

    在输入时直接分别将每个单词放入字符串,逆序输出字符串数组 #include<stdio.h> int main(){ int num=0; char ans[90][90]; while( ...

  2. python基本数据类型之------列表

    一.列表----list 列表是有序的,列表元素可以被修改 =================list之灰魔法================ 1.列表格式: 中括号括起来, 逗号分隔每个元素, 列表 ...

  3. June. 21 2018, Week 25th. Thursday

    Summertime is always the best of what might be. 万物最美的一面,总在夏季展现. From Charles Bowden. It was June, an ...

  4. MYSQL的binlog日志

    binlog 基本认识 MySQL的二进制日志以事件形式,记录了所有的DDL和DML(除了数据查询语句)语句,及语句执行消耗时间. MySQL的二进制日志是事务安全型的,是MySQL最重要的日志. b ...

  5. MySQL高级知识(十五)——主从复制

    前言:本章主要讲解MySQL主从复制的操作步骤.由于环境限制,主机使用Windows环境,从机使用用Linux环境.另外MySQL的版本最好一致,笔者采用的MySQL5.7.22版本,具体安装过程请查 ...

  6. Java面试题归类

    一.Java基础 1. String类为什么是final的. 2. HashMap的源码,实现原理,底层结构. 3. 说说你知道的几个Java集合类:list.set.queue.map实现类咯... ...

  7. solidity learning (1)

    学习文档笔记:http://solidity-cn.readthedocs.io/zh/develop/layout-of-source-files.html 1.pragma solidity ^0 ...

  8. NameValueCollection类读取配置信息

    C#中的NameValueCollection类读取配置信息,大家可以参考下.   我首先介绍配置文件中的写法: 1.在VS2015中的工程下建立一个控制台应用程序,其config文件默认名称为App ...

  9. visualbox 安装

    1.下载地址:官网 2.安装步骤 3.新建虚拟机

  10. Android/Linux boot time分析优化

    如果需要优化boot time,就需要一个量化的工具来分析每个阶段的时间消耗.这种类型的优化特别适合使用基于timeline的图表,有着明显的时间顺序.要求不但能给出整个流程消耗的时间,还要能对流程进 ...