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

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

注意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 新增数据返回 ID 主要有以下几种方法: ### 主键自增的情况 当数据库表的主键设置为自增时,可以通过在 `insert` 标签中设置 `useGeneratedKeys` 和 `keyProperty` 属性来实现返回新增数据ID。示例代码如下: ```xml <insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> insert into user(name, age) values(#{name}, #{age}) </insert> ``` 这里的 `useGeneratedKeys="true"` 表示是否给主键设置自增,`keyProperty="id"` 表示将自增后的 ID 赋值给实体类中的 `id` 字段。在执行插入操作后,实体类对象中的 `id` 字段就会被自动赋值为数据库生成的主键 ID。这种方式要求数据库表的主键是自增的,并且 `keyProperty` 的值要与实体类中主键字段的名称一致,否则无法正确获取ID [^1][^2][^4]。 ### 主键非自增的情况 如果主键不是自增的,可以使用 `<selectKey>` 标签在插入数据前或插入数据获取主键值。 #### 在插入数据获取主键值 可以使用数据库函数(如 MySQL 的 `UUID()` 函数)生成主键值,示例代码如下: ```xml <insert id="insertDept"> <selectKey resultType="string" order="BEFORE" keyProperty="id"> select uuid() as id </selectKey> insert into dept(id, name) values(#{id}, #{name}) </insert> ``` 在这个例子中,`order="BEFORE"` 表示在插入数据之前执行 `<selectKey>` 标签中的 SQL 语句,生成的主键值会赋值给实体类的 `id` 字段,然后再执行插入操作 [^3]。 #### 在插入数据获取主键值 如果需要在插入数据获取主键值,可以将 `order` 属性设置为 `AFTER`,示例代码如下: ```xml <insert id="insertData"> insert into table_name(column1, column2) values(#{column1}, #{column2}) <selectKey resultType="int" order="AFTER" keyProperty="id"> SELECT LAST_INSERT_ID() </selectKey> </insert> ``` 这里的 `LAST_INSERT_ID()` 是 MySQL 提供的函数,用于获取最后插入记录的自增主键值。在插入数据后执行 `<selectKey>` 标签中的 SQL 语句,将获取到的主键值赋值给实体类的 `id` 字段 [^3]。 ### 总结 根据主键是否自增,可以选择不同的方法来获取新增数据ID。对于自增主键,使用 `useGeneratedKeys` 和 `keyProperty` 是最简单的方式;对于非自增主键,可以使用 `<selectKey>` 标签根据实际需求在插入前或插入后获取主键值。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值