Java--Mybatis中insert一条记录之后将主键ID返回给实体对象

我们在insert一条数据之后,需要返回该实体对象的主键ID

1、xml文件里添加useGeneratedKeys=“true” keyProperty="id"

    <!-- useGeneratedKeys="true" keyProperty="userId" -->

    <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="userId">
        く!-- 插入时的主键是从序列中拿到的 -->
        insert into user
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="userId != null">user_id,</if>
            <if test="userName != null">user_name,</if>
         </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="userId != null">#{userId},</if>
            <if test="userName != null">#{userName},</if>
         </trim>
    </insert>

: keyProperty="userId"就是user表中的主键ID

2、xml文件里添加keyProperty="userId" resultType="long" order="BEFORE"

keyProperty :查出的主键值封装给javaBean的哪个属性
order="BEFORE":当前SQL在插入SQL之前运行
order="AFTER": 当前SQL在插入SQL之后运行
resultType:查出的数据的返回值类型

BEFORE运行顺序
先运行selectKey查询userId的SQL;查出userId值封装给JavaBean的userId主键属性
再运行插入的SQL,就可以去除userId属性对应的值
AFTER运行顺序
先运行插入的SQL(从序列中取出新值作为userId)
再运行selectKey查询userId的SQL

    <!--
        keyProperty :查出的主键值封装给javaBean的哪个属性
        order="BEFORE":当前SQL在插入SQL之前运行
        AFTER: 当前SQL在插入SQL之后运行
        resultType:查出的数据的返回值类型
    -->
    <insert id="insertUser" parameterType="User">
        <selectKey keyProperty="userId" resultType="long" order="BEFORE">
            <!--编写查询主键的sq1语句-->
            SELECT user.NEXTVAL as userId FROM DUAL
        </selectKey>
        く!-- 插入时的主键是从序列中拿到的 -->
        insert into user
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="userId != null">user_id,</if>
            <if test="userName != null">user_name,</if>
         </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="userId != null">#{userId},</if>
            <if test="userName != null">#{userName},</if>
         </trim>
    </insert>

:order值必须为BEFORE  AFTER中的一个,大小写敏感 

最主要就是通过如下两段代码 

<!-- userId:user表对应的User实体类主键 -->
<selectKey keyProperty="userId" resultType="long" order="BEFORE">
      <!--编写查询主键的sq1语句-->
      SELECT user.NEXTVAL as userId FROM DUAL
</selectKey>

或者

<insert id="xx" useGeneratedKeys="true" keyProperty="userId">

 加入2个属性就可以省略上面那句<selectKey>XX</selectKey>

我们在Controller中,直接获取userId,如果想要返回User对象也可以,我们insert一条数据传过去的就是一个没带主键userId的User对象,setUserId之后就是完整User对象

    /**
     * 新增User
     */
    @PreAuthorize("@ss.hasPermi('user:add')")
    @Log(title = "新增User", businessType = BusinessType.INSERT)
    @PostMapping("/addUser")
    public long addUser(@RequestBody User user)
    {
        userService.insertUser(user);
        //获取userId
        long userId = user.getUserId();
        return userId;
    }

或者  返回User对象

  /**
     * 新增User
     */
    @PreAuthorize("@ss.hasPermi('user:add')")
    @Log(title = "新增User", businessType = BusinessType.INSERT)
    @PostMapping("/addUser")
    public User addUser(@RequestBody User user)
    {
        userService.insertUser(user);
        //塞userId值,应该不用塞,在mapper里就赋值返回了1111111··
        //user.setUserId(user.getUserId());
        return user;
    }

可参考文章:

oracle id的序列 mybatis*(最好用before)#和$的区别 - 夏末、初秋 - 博客园

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatisinsert操作默认情况下是不返回实体的。但是可以通过配置来实现返回实体。可以使用`useGeneratedKeys`和`keyProperty`属性来实现返回实体的功能。 `useGeneratedKeys`属性用于指定是否使用数据库生成的主键值,设置为`true`表示使用数据库生成的主键值。 `keyProperty`属性用于指定将主键值封装到实体类的哪个属性。 例如,在MyBatis的配置文件或Mapper接口的方法,可以设置`useGeneratedKeys="true"`和`keyProperty="userId"`来实现返回实体的功能。这样,在插入数据后,MyBatis会自动将生成的主键值赋值给实体类的相应属性。 引用的代码示例,`@PostMapping("/addUser")`方法可以通过将返回类型设置为`User`,并在`userService.insertUser(user)`之后返回`user`对象,从而实现返回实体的功能。 请注意,具体的配置和代码可能会因项目而异,需要根据实际情况进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java--Mybatisinsert一条记录之后主键ID返回实体对象](https://blog.csdn.net/MinggeQingchun/article/details/119154244)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值