5.5 Mybatis Update标签实战,返回值是什么? 教你通常处理做法

CSDN成就一亿技术人



前言

通过 《上文》,我们学会了如何在Mybatis中使用insert标签,并学会了使用两种方式获取返回主键id,本文主要讲解update标签,用于和update SQL语句映射,依然结合实战边做边讲。
其实update标签非常简单,知识点不多!所以,本文主要安排的小知识点:返回值是什么? 为什么要讲返回值呢? 确实是因为有同学在群里对上文的insert标签返回值提出了疑问,实际update标签更有代表性,因为单条insert只要没有异常,返回值总是1,所以我们没必要进行处理!但是update却不一样,一条update语句可以同时修改N条记录,那么它的返回值究竟是什么呢?通常又如何处理呢?跟我一起来展开今天学习,Let’s Go!


一、update标签实战

update 标签用于映射SQL语句中的update语句
我们还是以上文的UserMapperUserMapper.xml为例,实战修改密码的功能!

① 在UserMapper接口中新增update方法

在 UserMapper.java 中添加接口方法,传入id和password两个参数。

int updatePassword(@Param("id") Integer id, @Param("password") String password);

通过@Param指定参数名

② MybatisX插件生成update标签

在这里插入图片描述
点击后,在UserMapper.xml中生成如下(不用插件生成的话,自己手写也是一样的):

<update id="updatePassword"></update>

说明: 和select和insert标签一样,通过唯一的 id 与接口方法关联。

③ 写update SQL 语句

接下来,编写对应的update SQL语句,如下:

<update id="updatePassword">
    update user set password = #{password} where id = #{id}
</update>

这样就实现了使用Mybatis update标签实现修改密码,是不是So Easy?Mybatis的使用体验非常友好,只要会写SQL,分分钟就能学会!


二、update sql返回值是什么?

update标签返回值,实际就是update sql语句的返回值,那么我们就先了解两个概念

  • 受影响行数:执行后实际受影响的行数
  • 匹配行数:执行前匹配条件的行数

请看示例,我们修改用户密码,注意此时密码有更改,看看返回什么:
在这里插入图片描述

返回值主要有两个,注意区别:
1 row affected 代表1行受影响,也就是说明1行数据发生了改变
Rows matched: 1 代表1行已匹配,只能说明有一行和update条件匹配,数据不一定发生了改变

我们接着再执行一遍同样的sql,仔细看返回值变了:
在这里插入图片描述

返回值:
0 row affected 这时为什么0行受影响?因为password更改前就是123,改成123相当于相当于没有修改!
Rows matched: 1 依然1行已匹配


三、Mybatis update标签返回值是什么?

update sql的返回值有两个,但是Mybatis update标签只返回一个int,这究竟是哪个呢?
默认返回的是匹配行数,因为受影响行数对我们来说更有意义,我们通过它可以确定数据真正修改的行数,所以通常在spring.datasource.url中指定useAffectedRows=true返回受影响行数

spring.datasource.url=jdbc:mysql://localhost:3306/db_book?useUnicode=true&characterEncoding=utf8&useSSL=false&useAffectedRows=true

四、实现简易的修改密码API

这样修改密码并不恰当,仅是示例

1. dal层

在这里插入图片描述

2. service层

在这里插入图片描述

新建UserService接口:

这里我直接返回行数,是为了更直观的让大家看到实际受影响的行数。
如果业务需要,其实可以在service层根据受影响行数 进行判断,比如:判断 > 0 代表有影响的行数,才进行相关逻辑处理!

package org.tg.book.service;

public interface UserService {
    
    

    /**
     * 修改密码
     */
    Integer updatePassword(Integer id, String password);
}

对应UserServiceImpl实现类:

@Service
public class UserServiceImpl implements UserService {
    
    
    @Autowired
    private UserMapper userMapper;
    @Override
    public Integer updatePassword(Integer id, String password) {
    
    
        return userMapper.updatePassword(id, password);
    }
}

3. web层

在这里插入图片描述

新建UserController:

@RestController
@RequestMapping("/user")
@CrossOrigin(origins = "*")
public class UserController {
    
    

    @Autowired
    private UserService userService;

    @PostMapping("/password")
    public TgResult<Integer> updatePassword(@RequestBody PasswordVO passwordVO){
    
    
        Integer rows = userService.updatePassword(passwordVO.getId(), passwordVO.getPassword());
        return TgResult.ok(rows);
    }
}

对应的PasswordVO:

@Data
public class PasswordVO implements Serializable {
    
    
    private Integer id;
    private String password;
}

自测通过

在这里插入图片描述
在这里插入图片描述


五、Git提交

养成好习惯,小步提交,多次提交,避免攒了很多代码,最后提交CodeReview时一个地方需要修改,导致全部代码合并不了!
在这里插入图片描述


最后

如果喜欢,想学习更多实战真东西的,想找人带你快速成长的,想投资自己的,点击链接订阅专栏:

服务端实战SpringBoot+Vue前后端分离项目实战
前端实战Vue + SpringBoot前后端分离项目实战

具体的优势、规划、技术选型都可以在《开篇》试读,有详细说明!订阅后加下面我的WX,一对一指导!

另外,别忘了关注:天罡gg ,发布新文不容易错过: https://blog.csdn.net/scm_2008

老规矩,请投票给我反馈,谢谢大家的支持!

猜你喜欢

转载自blog.csdn.net/scm_2008/article/details/130415134
5.5