首页 > 其他分享 >小宋的SpringCloud学习记录day02

小宋的SpringCloud学习记录day02

时间:2024-06-12 13:32:57浏览次数:20  
标签:小宋 PathVariable day02 money void 用户 user SpringCloud id

基于Restful风格实现下列接口:

今天我们继续昨天的课程来学习一下MybatisPlus的核心功能——IService接口

下面是我们需要在pom文件中要引入的依赖

<!--swagger-->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
    <version>4.1.0</version>
</dependency>
<!--web-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

 下面先展示一下代码:

@Api(tags = "用户管理接口")
@RequestMapping("/users")
@RestController
@RequiredArgsConstructor//只对一开始需要做初始化的变量进行构造
public class UserController {

    private final IUserService userService;

    @ApiOperation("新增用户接口")
    @PostMapping
    public void saveUser(@RequestBody UserFormDTO userFormDTO){
        //1.把DTO拷贝到PO
        User user = BeanUtil.copyProperties(userFormDTO, User.class);
        //2.新增
        userService.save(user);
    }

    @ApiOperation("删除用户接口")
    @DeleteMapping("{id}")
    public void deleteUserById(@ApiParam("用户id")@PathVariable("id") Long id){//@PathVariable注解声明路径用id来进行占位
      userService.removeById(id);
    }

    @ApiOperation("根据id查询用户接口")
    @GetMapping("{id}")
    public UserVO queryUserById(@ApiParam("用户id")@PathVariable("id") Long id) {
        //1.查询用户
        User user = userService.getById(id);
        //2.把PO拷贝到VO
        return BeanUtil.copyProperties(user, UserVO.class);
    }

    @ApiOperation("根据id批量查询用户接口")
    @GetMapping("{id}")
    public List<UserVO> queryUserByIds(@ApiParam("用户id集合")@RequestParam("id") List<Long> ids) {
        //1.查询用户
        List<User> users = userService.listByIds(ids);
        //2.把PO拷贝到VO
        return BeanUtil.copyToList(users, UserVO.class);
    }


}

我们要利用好MybatisPlus给我们提供的各种方法来进行便捷开发,这样写可以不用写一条service语句就可以实现功能。

学到的东西:1.@RequireArgsConstructor注解是用于对一开始需要初始化变量进行构造的注解,我们在controller层写接口方法时要先声明出对应的service层,但是spring建议我们使用构造方法来声明,就要加上这个注解。或者我们不愿意这样的话依旧可以privite然后再加上@Autowired注解即可

2.在两个实体类需要转换时可以使用到hutool包下的copyProperties方法,括号里穿的参数是要转换的数据,要转换成的数据.class。如果是批量转化则用同一个包下的copyToList方法,括号里传的参数一样。

3.@RequestBody主要用来接受前端给后端传过来的json数据,大多用在post请求中

4.@PathVariable("id") 注解将 URL 中的 {id} 部分绑定到 userId 参数上

接下来我们实现扣除余额功能:首先看代码

Controller层:

    @ApiOperation("扣减用户余额")
    @PutMapping("/{id}/deduction/{money}")
    public void deductMondyById(@ApiParam("用户id")@PathVariable("id") Long id,
                                @ApiParam("扣减的金额")@PathVariable("money") Integer money){//@PathVariable注解声明路径用id来进行占位
        userService.deductBalance(id,money);
    }

Service层:

 void deductBalance(Long id, Integer money);

Mapper层:

   List<User> queryUserByIds(@Param("ids") List<Long> ids);

    void updateBalanceByIds(@Param(Constants.WRAPPER) UpdateWrapper<User> wrapper, @Param("amount") int amount);

    @Update("UPDATE tb_user SET balance = balance - #{moeny} Where id = #{id}")
    void deductBalance(@Param("id")Long id, @Param("money")Integer money);

实现类:

    @Override
    public void deductBalance(Long id, Integer money) {
        //1.查询用户
        User user = this.getById(id);//自己就是userservice所以不用注入,直接调自己即可
        //2.校验用户状态
        if (user == null || user.getStatus() == 2){
            throw new RuntimeException("用户状态异常");
        }
        //3.校验余额是否充足
        if (user.getBalance() < money){
            throw new RuntimeException("用户余额不足");
        }
        //4.扣减金额 update tb_user set balance = balance -?
        baseMapper.deductBalance(id,money);

    }

在Controller层定义好接口,由于是更新用,要传入两个占位符一个id一个money,在对应的Service层和Mapper层生成好对应的方法,此时我们可以选择在Mapper层的方法上方通过@Update注解来写出我们定义好的sql语句,例如:

