当主键冲突时,即数据库中已存在具有相同主键的记录,MyBatis-Plus 的默认行为通常是执行更新操作,而不是插入新记录。下面我将详细分析这个问题,并提供一些解决策略。 1. 确认 MyBatisPlus 的saveOrUpdate 方法的行为细节 saveOrUpdate 方法在 MyBatis-Plus 中是一个便捷的方法,它首先尝试根据主键查找数据库中的记录...
重写mybatis-plus的saveUpdate方法 1.问题出现 同步外部数据的时候,如果需要同步逻辑删除的数据,mybatis-plus的saveOrUpdate||saveOrUpdateBath方法底层根据先查出数据数据是否存在,存在则更新不存在则新增,数据逻辑删除时,mybatis-plus查询不出来会执行插入造成主键冲突异常 2.问题解决(重写方法) Mapper.java publicinter...
解决方案: 不要以为saveOrUpdate一定会走主库,该方法内部会调用查询操作(默认是走从库的) 要保证结果正确,需要在saveForCashPre方法中强制开启走主库 标签:Mybatis Plus saveOrUpdate(T entity)采坑问题
insert 操作时,会加 insert intention lock (X),此时有其他的 gap key 存在会等待 第二个事务重复上面的步骤交替执行,产生死锁 暂且通过其他方式绕过了: 不使用原有的 saveOrUpdate 方法,自实现 insert ignore 方法替换 save 方法(MySQL) 降低事务级别,非 RR 下不会加 gap key,不过会产生写入主键冲突 @wlx381...
mybatisplus只能做%s+1和now两种填充 mybatisplus-plus在插入或更新时对指定字段进行自定义复杂sql填充。 需要在实体类字段上用原生注解@TableField设置fill=FieldFill.INSERT fill=FieldFill.UPDATE或fill=FieldFill.INSERT_UPDATE否则不会触发自定义填充 mybatisplus-plus使用@InsertFill注解触发插入时,执行注解中自定义...
mybatisplus-plus对mybatisplus的一些功能补充 根据多个字段联合主键增删改查 原生mybatisplus只支持一个主键,mpp支持多个字段联合主键(复合主键)增删改查,mapper需要继承MppBaseMapper 实体类中联合主键的字段需要用@MppMultiId注解修饰 如果需要在service使用多主键相关操作包括saveOrUpdateByMultiId和批量操作updateBatchBy...
MybatisPlus 会把名为 id 的字段作为主键 但很多情况下,默认的实现与实际场景不符,因此 MybatisPlus 提供了一些注解便于我们声明表信息。 1.1.1@TableName 说明: 描述:表名注解,标识实体类对应的表 使用位置:实体类 示例: Java@TableName("user")publicclassUser{privateLong id;privateString name;} ...
replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。 3.批量插入或者更新(两种方式) 方式一:mybatis-plus的saveOrUpdateBatch方法 ...
MyBatis-Plus:3.5.1 2.建库建表 打开Navicat运行以下SQL脚本进行建库建表 CREATEDATABASE `mybatis_plus`/*!40100 DEFAULT CHARACTER SET utf8mb4 */; use `mybatis_plus`;CREATETABLE`user` ( `id`bigint(20)NOTNULLCOMMENT'主键ID', `name`varchar(30)DEFAULTNULLCOMMENT'姓名', ...
首先声明一个Mapper接口,其中定义了方法saveOrUpdateBatch: public interface UserMapper { void saveOrUpdateBatch(List userList); } 注意:如果您使用的是Mybatis Plus,建议使用BaseMapper中已经封装好的saveOrUpdateBatch方法。 接下来看一个User实体类的例子: ...