当前位置: 首页 > article >正文

SpringBoot生成顺序规则编号-查询数据库方式实现

先说编号规则:

前缀+yyyyMMdd+5位序号(00001,00002.......)

首先说说思路:

首先是查询数据库中编号的最大值是多少----->没有数据直接生成一个新的从00001开始----->存在编号就直接截取编号的后5位----->序号+1

为了可以实现多种编号规则和涉及到多个表的数据直接使用动态SQL的方式实现

第一步:是创建动态SQL查询的方法

在Service中定义接口

    /**
     * 执行本数据库查询的动态SQL
     * @param sql
     * @return
     */
    List<Map<String,Object>> executeSql(String sql);

在service的实现类中实现接口

    @Override
    public List<Map<String, Object>> executeSql(String sql) {
        return dataSourceMapper.executeSql(sql);
    }

在Mapper接口中定义接口

    List<Map<String, Object>> executeSql(@Param("sql") String sql);

在Mapper的xml写sql配置

    <!--自定义sql -->
    <select id="executeSql" resultType="map">
        ${sql}
    </select>
第二步:创建配置类及实现的方法
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * YNK 20241127修改
 * 配置生成唯一编号
 * 生成规则:前缀+yyyyMMdd+5位序号
 */
public class CodeConfig {
    public static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); // 指定日期格式
    public static String INIT_CODE = "00001";
    /**
     * 表名3编号前缀和查询最大的SQL静态变量
     */
    public static String CODE_DB = "DBAPI";
    public static String CODE_DB_SQL = "select 编号字段 as code from 表名3 where DATE_FORMAT(create_time,'%Y-%m-%d') = DATE_FORMAT(SYSDATE(),'%Y-%m-%d') order by id desc limit 1";
    /**
     * 表名2编号前缀和查询最大的SQL静态变量
     */
    public static String CODE_DATASET = "DATA";
    public static String CODE_DATASET_SQL = "select 编号字段 as code from 表名2 where DATE_FORMAT(create_time,'%Y-%m-%d') = DATE_FORMAT(SYSDATE(),'%Y-%m-%d') order by id desc limit 1";
    /**
     * 表名1编号前缀和查询最大的SQL静态变量
     */
    public static String CODE_REPORT = "REPORT";
    public static String CODE_REPORT_SQL = "select 编号字段 as code from 表名1 where DATE_FORMAT(create_time,'%Y-%m-%d') = DATE_FORMAT(SYSDATE(),'%Y-%m-%d') order by id desc limit 1";
    /**
     * 返回最大编码方法
     * @param q 编码前缀
     * @param sql 查询最大编码SQL语句
     * @return 返回编号
     */
    public static String RETURN_CODE(String q,String sql){
        //查询数据 静态方法参考上一篇文章
        List<Map<String,Object>> list = StaticService.staticDataSourceService.executeSql(sql);
        if(CollectionUtils.isNotEmpty(list)){
           //获取第一条数据
            Map<String,Object> map = list.get(0);
            String code = map.get("code").toString();
            //截取最后5位 + 1
            int i = Integer.parseInt(StringUtils.substring(code, -5) ) + 1;
            return q + sdf.format(new Date()) + String.format("%05d",i);
        }else{
            return q + sdf.format(new Date()) + INIT_CODE; // 格式化日期
        }
    }

}
第三步:调用
//生成唯一编码
String code = CodeConfig.RETURN_CODE(CodeConfig.CODE_DB,CodeConfig.CODE_DB_SQL);


http://www.kler.cn/a/417368.html

相关文章:

  • DeepSeek本地部署保姆级教程
  • Word List 2
  • 变压器-000000
  • NacosRce到docker逃逸实战
  • c++11总结26——std::regex
  • DeepSeek私有化本地部署图文(Win+Mac)
  • JAVA变量类型
  • hCaptcha 图像识别 API 对接说明
  • Python系列 - MQTT协议
  • 【UE5 C++课程系列笔记】06——定时器的基本使用
  • 曲面单值化定理
  • Flutter EventBus
  • 阿里云ECS服务器磁盘空间不足的几个文件
  • ubuntu多版本安装gcc
  • 使用步骤引导Driver.js
  • jdk8没有Map.entry()
  • 【图像分割】SFFNet:基于小波的空间与频率域融合网络
  • WRF-Chem模式安装、环境配置、原理、调试、运行方法;数据准备及相关参数设置方法
  • 使用YOLOv3进行实时活体检测:Python与OpenCV实现
  • otter 扩展
  • 软件测试——性能测试工具JMeter
  • 【C++】数字位数提取:从个位到十位的深入分析与理论拓展
  • ipad项目 蓝湖宽度
  • UDP如何在应用层实现可靠传输
  • day30|leetcode 452. 用最少数量的箭引爆气球, 435. 无重叠区间 , 763.划分字母区间
  • 21天掌握javaweb-第2天:Spring Boot核心组件与Spring MVC基础