MyBatis中insert操作返回主键的实现方法

 更新时间:2016年09月29日 11:56:49   作者:Truong  
在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数。这篇文章主要介绍了MyBatis中insert操作返回主键的方法,需要的朋友可以参考下

在使用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>

以上所述是小编给大家介绍的MyBatis中insert操作返回主键的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • JDBC使用小结

    JDBC使用小结

    JDBC是一个Java应用程序接口,作用是封装了对数据库的各种操作。JDBC由类和接口组成,使用Java开发数据库应用都需要4个主要的接口:Driver、Connection、Statement、ResultSet,这些接口定义了使用SQL访问数据库的一般架构,下面我们来详细探讨下jdbc的使用。
    2016-05-05
  • Java小白第一次就能看懂的网络编程

    Java小白第一次就能看懂的网络编程

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。本文介绍了一些网络编程基础的概念,并用Java来实现TCP和UDP的Socket的编程,来让读者更好的了解其原理
    2021-08-08
  • Java中的ReadWriteLock高效处理并发读写操作实例探究

    Java中的ReadWriteLock高效处理并发读写操作实例探究

    这篇文章主要为大家介绍了Java中的ReadWriteLock高效处理并发读写操作实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • java list去重操作实现方式

    java list去重操作实现方式

    本文主要介绍了java list 去重的方法,其中有带类型写法和不带类型写法,并举例测试,具有一定参考借鉴价值,希望能对有需要的小伙伴有所帮助
    2016-07-07
  • Java中实例初始化和静态初始化的过程详解

    Java中实例初始化和静态初始化的过程详解

    Java代码初始化块是Java语言中的一个非常重要的概念。初始化块负责在创建对象时进行一些必要的操作,例如设置对象的初始状态、初始化成员变量等。初始化块被分为实例初始化块和静态初始化块两种类型。本文详细介绍了初始化的过程,需要的朋友可以参考下
    2023-05-05
  • mybatis3.3+struts2.3.24+mysql5.1.22开发环境搭建图文教程

    mybatis3.3+struts2.3.24+mysql5.1.22开发环境搭建图文教程

    这篇文章主要为大家详细介绍了mybatis3.3+struts2.3.24+mysql5.1.22开发环境搭建图文教程,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Java并发内存模型详情

    Java并发内存模型详情

    这篇文章主要介绍了Java并发内存模型,Java是一门支持多线程执行的语言,要编写正确的并发程序,了解Java内存模型是重要前提。而了解硬件内存模型有助于理解程序的执行,下面文章就来看看详细内容吧
    2021-10-10
  • RestTemplate调用POST和GET请求示例详解

    RestTemplate调用POST和GET请求示例详解

    这篇文章主要为大家介绍了RestTemplate调用POST和GET请求示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • JDK13的新特性之AppCDS详解

    JDK13的新特性之AppCDS详解

    AppCDS的全称是Application Class-Data Sharing。主要是用来在不同的JVM中共享Class-Data信息,从而提升应用程序的启动速度。这篇文章主要介绍了JDK13的新特性:AppCDS详解,需要的朋友可以参考下
    2020-05-05
  • MybatisPlus使用idworker解决雪花算法重复

    MybatisPlus使用idworker解决雪花算法重复

    本文主要介绍了MybatisPlus使用idworker解决雪花算法重复,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论