本文目录
- 前言
- 一、update标签实战
- ① 在UserMapper接口中新增update方法
- ② MybatisX插件生成update标签
- ③ 写update SQL 语句
- 二、update sql返回值是什么?
- 三、Mybatis update标签返回值是什么?
- 四、实现简易的修改密码API
- 1. dal层
- 2. service层
- 3. web层
- 自测通过
- 五、Git提交
- 最后
前言
通过 《上文》,我们学会了如何在Mybatis中使用insert标签,并学会了使用两种方式获取返回主键id,本文主要讲解update标签,用于和update SQL语句映射,依然结合实战边做边讲。
其实update标签非常简单,知识点不多!所以,本文主要安排的小知识点:返回值是什么? 为什么要讲返回值呢? 确实是因为有同学在群里对上文的insert标签返回值提出了疑问,实际update标签更有代表性,因为单条insert只要没有异常,返回值总是1,所以我们没必要进行处理!但是update却不一样,一条update语句可以同时修改N条记录,那么它的返回值究竟是什么呢?通常又如何处理呢?跟我一起来展开今天学习,Let’s Go!
一、update标签实战
update 标签用于映射SQL语句中的update语句
我们还是以上文的UserMapper
和UserMapper.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
老规矩,请投票给我反馈,谢谢大家的支持!