在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数;如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能

针对Sequence主键而言,在执行insert sql前必须指定一个主键值给要插入的记录,如Oracle、DB2,可以采用如下配置方式:

<insert id="add" parameterType="vo.Category">

<selectKey resultType="java.lang.Short" order="BEFORE" keyProperty="id">

SELECT SEQ_TEST.NEXTVAL FROM DUAL

</selectKey>

insert into category (name_zh, parent_id,

show_order, delete_status, description

)

values (#{nameZh,jdbcType=VARCHAR},

#{parentId,jdbcType=SMALLINT},

#{showOrder,jdbcType=SMALLINT},

#{deleteStatus,jdbcType=BIT},

#{description,jdbcType=VARCHAR}

)

</insert>

针对自增主键的表,在插入时不需要主键,而是在插入过程自动获取一个自增的主键,比如MySQL,可以采用如下两种配置方式:

<insert id="add" parameterType="vo.Category" useGeneratedKeys="true" keyProperty="id">

insert into category (name_zh, parent_id,

show_order, delete_status, description

)

values (#{nameZh,jdbcType=VARCHAR},

#{parentId,jdbcType=SMALLINT},

#{showOrder,jdbcType=SMALLINT},

#{deleteStatus,jdbcType=BIT},

#{description,jdbcType=VARCHAR}

)

</insert>

<insert id="add" parameterType="vo.Category">

<selectKey resultType="java.lang.Short" order="AFTER" keyProperty="id">

SELECT LAST_INSERT_ID() AS id

</selectKey>

insert into category (name_zh, parent_id,

show_order, delete_status, description

)

values (#{nameZh,jdbcType=VARCHAR},

#{parentId,jdbcType=SMALLINT},

#{showOrder,jdbcType=SMALLINT},

#{deleteStatus,jdbcType=BIT},

#{description,jdbcType=VARCHAR}

)

</insert>

在插入操作完成之后,参数category的id属性就已经被赋值了

如果数据库表的主键不是自增的类型,那么就需要应用层生成主键的方式··········这个就不多说了,需要的朋友,可以留言交流··

-----------------------------------------

