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)中的類型一致

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM