mybatis + (oracle)实现主键自增 + 插入数据并返回主键

一、实现主键自增

在oracle数据库中,主键并没有办法自动增长,无法使用insert对应的useGeneratedKeys和keyProperty属性自动返回增加的主键。

要实现自增需要修改 ID列为number类型,一下类型作为参考

 

 

 

oracle实现主键方式:原文链接:https://www.cnblogs.com/uzxin/p/11930347.html

一、使用selectKey标签

复制代码

<insert id="addLoginLog" parameterType="map" >
          <selectKey  keyProperty="id" resultType="int" order="BEFORE">
              select nvl(max(id),0)+1 from ap_loginlog
          </selectKey>
          insert into ap_loginlog(ID,MEMBER_ID) values(#{id},#{memberId})
</insert>

复制代码

keyProperty是指vo类中的主键属性名称,resultType是指vo类中的主键属性类型,order有两个属性,一个是AFTER是指限制性插入语句,一个是BEFORE是指先执行selectKey标签内的语句:select nvl(max(主键名),0)+1 from 表名

二、使用序列

首先创建序列

CREATE SEQUENCE loginlog_squence   //序列名
INCREMENT BY 1  //每次增长多少
NOMAXVALUE  //MAXVALUE:最大值;NOMAXVALUE:没有最大值
NOCYCLE  //序列达到最大值后是否循环;CYCLE:循环;NOCYCLE:不循环
CACHE 10; //CACHE/NOCACHE:是否需要缓存;缓存生成多少个序列值

 

 

 查看创建的序列

然后再sql语句中插入

<insert id="addLoginLog" parameterType="map" >
      insert into ap_loginlog(ID,MEMBER_ID) values(loginlog_squence.nextval,#{memberId})
</insert>

三、使用序列加触发器

复制代码

create or replace trigger loginlog_trigger  
  before insert on ap_loginlog    
  for each row  
begin  
  select loginlog_sequence.nextval into :new.id from dual;  
end loginlog_trigger;

复制代码

然后再sql语句中插入

<insert id="addLoginLog" parameterType="map" >
      insert into ap_loginlog(MEMBER_ID) values(#{memberId})
</insert>

以上就是实现主键自增,下面说一下插入数据并返回主键 ,我踩坑的原因是mapper层使用了@Param() 导致实体对象一直拿不到生成的主键

0、实体类

复制代码

import lombok.Data;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

@Data
@TableName("你对应的表名")
public class TLampMateriel {

    @TableField(exist = false)
    private String sysTableName = "T_TABLENAME"; //表名

    /**
     * 主键id
     */
    @TableId(value = "ID", type = IdType.AUTO) //AUTO主键自增,UUID随机,UUID要使用string类型
    private Integer id;

    /**
     * 分类名称
     */
    @TableField("NAME")
    private String name;
}

复制代码

 

1、service层代码

复制代码

@Override
    public Boolean insert() {
        TLampMateriel tLampMateriel = new TLampMateriel();  //实体对象,一般
        tLampMateriel.setName("张三");       
        int i = this.baseMapper.insertMateriel(tLampMateriel);      
        System.out.println(tLampMateriel.getId());   
        return i > 0 ;
    }

复制代码

2、mapper层代码

复制代码

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fsgis.common.base.mapper.BaseMapper;
import com.fsgis.one.map.lamp.model.entity.TLampMateriel;
import com.fsgis.one.map.lamp.model.vo.TLampMaterielVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface TLampMaterielMapper extends BaseMapper<TLampMateriel> {
        //添加数据,我就是在这里被坑的,我是用了@Param("")传递参数,导致我后面跟着百度的方法怎么都拿不到id
    int insertMateriel(@Param("tLampMateriel") TLampMateriel tLampMateriel);
}

复制代码

3、mapper.xml 

 踩坑之前在数据库建序列 SEQ_USER_ID

复制代码

踩坑的代码:
<insert id="insertMateriel" parameterType="...entity.TLampMateriel"> //参数这儿自己实体类的包
        <selectKey  keyProperty="id" resultType="int" order="BEFORE">
            select SEQ_USER_ID.nextval from dual
        </selectKey>
        insert into T_LAMP_MATERIEL (ID,NAME)
        values (#{id}, #{tLampMateriel.name})
    </insert>

复制代码

复制代码

正确的:
    <insert id="insertMateriel" parameterType="...entity.TLampMateriel">
        <selectKey  keyProperty="tLampMateriel.id" resultType="int" order="BEFORE">
            select SEQ_USER_ID.nextval from dual
        </selectKey>
        insert into T_LAMP_MATERIEL (ID,NAME)
        values (#{tLampMateriel.id}, #{tLampMateriel.name})
    </insert>

复制代码

keyProperty这里要使用  对象.id,这样一改我就拿到id了
<selectKey  keyProperty="id" resultType="int" order="BEFORE">

resultType里面的类型要和 数据库id列的类型,java实体类(TLampMateriel)中的类型一致
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值