下面是针对Oracle的写法,Oracle没有autoincrement,而是用触发器实现的 CURRVAL是在触发器中定义的.
<insert id="insert" parameterClass="ProFeeKindObject">
      <![CDATA[
         INSERT INTO t_pro_feeKind (KINDID,kindName,kindType,enable)
         VALUES (seq_t_pro_feekind_id.nextval,#kindName#,#kindType#,#enable#)
        ]]>
        <selectKey resultClass="java.lang.Integer" keyProperty="kindId" >
        SELECT seq_t_pro_feekind_id.CURRVAL AS kindId FROM DUAL
        </selectKey>    
</insert>

<!-- 下面是针对MySQL的写法 -->
<!--
   <selectKey resultClass="int" keyProperty="id" >
   SELECT @@IDENTITY AS id
   </selectKey>
-->
其他参考代码:
持久化某个实体对象(如保存一个对象)时,如果我们不用selectKey,那么我们不会立刻得到实体对象的Id属性的,也就是数据表主键
Java代码
Permission permission = new Permission();
permission.set...

permmisonDao.createPermission(permission);
assertNull(permission);
Permission permission = new Permission();
permission.set...

permmisonDao.createPermission(permission);
assertNull(permission);

selectKey元素与其在父元素中的位置有关

<insert id="addPermission" parameterClass="Permission">   
     <selectKey resultClass="int" keyProperty="permissionId">   
         SELECT SEQ_P_PERMISSION.NEXTVAL FROM DUAL    
     </selectKey>   
     INSERT INTO P_PERMISSION (
         PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
     ) VALUES (
         #permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#
     )    
</insert>

<insert id="addPermission" parameterClass="Permission">
<selectKey resultClass="int" keyProperty="permissionId">
SELECT SEQ_P_PERMISSION.NEXTVAL FROM DUAL  
</selectKey>
INSERT INTO P_PERMISSION (
PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
) VALUES (
#permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#
)  
</insert>

Mysql、SQLServer在后
Xml代码

<insert id="addPermission" parameterClass="Permission">     
INSERT INTO P_PERMISSION (
     PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
) VALUES (
     #permissionId#, #permissionInfo#, #permissionName#, #permiss
ionEnName#, #url#
)
<selectKey resultClass="int" keyProperty="permissionId">   
     SELECT LAST_INSERT_ID()    
</selectKey>
</insert>

<insert id="addPermission" parameterClass="Permission">   
INSERT INTO P_PERMISSION (
PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
) VALUES (
#permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#
)
<selectKey resultClass="int" keyProperty="permissionId">
SELECT LAST_INSERT_ID()  
</selectKey>
</insert>

像上面这样书写,与selectKey的位置联系得太紧密了,iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成还是后生成。
对于Oracle,表示为
Xml代码

<insert id="addPermission" parameterClass="Permission">   
    <selectKey resultClass="int" keyProperty="permissionId" type="pre">   
        SELECT SEQ_P_PERMISSION.NEXTVAL FROM DUAL    
    </selectKey>   
    INSERT INTO P_PERMISSION (
        PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
    ) VALUES (
        #permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#
    )    
</insert>

<insert id="addPermission" parameterClass="Permission">
<selectKey resultClass="int" keyProperty="permissionId" type="pre">
SELECT SEQ_P_PERMISSION.NEXTVAL FROM DUAL  
</selectKey>
INSERT INTO P_PERMISSION (
PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
) VALUES (
#permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#
)  
</insert>

Mysql、SQLServer等表示为:
Xml代码

<insert id="addPermission" parameterClass="Permission">   
     <selectKey resultClass="int" keyProperty="permissionId" type="post">   
         SELECT LAST_INSERT_ID()
     </selectKey>   
     INSERT INTO P_PERMISSION (
         PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
     ) VALUES (
         #permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#
     )    
</insert>

转自:http://289972458.iteye.com/blog/1001851

http://hi.baidu.com/zim_it/blog/item/8a2bd11205f5b56ecb80c4b7.html

MyBatis insert操作返回主键相关推荐

  1. 160613、MyBatis insert操作返回主键

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能,针对Sequence主键而言,在执行 ...

  2. MyBatis—insert语句返回主键和selectKey标签

    本文已同步至个人博客liaosi's blog - MyBatis-insert语句返回主键和selectKey标签 往数据库中插入一条记录后,有时候我们需要这条记录的主键,用于后续的操作.如果在插入 ...

  3. MyBatis——insert并返回主键ID解决方案

    问题描述 添加记录后获取主键ID,这是一个很常见的需求,特别是在一次前端调用中需要插入多个表的场景. 除了添加单条记录时获取主键值,有时候可能需要获取批量添加记录时各记录的主键值. 问题分析 暂无. ...

  4. 使用mybatis插入数据(insert)时返回主键的问题

    使用mybatis做插入操作时,想要获取新增记录的主键,我发现现在的方式和以前的方式有所区别,即以前是直接通过方法返回,现在是将主键设置在数据实体对象中. 下面对mybatis进行insert时返回主 ...

  5. mybatis 主键自增 insert后返回主键

    mybatis 主键自增 insert后返回主键 : <insert id="insertStudentAutoKey" parameterType="Studen ...

  6. MyBatis 插入数据库返回主键

    最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...

  7. MyBatis框架——mybatis插入数据返回主键(mysql、oracle)

    向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是 ...

  8. mybatis 实现 insert 语句返回 主键

    mybatis 中 insertSelective(example) 语句默认返回并不是 插入记录的主键. 我们可以考虑插入记录主键不直接作为 函数的返回值, 而是体现在改变函数参数 "ex ...

  9. mysql执行语句返回主键_mysql语句insert后返回主键

    最近开发的一个项目中,因为需要,所以需要使用mybatis中的语句返回一个主键id,语句如下, INSERT INTO F_COMPANY( company_id, company_no, compa ...

最新文章

  1. cocos2dx小游戏数据签名算法破解
  2. linux的source命令,linux命令之Source命令
  3. 密封表贴电感的漏磁以及在150kHz导航信号放大器中的性能
  4. 归并排序及C语言实现
  5. 视频驱动V4L2子系统驱动架构 - ioctl
  6. Android之Android:layout_weight详解
  7. babel css3新特性_2018年面试前端总结
  8. python json dumps utf8_Python2操作JSON出现乱码的解决方案
  9. 数组的初始化与默认值
  10. html前端如何缓存页面,Nuxt中如何做页面html缓存
  11. JSONObject 自定义过滤配置
  12. NAND FLASH Controler for IMX31
  13. 编程实现Strassen矩阵乘法
  14. java Exception 处理汇总
  15. Oracle监控的关键指标有哪些
  16. Xamarin.Android开发实践(六)
  17. 机器学习笔记(二十九):决策树、信息熵
  18. conda install 等价与pip install -e .
  19. VS2010开发web项目打开后,项目不可用,提示“需要缺少的 Web 组件才能进行加载”
  20. Typora设置图片背景

热门文章

  1. muse ui去除按钮阴影_如何在Photoshop和Adobe Muse中创建按钮
  2. 史上最详细Cox回归列线图制作教程
  3. 在微信小程序中如何使用框架:(有赞)vant,微信第三方组件(拓展)
  4. mschart走势图 vc_问题:MSChart.exe;结果:微软图表控件MsChart使用方法及各种插件下载地址...
  5. 90页第三题,创建一个 Rectangle类,添加width和lenght两个成员变量 在 Rectangle类中添加两种方法分别计算矩形的周长和面积 ,编程利用Rectangle输出一个矩形的
  6. sqlserver 目录名称无效解决办法 在执行批处理时出现错误。错误消息为: 目录名无效
  7. 详解Linux 下 Aspera 获取 SRA 数据
  8. 在分析了豆瓣Top250电影的数据后,我发现了这些不为人知的规律(附源代码和详情讲解)
  9. Java:计算地球上两个经纬度坐标之间的距离-geodesy和geotools实现
  10. js 判断字符串为空和不为空(两种方法)