mybatis获取update的id

本文介绍如何使用 MyBatis 的 selectKey 标签优化更新数据时的查询操作,减少数据库连接次数,提高接口处理效率。

平常我门都是更新数据,用更新的条件再查询一次,得到更新的记录。这样我门就进行了两次数据库操作,链接了两次数据库。增加了接口的处理事件,因为链接数据库是很耗时的操作。

其实可以通过 mybatis 的 selectKey 标签来解决这个问题。 
selectKey 这个标签大家基本上都用过,比如在插入数据的时候,返回插入数据的纪录。如:

 <selectKey resultType="int" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID()
 </selectKey>
insert into  ……
resultType :返回的类型,为简单类型。 
order: 在insert into 语句执行后执行。 
keyProperty : 语句执行结果的 返回目标属性
SELECT LAST_INSERT_ID() 为查询主体。 
此处用法用法就是当 insert into 执行后 执行 selectKey 的内容将数据库的最后一个id 查询出来映射到传入数据对像的ID 属性。

写更新语句,并将更新的纪录的ID 返回出来。
通过 test 的name 去更新 test 的email,并获取被更新纪录的id。

<update id="updateByUserName" parameterType="com.test.model.User">
 <selectKey keyProperty='id' resultType='int' order='BEFORE'>
            SELECT
            (select id FROM test WHERE
             name = #{name})id
            from DUAL
  </selectKey>
        UPDATE test SET
      email=#{email}
        WHERE
       name =#{name}
  </update>
上述代码就是通过 selectKey 实现了 通过 test 的name 去更新 test 的email,并获取被更新纪录的id。


原理

 <selectKey keyProperty='id' resultType='int' order='BEFORE'>

此处的 keyProperty=’id’ 是指将查询出来的id 映射到传入updateByUserName 的test 的id 。类型为int
因为可能查到name 以后可能会修改name 所以order=’BEFORE’ 要在执行update之前进行查询,并把id返回出来。
SELECT
    (select id FROM test WHERE
    name = #{name})id
from DUAL 
此 SELECT 就是为了获取 被更新的 test的id 外边包装一个虚表查询是当 name = #{name} 查询不到纪录时不会报空纪录,会返回 null ,这个就很关键了。
当返回空记录的时候 mybatis会报错,说不能转换成 int 型。 
当返回null的时候就会转换成int 的 0 。不会报错,代表没有查到。

### MyBatis 中 `update` 语句的使用方法 #### 定义 Mapper 接口的方法 为了实现数据更新功能,在对应的 Mapper 接口中定义一个用于执行更新操作的方法。此方法通常接受实体对象作为参数,该对象包含了要修改的数据以及唯一标识符以便定位数据库中的特定记录。 ```java public interface UserMapper { /** * 更新用户信息 */ int updateUser(User user); } ``` 上述接口声明了一个名为 `updateUser` 的抽象方法[^4],它接收一个 `User` 实体类实例并返回整数值来指示受影响的行数。 #### 编写 SQL 映射文件 接着在 XML 文件里配置具体的 SQL 语句。对于静态字段更新而言,可以采用如下方式: ```xml <update id="updateUser" parameterType="com.example.User"> UPDATE users SET username=#{username}, email=#{email} WHERE id=#{id}; </update> ``` 这段代码展示了如何通过设置固定的列名来进行简单的更新操作[^1]。这里需要注意的是 `${}` 和 `#{}` 的区别:前者会直接替换变量而后者则会被视为预编译占位符从而防止SQL注入攻击。 当涉及到更复杂的条件逻辑时,则可能需要用到动态 SQL 特性。例如仅当某些属性不为空时才加入相应的SET子句: ```xml <update id="dynamicUpdateUser" parameterType="map"> UPDATE users <set> <if test="record.username != null">username = #{record.username}, </if> <if test="record.email != null">email = #{record.email}</if> </set> WHERE id = #{record.id}; </update> ``` 这种方式允许更加灵活地构建查询语句。 #### 使用 MyBatis-Plus 进行简化开发 如果项目引入了 MyBatis-Plus 库的话,还可以利用其内置的功能进一步减少编码量。比如调用 `updateById()` 或者批量处理多个记录的 `updateBatchById()` 方法即可轻松完成单条或多条记录的同时更新工作[^2]。 最后给出完整的 Java 调用示例: ```java // 创建 SqlSession 对象 try(SqlSession session = factory.openSession()){ // 获取映射器代理对象 UserMapper mapper = session.getMapper(UserMapper.class); // 构建待更新的对象 User updatedUser = new User(); updatedUser.setId(1L); updatedUser.setUsername("newName"); updatedUser.setEmail("example@domain.com"); // 执行更新操作 int rowsAffected = mapper.updateUser(updatedUser); // 提交事务 session.commit(); System.out.println(rowsAffected + " row(s) affected."); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值