@Update("UPDATE tb_user SET balance = balance - #{moeny} Where id = #{id}")

同时在实现类中查询到信息来进行条件判断再对金额进行扣减更新。注:我们在进行条件判断是要进行反向判断以免出现if的嵌套。如我们不希望用户状态异常或者余额不足,我们就要判断这个条件然后再抛出异常。

我们可以登录swagger来进行测试,网址是:http://localhost:8080/doc.htm

下面是我测试的图片:

新增:

批量查询

扣除余额:

欢迎我们一起来交流学习!

标签:小宋,PathVariable,day02,money,void,用户,user,SpringCloud,id
From: https://blog.csdn.net/qq_50684356/article/details/139563249

相关文章

  • 小宋的SpringCloud学习记录day01
    MybatisPlus条件构造器基于QueryWrapper的查询MybatisPlus中写好的QueryWrapper方法省去了编写复杂sql语句的繁琐,直接把各种条件集成为对应的方法需求:1.查询出名字中带o的,存款大于等于10000的人的id、username、info、balance字段2.更新用户名为jack的用户余额为2000......
  • SpringCloud-OpenFeign拓展-连接池、最佳使用方法、日志输出
    目录1OpenFeign连接池1.1常见连接类型1.2连接池使用方法1.2.1引入依赖1.2.2开启连接池功能1.2.3配置完成,重启实例即可,底层将更改设置。2OpenFeign最佳使用方法2.1每个微服务都是单独的project,内部有三个独立模块2.2每个微服务都是一个module,一个project,内设......
  • 门面模式Api网关(SpringCloudGateway)
    1.前言        当前通过Eureka、Nacos解决了服务注册和服务发现问题,使用SpringCloudLoadBalance解决了负载均衡的需求,同时借助OpenFeign实现了远程调用。然而,现有的微服务接口都直接对外暴露,容易被外部访问。为保障对外服务的安全性,通常在服务端实现的微服务接口会......
  • 网关SpringCloudGateway配置
    1.2.快速入门如何利用网关实现请求路由。由于网关本身也是一个独立的微服务,因此也需要创建一个模块开发功能。大概步骤如下:创建网关微服务引入SpringCloudGateway、NacosDiscovery依赖编写启动类配置网关路由 1.2.1.创建项目首先,我们要在hmall下创建一个新的module,命......
  • 【JavaScript详解】Day02
    JavaScript基础-第2天理解什么是流程控制,知道条件控制的种类并掌握其对应的语法规则,具备利用循环编写简易ATM取款机程序能力运算符语句综合案例运算符算术运算符数字是用来计算的,比如:乘法*、除法/、加法+、减法-等等,所以经常和算术运算符一起。算术运算......
  • SpringCloud 负载均衡 spring-cloud-starter-loadbalancer
    简述spring-cloud-starter-loadbalancer是SpringCloud中的一个组件,它提供了客户端负载均衡的功能。在SpringCloud的早期版本中,NetflixRibbon被广泛用作客户端负载均衡器,但随着时间推移和NetflixRibbon进入维护模式,SpringCloud社区开始转向更灵活、更易于维护......
  • Java面试八股文day02
    系列文章目录文章目录前言跟着我的节奏拿下Java面试八股文二、容器1.java容器都有哪些?2.Collection和Collections有什么区别?java.util.Collection是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java......
  • 基于SpringCloudAlibaba+Sharding-JDBC的微服务的分库分表设计
    胡弦,视频号2023年度优秀创作者,互联网大厂P8技术专家,SpringCloudAlibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电......
  • day02
    常用快捷键全选:ctrl+awin+e,打开我的电脑ctrl+shift+esc,打开任务管理器基本DOS(磁盘OS)命令cmd命令提示符打开方式(command)win+r,输入cmd常用DOS命令1.盘符切换C/D/E/F:2.查看当前目录下所有文件dir3.切换目录cd+目录名(当前目录)/cd/dx:\文件名\文件名4.返回上......
  • AI编程新手快速体验SpringCloud Alibaba 集成AI功能
    上周六写了一篇文章  震撼发布!SpringAI框架重磅上线,Java集成AI轻松搞定!   部分同学可能没有科学上网的条件,本地ollama集成又比较笨重。趁着周六,写一篇基于SpringCloudAlibaba集成AI的文章。先简单介绍下SpringCloudAlibabaAI。SpringCloudAlibabaAI基......