Oracle+Mybatis实现插入主键id自增

962 阅读1分钟

这是我参与 8 月更文挑战的第 17 天,活动详情查看: 8月更文挑战

之前写日志管理功能中有个日志ID字段,需要在每条数据插入数据时,实现日志ID自增,本来我的写法是通过写一个静态的initId,每插入一条数据,就++1,具体代码如下:

  //主健自增!
    private static int initId = 1;
    
    
     sys_log.setLog_id(initId++);

后来运行的时候,当只登录一个账号的时候,这个代码没啥问题。切换登录账号时,initId就会从头开始计算,并覆盖我们存入数据库中的记录,不符合我们预期想要的结果。

另寻出路:

刚开始找的方法,是在insert中加入useGeneratedKeys=True,keyProperty="我们需要自增的主键Id",就可以实现插入数据时,主键Id自增,但发现在Oracle数据库中,主键没有办法自动增长,采取别的方法。

最终方法:

使用selectKey标签

在insert标签内部再嵌入selectKey标签。

具体代码:

Mapper.xml中代码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.tjm.mapper.LogMapper">
<insert id="insertLog" parameterType="SysLog" >
            <selectKey keyProperty="log_id" resultType="int" order="BEFORE">
                select nvl(max("log_id"),0)+1 from "SysLog"
            </selectKey>
        insert into "SysLog"("log_id","username","class_name","method_name","args","creat_time")
        values(#{log_id},#{username},#{class_name},#{method_name},#{args},#{creat_time})
    </insert>

</mapper>    

keyProperty等于我们想要新增的主键名称,order属性有两种取值,一个是BEFORE指的是先执行selectKey标签内的语句,再执行外层的语句,另一个是After指的是先执行外层的语句,再执行内层selectKey标签内的语句。

Mapper层代码

package com.tjm.mapper;

import com.tjm.pojo.SysLog;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@Mapper
public interface LogMapper {

    int insertLog(SysLog log);
}

Service层代码

package com.tjm.service;

import com.tjm.pojo.SysLog;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public interface SysLogService {

    int insertLog(SysLog log);
}

ServiceImpl代码

package com.tjm.service;

import com.tjm.mapper.LogMapper;
import com.tjm.pojo.SysLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("sysLogService")
public class SysLogServiceImpl implements SysLogService{

    @Autowired
    private LogMapper logMapper;

    @Override
    public int insertLog(SysLog log) {
        return logMapper.insertLog(log);
    }
}