一、實現主鍵自增
在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)中的類型一致