在mybatis-plus中关于@insert注解自定义批处理sql导致其雪花算法失效而无法自动生成id的解决方法

受到这位作者的启发 ===> 原文在点这里
为了自己实现批量插入,我在mapper层使用@insert注解写了一段自定义sql

//自定义的批量插入方法
@Insert("<script>" +
   "insert into rpt_material_hour(id,sample_time,rounding_time,cur_month,machine_no,data_code,data_value,create_user,create_time,update_user,update_time) values" +
   "   <foreach collection='materialDataList' separator=',' item='item'>" +
   "        (#{item.id},#{item.simpleTime},#{item.roundingTime},#{item.curMonth},#{item.machineNo},#{item.dataCode},#{item.dataValue}," +
   "         #{item.createUser},#{item.createTime},#{item.updateUser},#{item.updateTime})" +
   "   </foreach>"+
   "</script>")
void insertBatch(@Param("materialDataList")List<MaterialData> materialDataList);

报错如下
在这里插入图片描述
说明mybatis-plus的雪花算法失效了
但是我的entity对象明明声明了主键的生成策略为雪花算法
在这里插入图片描述
后来我去掉mapper层方法里的@Param注解后就好了
在这里插入图片描述
【注】我这里的数据源使用的是sqlserver

### MyBatis-Plus 主键填充不生效的原因分析 在使用 MyBatis-Plus 进行数据库操作时,如果遇到 `Long` 类型主键自动生成失效的情况,通常是因为配置不当或某些细节处理不到位所致。 #### 配置文件设置不合理 当实体类中的字段被标记为主键并期望其自动填充时,需确认应用全局配置是否正确设置了 ID 生成策略。例如,在 Spring Boot 应用程序中,应在 application.yml 或者 application.properties 文件里指定合适的 idType 参数[^1]: ```yaml mybatis-plus: global-config: db-config: id-type: auto ``` 上述配置确保了框架能够识别到表结构支持的自增特性,并据此执行相应的 SQL 操作来获取新记录的唯一标识符。 #### 实体属性定义缺失 另一个常见问题是实体对象本身缺少必要的注解声明。对于需要由系统负责分配值的关键字列(如主键),应该利用 @TableId 注释指明该成员变量的角色及其对应的逻辑行为模式。具体来说就是为 long/Long 类型的数据成员加上如下所示的修饰语句: ```java @TableId(type = IdType.AUTO) private Long id; ``` 此段代码明确了 `id` 字段作为数据表内的主键存在,并且采用数据库层面提供的增量机制来自动生成新的编号序列。 #### 插入方法调用异常 除了以上两点外,还需注意业务层面上的操作流程设计是否存在漏洞。比如向持久化存储写入新纪录之前忘记初始化那些标注有特定填充规则(即 insert/update 时间戳等)却未赋予初识值得非主键部分,则可能导致整个事务失败进而影响到后续环节的结果判定。因此建议开发者们仔细审查自己的 DAO 层接口以及 Service 组件内部实现逻辑,排查是否有遗漏之处[^2]。 ```java // 正确做法是在保存前先设定好这些辅助性的元数据信息 entity.setCreateTime(new Date()); entity.setUpdateTime(new Date()); baseMapper.insert(entity); ``` 综上所述,针对 MyBatis-Plus 中 `Long` 型主键无法正常工作的问题,可以从调整项目级参数、完善模型描述方式以及优化服务端编程实践这三个方面入手加以改进和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值