mybatis-plus 执行insert(),实体的id自动更新问题
mybatis-plus 执行insert(),实体的id自动更新
mybatis-plus 在执行basemapper.insert()的时候,会将传进去的实体的id自动更新为插入的主键值。
业务代码
@transactional(rollbackfor = exception.class) @override public string savecourseinfo(courseinfoform courseinfoform) { //保存课程基本信息 course course = new course(); course.setstatus(course.course_draft); beanutils.copyproperties(courseinfoform, course); system.out.println("执行insert之前的id值:" + course.getid()); basemapper.insert(course); system.out.println("执行insert之后的id值:" + course.getid()); //保存课程详情信息 coursedescription coursedescription = new coursedescription(); coursedescription.setdescription(courseinfoform.getdescription()); coursedescription.setid(course.getid()); coursedescriptionmapper.insert(coursedescription); return course.getid(); }
运行结果
执行insert之前的id值:null
creating a new sqlsession
registering transaction synchronization for sqlsession [org.apache.ibatis.session.defaults.defaultsqlsession@6911ef9a]
jdbc connection [hikariproxyconnection@2133325606 wrapping com.mysql.cj.jdbc.connectionimpl@5e4ceb08] will be managed by spring
==> preparing: insert into edu_course ( id, teacher_id, subject_id, subject_parent_id, title, price, lesson_num, cover, status, gmt_create, gmt_modified ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
==> parameters: 1417099738586558466(string), 1189426464967995393(string), 1416677134608371713(string), 1416677134537068547(string), linux操作系统(string), 199(bigdecimal), 32(integer), https://guli-file1-wang.oss-cn-beijing.aliyuncs.com/cover/2021/07/19/c5c453cc-0cdb-4c01-a2fc-3973bfe295fa.jpg(string), draft(string), 2021-07-19 20:31:20.777(timestamp), 2021-07-19 20:31:20.777(timestamp)
<== updates: 1
releasing transactional sqlsession [org.apache.ibatis.session.defaults.defaultsqlsession@6911ef9a]
执行insert之后的id值:1417099738586558466
所以说,在业务需要存储信息到多个表并且记录的id是一一对应的时候,就可以利用这个特性。而没有必要去执行sql语句查询id值。
mybatis-plus的insert遇到的坑
添加时id值不存在异常
我在添加的时候,无缘无辜的给我报
java.sql.sqlexception: field 'id' doesn't have a default value
如图:
后来了解到 使用 mybatis-plus的insert方法,在底层会默认生成一个long类型的uuid,这就导致跟数据库里面类型不一致导致错误,我们首先要做的是要把这个默认自增的主键给禁了
在实体类 id上面加一个注解
@tableid(value = "id",type = idtype.input) private string id;
这样即可
@data public class jtbtransactionrecord extends model<jtbtransactionrecord> implements serializable{ private static final long serialversionuid = 1l; /** * 交易主键 */ @tableid(value = "id",type = idtype.input) private string id; }
大功告成。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。