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. CentOS7安装redis数据库及php-redis扩展

    redis 首先把redis安装到服务器中 1.wget http://download.redis.io/redis-stable.tar.gz 下载redis源码 2. tar xvzf redi ...

  2. GitHub-分支管理03-多人合作【重点】

    参考博文:廖雪峰Git教程 1. 多人协作 当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信 ...

  3. February 18th, 2018 Week 8th Sunday

    Don't cry for what is lost. Smile for what still remains. 别为失去的哭泣,为还留在你身边的一切微笑吧. I have been told th ...

  4. 【排列组合】ZSC1076: 数学、不容易系列之三——考新郎

    国庆期间,省城刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的: 首先,给每位新娘打扮得几乎一模一样,并 ...

  5. Linux 简介(day1)

    一.Linux 诞生于1991年 二.创始人:林纳斯.托瓦茨(Linus Torvalds) 三.logo:企鹅 四.Linux完整系统包括 1.Linux kernel (Linux 内核) 2.f ...

  6. TCP三次握手四次挥手过程详解

    http://blog.csdn.net/imilli/article/details/50620104 TCP头部: 其中 ACK   SYN  序号  这三个部分在以下会用到,它们的介绍也在下面. ...

  7. 阿里云ECS配置踩坑之路

    1.利用shadowsocks配置SVN(用于软件部署环境) 2.安全组设置 3.FTP搭建 https://www.cnblogs.com/hexige/p/7809481.html

  8. 贪心——D - Radar Installation

    Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. ...

  9. python 之常用模块

    一 认识模块 二 常用模块    (1)re模块    (2)collections模块 一  认识模块     (1)什么是模块      (2)模块的导入和使用 (1)模块是:一个模块就是一个包含 ...

  10. 【angularjs】使用angular搭建项目,实现隔行换色

    描叙:使用ng-class实现每隔3行换色 代码: <!DOCTYPE html> <html ng-app="myApp"> <head> & ...