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. c/c++求解图的关键路径 critical path

    c/c++求解图的关键路径 critical path 上图表示一个工程,工程以V1为起始子工程,V9为终止子工程. 由图可以看出,要开工V5工程,必须在完成工程V2和V3后才可以. 完成V2需要a1 ...

  2. 复制 cmd 窗口文本三步曲:

    1:右键菜单点"标记": 2:按住左键选文字: 3:选完右键点一下!  (关键一步,只需点一下就好!!) so 待选文字就跑到剪切板上了

  3. appium+robotframework常见技巧总结

    1.如何输入中文 方法: 在open application参数最后,新增unicodeKeyboard=True    resetKeyboard=True:不加入这两个参数时,中文无法输入 2.如 ...

  4. May 29. 2018 Week 22nd Tuesday

    Nothing is more terrible than ignorance in action. 最可怕的事情莫过于无知而行动. In today's digital age, we can ru ...

  5. 聚类——KFCM的matlab程序

    聚类——KFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——KFCM文章中已介绍了KFCM-F算法的理论知识,现在用m ...

  6. C语言 设一个函数process,调用它时,实现不同功能。

    //凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 输入a, b,第一次调用process找最大值,第二次调用process找最小值,第三次调用求和. 方法1 ...

  7. 【English】20190306

    Delivery team交付团队consumption消费[kənˈsʌmpʃən] The Consulting Delivery team is focused on delivering va ...

  8. 制作CSS绚烂效果的三种属性

    animation(动画).transition(过渡).transform(变形) https://www.cnblogs.com/shenfangfang/p/5713564.html

  9. 【BZOJ4298】[ONTAK2015]Bajtocja

    [BZOJ4298][ONTAK2015]Bajtocja Description 给定d张无向图,每张图都有n个点.一开始,在任何一张图中都没有任何边.接下来有m次操作,每次操作会给出a,b,k,意 ...

  10. oracle 多版本

    并发控制 concurrency control 数据库提供的函数集合,允许多个人同时访问和修改数据. 锁(lock)是Oracle管理共享数据库资源并发访问并防止并发数据库事务之间“相互干涉”的核心 ...