zoukankan      html  css  js  c++  java
  • MyBatis使用MySQL数据库如何在执行insert操作后返回自增的主键

    数据库:MySQL5 

    create table play(iid int(10) not null primary key auto_increment,typeId int(3));

    Play.java:

    public class Play{

    private Integer iID;

            private Integer typeID;

    ...setter and getter省略... 

    play-mapper.xml:

    <mapper namespace="PlayDAO">

    <resultMap id="BaseResultMap" type="Play">

    <id column="iid" property="iID" jdbcType="INTEGER" />

    <result column="typeId" property="typeID" jdbcType="INTEGER" /> 

    </resultMap> 

    <insert id="insert" parameterType="Play">

    insert into play(typeId) values (#{typeID,jdbcType=INTEGER})

    <selectKey keyProperty="iID" resultType="int" order="AFTER">

    select LAST_INSERT_ID() 

    </selectKey> 

    </insert> 

    </mapper> 

    说明:

    1、 order="AFTER" 表示selectKey的动作在insert into...执行之后执行。

    2、为了说明问题,本例特别让java类中的属性名与xml配置文件中的column名不同,需要特别注意 selectKey的keyProperty属性必须是java类中的属性名。

    补充:

    在Oracle中的用法:先为主键创建一个序列 create sequence Play_Sequence increment by 1 start with 1 nomaxvalue;

    <insert id="insert" parameterType="Play"> 

          <selectKey  keyProperty="iID" resultType="int" order="BEFORE" >

             select  Play_Sequence.nextval from dual

          </selectKey> 

        insert into play( iid ,typeId) values ( #{ iID ,jdbcType=INTEGER} ,#{typeID,jdbcType=INTEGER}) 

     </insert> 

    说明:

    1、无需为序列创建触发器(trigger),order="BEFORE"确定了在插入数据之前取得主键,再将主键随其他字段一起插入即可。

    2、做了一个试验,在创建触发器的情况下,使selectKey的order="AFTER",再使selectKey选择序列的currval,发现currval还未加1。所以只能用1中的方法。

     参考:http://tx2099.iteye.com/blog/1413878

  • 相关阅读:
    vue项目开发基本目录结构
    小程序图片上传七牛
    vue2.0无限滚动加载数据插件
    Vue使用vue-echarts图表
    vue-countTo---简单好用的一个数字滚动插件
    vee-validate的使用
    javaScript---RegExp
    JavaScript 特效之四大家族(offset/scroll/client/event)
    CSS3 三次贝塞尔曲线(cubic-bezier)
    require和import区别
  • 原文地址:https://www.cnblogs.com/mabaishui/p/2519806.html
Copyright © 2011-2022 走看看