JAVA使用Mybatis完成Oracle主键的自增

序列

  1. 创建序列

    CREATE SEQUENCE loginlog_squence
    INCREMENT BY 1
    NOMAXVALUE
    NOCYCLE
    CACHE 10;  
    
  2. sql语句插入

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

序列加触发器

  1. 创建序列

    CREATE SEQUENCE loginlog_squence
    INCREMENT BY 1
    NOMAXVALUE
    NOCYCLE
    CACHE 10;  
    
  2. 添加触发器

    CREATE OR REPLACE TRIGGER loginlog_trigger BEFORE INSERT OR UPDATE ON ap_loginlog
    FOR EACH ROW
    DECLARE 
    v_newVal NUMBER(12) := 0;
    v_incval NUMBER(12) := 0;
    BEGIN
      IF INSERTING AND :new.id IS NULL THEN
        --如果插入的时候id为空,则查询序列号获取id值
        SELECT  loginlog_squence.NEXTVAL INTO v_newVal FROM DUAL;
        IF v_newVal = 1 THEN 
          SELECT NVL(max(id),0) INTO v_newVal FROM ap_loginlog;
          v_newVal := v_newVal + 1;
          LOOP     --防止表中主键大于序列号导致主键冲突,序列号大于等于表中最大id+1,则表示可以插入数据
               EXIT WHEN v_incval>=v_newVal;
               SELECT loginlog_squence.nextval INTO v_incval FROM dual;
          END LOOP;
        END IF;
       :new.id := v_newVal;
      END IF;
    END;
    
  3. sql语句插入(不需要加主键属性)

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

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 表名

自定义主键生成规则

比如无规则类型的uuid或雪花算法,有规则类型的时间戳。

你可能感兴趣的:(工作问题,mybatis,java,oracle)