使用mybatisPlus生成oracle自增序列遇到的坑及解决

 更新时间:2023年03月30日 09:26:22   作者:旗木卡卡西zz  
这篇文章主要介绍了使用mybatisPlus生成oracle自增序列遇到的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

记录一次使用mybatisPlus遇到的坑,在网上找了各种配置,依然没有实现oracle插入数据实现序列自增,原因是引入的mybatisPlus依赖有误。

下面记录下代码:

看看这张图片就知道多坑了 这么多的jar包,我用的是springboot,试了好几个jar包,最终才找到正确的引用。

正确依赖

<!--mybatis plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.6</version>
        </dependency>

配置文件

mybatis-plus:
#配置mapper.xml路径
  mapper-locations: classpath:/mapper/*.xml
  #配置实体类路径
  type-aliases-package: com.jp.entity
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 1
    #驼峰下划线转换
    db-column-underline: true
  configuration:
  #配置打印sql
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

配置类一定不能少,自以为在application.yml文件中配置过就完事了,谁知道还要添加一个配置类来配置oracle序列,就是这里坑了我好久,一定记得加上。

如下:

package com.jp.config;

import com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author ljp
 * @date 2020/4/23 22:14
 */
@Configuration
@MapperScan("com.jp.mapper")
public class MybatisPlusConfig {

    @Bean
    public OracleKeyGenerator oracleKeyGenerator() {
        return new OracleKeyGenerator();
    }
}

下面是实体类

package com.jp.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * @author :Y19090908
 * @date :Created in 2020/3/25 下午 05:17
 */
@Data
@TableName("people")
@KeySequence(value = "seq_people", clazz = Integer.class)
public class People implements Serializable {
    private static final long serialVersionUID = 1110056585174675869L;
    @TableId(value = "ID", type = IdType.INPUT)
    private Integer id;
    private String name;
    private String sex;
    private String city;
    private String job;
    private String money;
    private Date createTime;

    public People() {
    }

    public People(String name, String sex, String city, String job, String money) {
        this.name = name;
        this.sex = sex;
        this.city = city;
        this.job = job;
        this.money = money;
    }

    public People(Integer id, String name, String sex, String city, String job, String money) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.city = city;
        this.job = job;
        this.money = money;
    }

}

mapper:

@Mapper
public interface PeopleMapper extends BaseMapper<People> {
    
    List<People> selectDistinct();

    void importExcel(List<People> list);

    void importAll(List<People> list);

    void callInsert(Map<String, Object> map);

    void removeAll();

}

service:

package com.jp.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jp.bean.ErrorExcelResult;
import com.jp.entity.People;

import java.util.List;

/**
 * @author :Y19090908
 * @date :Created in 2020/3/25 下午 05:24
 */
public interface PeopleService extends IService<People> {

    /**
     * excel導入
     *
     * @param list
     * @return
     */
    Object importExcel(List<People> list) throws Exception;

    List<ErrorExcelResult> importExcelForEach(List<People> list) throws Exception;

    List<People> selectDistinct();
}

实现类

@Service
public class PeopleServiceImpl extends ServiceImpl<PeopleMapper, People> implements PeopleService {

    @Autowired
    private PeopleMapper peopleMapper;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Object importExcel(List<People> list) throws Exception {
        if (MyStringUtil.isEmpty(list)) {
            throw new Exception("沒有要導入的數據");
        }
        peopleMapper.importAll(list);
        Map<String, Object> map = new HashMap<>();
        peopleMapper.callInsert(map);
        List<People> repeatList = (List<People>) map.get("P_CURSOR");
        List<ErrorExcelResult> errorList = new ArrayList<>();
        ErrorExcelResult errorExcelResult;
        if (!MyStringUtil.isEmpty(repeatList)) {
            for (People p : repeatList) {
                errorExcelResult = new ErrorExcelResult(p.getName(), p.getSex(), p.getCity(), p.getJob(), p.getMoney(), "數據重複");
                errorList.add(errorExcelResult);
            }
        }
//        peopleMapper.removeAll();
        return errorList;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public List<ErrorExcelResult> importExcelForEach(List<People> list) throws Exception {
        if (MyStringUtil.isEmpty(list)) {
            throw new Exception("沒有要導入的數據");
        }
        List<ErrorExcelResult> errorList = new ArrayList<>();
        ErrorExcelResult errorExcelResult;
        List<People> rightList = new ArrayList<>();
        long start = System.currentTimeMillis();
        for (People p : list) {
            //如果重複記錄該條數據
            if (peopleMapper.selectCount(new QueryWrapper<People>().eq("name", p.getName()).eq("sex", p.getSex())) > 0) {
                errorExcelResult = new ErrorExcelResult(p.getName(), p.getSex(), p.getCity(), p.getJob(), p.getMoney(), "該條數據重複");
                errorList.add(errorExcelResult);
                continue;
            }
            rightList.add(p);
        }
        peopleMapper.importExcel(rightList);
//        this.saveBatch(rightList);
        long end = System.currentTimeMillis();
        System.out.println(end - start);
        return errorList;
    }


    @Override
    public List<People> selectDistinct() {
        return peopleMapper.selectDistinct();
    }

}

service实现类是要加@Service注解的,之前会忘记。

下面是新增的接口,还是蛮简单的,只把添加的接口展示出来了。

