mybatisPlus 插入数据后 返回数据本身
时间: 2024-03-08 16:47:33 浏览: 160
在 MyBatis-Plus 中,插入数据后可以通过 `insert` 方法的返回值来获取插入成功的数据本身。默认情况下,`insert` 方法返回插入成功的记录数。但是,如果你在实体类里定义了一个 `id` 字段,并且该字段是自增长的,那么 `insert` 方法返回的就是插入成功后的数据本身。
具体来说,如果你的实体类定义了一个自增 ID 字段,例如:
```java
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
// 省略其他字段和 getter/setter 方法
}
```
那么,在插入一个 `User` 实例后,可以通过 `insert` 方法的返回值获取插入成功的数据本身,例如:
```java
User user = new User();
user.setName("John");
user.setAge(18);
int result = userMapper.insert(user);
if (result > 0) {
Long id = user.getId();
// id 就是插入成功后的自增 ID
}
```
因为 `id` 是自增的,所以在插入成功后,`user` 实例的 `id` 字段已经被赋值为插入成功后的自增 ID,可以直接获取。
相关问题
mybatisplus 插入说主键不能为空
### MyBatis-Plus 插入操作主键为空的解决方案
对于MyBatis-Plus框架,在执行插入操作时如果遇到主键返回为空的情况,可以采取多种措施来确保能够正确获取到新记录的主键值。
当使用XML映射文件定义SQL语句时,应该设置`useGeneratedKeys="true"`以及指定`keyProperty`属性指向实体类中的主键字段名称[^1]。这会告知数据库驱动程序启用自动生成的键功能,并告诉MyBatis哪个属性用于保存这个生成的键值。
另外一种情况是在批量插入场景下发现即使关闭了事务管理也无法正常获得主键反馈。针对此现象有观点认为可能是由于`saveBatch()`方法本身特性所致[^2]。为了确认这一点并寻找替代方案,建议尝试如下几种方式:
#### 方法一:调整Mapper配置
在对应的Mapper XML文件内的 `<insert>`标签内加入参数 `useGeneratedKeys="true"` 和 `keyColumn="id"` 及 `keyProperty="id"` ,例如:
```xml
<insert id="insertUser" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
INSERT INTO user(name, age) VALUES (#{name}, #{age})
</insert>
```
#### 方法二:修改Service层逻辑
如果是通过服务接口调用`saveBatch()`来进行多条数据的同时写入,则可能需要考虑分批次提交每一条单独的数据而不是一次性全部处理完毕。这样做的好处是可以逐个捕获每个对象被成功存入后的唯一标识符。
#### 方法三:利用Wrapper辅助工具
还可以借助于Query Wrapper 或 Update Wrapper 来构建更复杂的查询条件表达式,从而实现更加灵活的操作控制。不过这种方法主要适用于更新而非新增记录的情形。
综上所述,最直接有效的方法还是按照官方文档指导去完善Mapper层面的相关配置项,以确保每次插入动作都能顺利接收到由数据库引擎分配的新ID号。
那怎么获取刚插入的id呢
在MyBatisPlus中,如果你希望获取刚刚插入数据的自增ID,通常有几种方法可以实现这一步:
1. **返回值类型**:如果你在`insert()`方法的定义中设置了主键生成策略为`AUTO_INCREMENT`(默认),MyBatisPlus会在后台处理并返回新生成的主键值。这时,你不需要做额外的操作,因为`insert()`方法的返回结果就是刚插入的ID。
```java
Integer id = ruleBaseMapper.insert(ruleBase);
```
2. **通过返回的对象**:如果`RuleBase`类本身包含一个自动增长的主键字段(如`@TableId`注解),那么插入操作后,`ruleBase`对象的这个字段会自动填充新生成的ID。
```java
RuleBase ruleBase = ruleBaseMapper.insertAndGet(ruleBase); // 如果不存在,则返回null
if (ruleBase != null) {
Long id = ruleBase.getId(); // 获取主键值
}
```
3. **使用`insertOptional()`或`insertOrUpdate()`方法**:这两个方法分别返回`Optional<T>`或`T`,你可以选择是否对结果进行检查并提取主键。
```java
Optional<RuleBase> inserted = ruleBaseMapper.insertOptional(ruleBase);
inserted.ifPresent(rule -> {
Long id = rule.getId();
});
```
4. **手动查询**:如果上述方法都不适用,你可以直接在插入之后,使用`selectById()`等方法查询最新插入的数据,获取它的ID。
```java
ruleBaseMapper.insert(ruleBase);
Integer id = ruleBaseMapper.selectOne(new QueryWrapper<>(ruleBase)).getId();
```
记得根据你的具体场景选择合适的方法。
阅读全文