Mybatis新增数据后,马上返回新增数据的id

本文详细介绍了如何在MyBatisPlus中手动实现ID自动生成,通过在Mapper.xml中使用特定属性useGeneratedKeys及keyProperty,确保插入数据时ID字段能自动填充。同时,文章提供了从Mapper接口到Service层的完整实现步骤,并强调了事务管理的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意mybatisPlus没有实现该功能,还是靠传统方式。

注意:方法名要有唯一性

1.在Mapper.xml中的添加方法中加:

useGeneratedKeys="true" keyProperty="id"
例如:

    <insert id="addChapters" parameterType="com.mbyte.easy.chapters.entity.Chapters" 
    useGeneratedKeys="true" keyProperty="id">
    insert into t_chapters (tutorials_name, tutorials_content, create_time, update_time)
    values (
    #{tutorialsName,jdbcType=VARCHAR},
    #{tutorialsContent,jdbcType=VARCHAR},
    #{createTime,jdbcType=TIMESTAMP},
    #{updateTime,jdbcType=TIMESTAMP})
  </insert>

注意:

你要是用的mybatisPlus,注意这是自己写的方法,

  • @TableField(fill = FieldFill.INSERT_UPDATE)自动填充注解不起作用!!
  • 那些deleteStatus,deleteTime啥的不需要创建的字段就不写了
  • 还有就是删除字段时末尾的逗号存在也会出错

2.Mapper类添加方法,

(返回int是改变的元组数,不是回调的id!!!)

public interface TutorialCoverMapper extends BaseMapper<TutorialCover> {
    int addChapters(TutorialCover tutorialCover);
}

3.service

public interface ITutorialCoverService extends IService<TutorialCover> {
    int addChapters(TutorialCover tutorialCover);

}

4.serviceImpl

注意:必须加@Transactional才会执行

@Service
public class TutorialCoverServiceImpl extends ServiceImpl<TutorialCoverMapper, TutorialCover> implements ITutorialCoverService {
   @Autowired
   private ITutorialsService tutorialsService;
    @Resource
    private TutorialCoverMapper tutorialCoverMapper;
    //
    @Transactional
    @Override
    public int addChapters(TutorialCover tutorialCover) {
        return tutorialCoverMapper.insert(tutorialCover);
    }

}

5.使用

注意:insertNum是改变元组的个数!!回调id已经填入你插入的对应实体了

 //回调id
 		//insertNum是改变元组的个数!!不是回调的id
        int insertNum = tutorialCoverService.addChapters(tutorialCover);
        //回调id已经填入你插入的对应实体了
        //实体中id已经有值了
        long tutorialCoverId = tutorialCover.getId();
### 描述 MyBatis 中插入操作并返回生成的实体对象 在 MyBatis 执行插入操作之后,可以通过特定配置使该框架能够返回新创建的对象实例。这通常涉及到设置 `useGeneratedKeys` 属性以及指定键属性名称。 对于希望获取数据库自动生成的关键字(比如自动增长 ID),可以在映射文件中的 `<insert>` 标签里加入这些参数: ```xml <insert id="insertUser" parameterType="com.example.User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO users(name, email) VALUES (#{name}, #{email}) </insert> ``` 上述 XML 片段展示了如何定义一个名为 `insertUser` 的 SQL 插入语句[^1]。这里设置了两个重要选项:`useGeneratedKeys=true` 表明要利用 JDBC 获取自增主键;而 `keyProperty="id"` 则指定了应将此值赋给 Java Bean 或 Map 对象里的哪个字段/属性名。 当调用这个方法时,传入的目标对象会先被用来填充占位符 `${}` 或者 `#{}`, 完成数据写入后再把产生的唯一标识回填到同一对象内相应的位置上去。因此,在成功提交事务以后就可以直接访问更新后的整个 User 实体了。 #### 示例代码展示完整的流程 下面给出一段基于 Spring Boot 和 MyBatis 配合使用的例子来说明这一点: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public User createUser(User newUser){ // 调用 Mapper 接口的方法前不需要手动初始化 Id 字段 int affectedRows = userMapper.insertUser(newUser); if(affectedRows != 1){ throw new RuntimeException("Failed to create a single record"); } // 此处可以直接使用已修改的新建用户对象 return newUser; } } ``` 在这个服务层函数中,通过注入的方式获得了对 `UserMapper` 接口的操作权限,并且实现了保存新的用户信息逻辑。值得注意的是,由于启用了 `useGeneratedKeys`, 当执行完 `insertUser()` 方法后,原本为空或默认值的状态下的 `newUser.id` 将会被实际分配好的编号所替代。 最后一步就是确认影响行数是否符合预期——即只有一条记录受到影响,则可以安全地认为新增过程顺利完成并将含有最新ID在内的完整用户详情作为结果反馈出去。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值