首页
/ JEECG-Boot 中实现表主键自增的增强方案

JEECG-Boot 中实现表主键自增的增强方案

2025-05-03 07:26:43作者:庞眉杨Will

背景介绍

在JEECG-Boot框架中,默认情况下基于online表单开发的表主键ID会被自动设置为UUID字符串类型。这种设计虽然保证了全局唯一性,但在某些业务场景下并不理想,特别是当业务需要更直观、有序的数字ID时。

问题分析

UUID作为主键虽然解决了分布式系统中的唯一性问题,但也存在一些不足:

  1. 可读性差:UUID是一串无意义的字符,不利于人工识别和记忆
  2. 索引效率低:字符串类型的UUID比数字类型占用更多存储空间,索引效率较低
  3. 业务需求:某些业务场景需要连续、有序的ID编号

解决方案

通过实现CgformEnhanceJavaInter接口,我们可以创建一个Java增强类,在数据插入前动态设置自增ID。以下是实现步骤:

1. 创建增强类

@Component("CgformEnhanceInsertSetId")
public class CgformEnhanceInsertSetId implements CgformEnhanceJavaInter {
    // 定义需要自增ID的表名映射
    private static final Map<String, Integer> predefinedMap;
    
    static {
        predefinedMap = new HashMap<>();
        predefinedMap.put("库名.表名", 1); // 对应online表单开发中设置的"表名"
    }
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    @Override
    public void execute(String tableName, JSONObject json) throws BusinessException {
        if(predefinedMap.containsKey(tableName)) {
            // 查询当前表最大ID
            String sql = "SELECT COALESCE(MAX(id), 0) FROM " + tableName;
            Long maxId = jdbcTemplate.queryForObject(sql, Long.class);
            
            if (maxId != null) {
                json.put("id", ++maxId); // 设置自增ID
            }
        }
    }
}

2. 实现原理

  1. 表名映射:通过静态Map定义哪些表需要使用自增ID
  2. 查询最大ID:使用JdbcTemplate查询当前表的最大ID值
  3. 设置新ID:将最大ID加1后设置为新记录的ID

3. 注意事项

  1. 并发问题:此方案在高并发场景下可能存在ID冲突风险
  2. 事务隔离:确保在事务中执行,避免脏读
  3. 表设计:数据库表的主键字段应为数字类型(如BIGINT)

扩展方案

对于高并发系统,可以考虑以下改进:

  1. 使用数据库序列:在支持序列的数据库中使用序列生成ID
  2. 分布式ID生成器:集成雪花算法等分布式ID生成方案
  3. 双重校验:在设置ID后再次查询确认ID未被占用

总结

通过实现JEECG-Boot的Java增强接口,我们可以灵活地覆盖框架默认的主键生成策略,满足不同业务场景的需求。这种方案既保留了框架的便利性,又提供了足够的灵活性来处理特殊业务需求。开发者可以根据实际业务场景选择最适合的主键生成策略。

登录后查看全文
热门项目推荐