 @PostMapping("/page/easy/add")
    @ResponseBody
    public Object add(@RequestBody People people) {
        JSONObject jsonObject = new JSONObject();
        try {
            validate(people);
            people.setCreateTime(new Date());
            peopleService.save(people);
            jsonObject.put("code", 0);
            return jsonObject;
        } catch (Exception e) {
            log.error(e.getMessage());
            jsonObject.put("code", 1);
            jsonObject.put("msg", e.getMessage());
            return jsonObject;
        }
    }

只是白天工作的时候一直生成数据库序列自增失败,所以下班想找找原因,代码写的特别简单,就是为了试试能不能生成自增序列。

以下是postman测试传入的参数

传入一些简单数据

以上就是测试的数据,很简单

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java 定时器Timer和TimerTask的使用详解(执行和暂停)

    java 定时器Timer和TimerTask的使用详解(执行和暂停)

    这篇文章主要介绍了java 定时器Timer和TimerTask的使用详解(执行和暂停),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • 解决rocketmq-spring-boot-starter导致的多消费者实例重复消费问题

    解决rocketmq-spring-boot-starter导致的多消费者实例重复消费问题

    这篇文章主要介绍了解决rocketmq-spring-boot-starter导致的多消费者实例重复消费问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Java设计模式之原型模式详细解读

    Java设计模式之原型模式详细解读

    这篇文章主要介绍了Java设计模式之原型模式详细解读,原型模式属于创建型设计模式,用于创建重复的对象,且同时又保证了性能,该设计模式的好处是将对象的创建与调用方分离,需要的朋友可以参考下
    2023-12-12
  • SpringMVC使用自定义验证器进行数据验证的方法

    SpringMVC使用自定义验证器进行数据验证的方法

    SpringMVC 提供了强大的数据验证机制,可以方便地验证表单提交的数据,除了自带的验证器之外,SpringMVC 还支持自定义验证器,允许开发者根据业务需求自定义验证规则,本文将介绍如何在 SpringMVC 中使用自定义验证器
    2023-07-07
  • Spring Boot项目Jar包加密实战教程

    Spring Boot项目Jar包加密实战教程

    本文详细介绍了如何在Spring Boot项目中实现Jar包加密,我们首先了解了Jar包加密的基本概念和作用,然后学习了如何使用Spring Boot的Jar工具和第三方库来实现Jar包的加密和解密,感兴趣的朋友一起看看吧
    2024-02-02
  • 第三方网站微信登录java代码实现

    第三方网站微信登录java代码实现

    这篇文章主要为大家详细介绍了第三方网站微信登录的java代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 基于HashMap遍历和使用方法(详解)

    基于HashMap遍历和使用方法(详解)

    下面小编就为大家带来一篇基于HashMap遍历和使用方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 深入介绍Java对象初始化

    深入介绍Java对象初始化

    本文对Java如何执行对象的初始化做一个详细深入地介绍。有需要的小伙伴们可以参考。
    2016-07-07
  • java8学习教程之函数引用的使用方法

    java8学习教程之函数引用的使用方法

    这篇文章主要给大家介绍了关于java8学习教程之函数引用的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习下吧。
    2017-09-09
  • java中使用interrupt通知线程停止详析

    java中使用interrupt通知线程停止详析

    这篇文章主要介绍了java中使用interrupt通知线程停止详析,文章介绍的是使用interrupt来通知线程停止运行,而不是强制停止,详细内容需要的小伙伴可以参考一下
    2022-09-09

最新评论