SpringCloud 系列教程:微服务的未来(三)IService接口的业务实现

news2025/1/4 20:33:49

本文将介绍 IService 接口的基本业务操作、复杂业务操作、Lambda 方法的使用以及批量增加操作,帮助开发者深入了解如何高效地利用 MyBatis-Plus 提供的功能进行数据库操作。无论是简单的单表查询,还是复杂的多表联动,甚至是大数据量的批量操作,IService 都能为你提供便利的解决方案。

文章目录

前言

Iservice接口基本业务

Iservice接口复杂业务

IService的Lambda方法

IService的批量新增

总结


前言

现代 Java 开发中,Spring 框架和 MyBatis-Plus 已成为开发高效、灵活的企业级应用程序的重要工具。MyBatis-Plus 作为 MyBatis 的增强工具,提供了丰富的功能来简化数据库操作,其中 IService 接口是其核心之一。IService 不仅为我们提供了常见的 CRUD 操作,还支持 Lambda 查询、批量操作等高级功能,极大地提高了开发效率。

本文将介绍 IService 接口的基本业务操作、复杂业务操作、Lambda 方法的使用以及批量增加操作,帮助开发者深入了解如何高效地利用 MyBatis-Plus 提供的功能进行数据库操作。无论是简单的单表查询,还是复杂的多表联动,甚至是大数据量的批量操作,IService 都能为你提供便利的解决方案。


Iservice接口基本业务

首先引入依赖swagger依赖和web依赖

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

然后配置swagger信息

knife4j:
  enable: true
  openapi:
    title: 用户管理接口文档
    description: "用户管理接口文档"
    email: zhanghuyi@itcast.cn
    concat: 虎哥
    url: https://www.itcast.cn
    version: v1.0.0
    group:
      default:
        group-name: default
        api-rule: package
        api-rule-resources:
          - com.itheima.mp.controller

UserController类

新增用户

package com.itheima.mp.controller;

import cn.hutool.core.bean.BeanUtil;
import com.itheima.mp.domain.dto.UserFormDTO;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Api(tags="用户管理接口")
@RestController
@RequestMapping("/user")
public class UserController  {

    @Autowired
    private IUserService userService;

    @ApiOperation("新增用户接口")
    @PostMapping
    //往往会传送json格式数据,所以加@RequestBody
    public void saveUseer(@RequestBody UserFormDTO userFormDTO) {
        //把DTO拷贝到po
        User user = BeanUtil.toBean(userFormDTO, User.class);
        //新增
        userService.save(user);
    }
}

删除用户

    @ApiOperation("删除用户接口")
    @DeleteMapping("{id}")
    //往往会传送json格式数据,所以加@RequestBody
    public void deleteUserById(@ApiParam("用户id") @PathVariable("id") Long id) {

        userService.removeById(id);

    }

根据id查询用户接口

    @ApiOperation("根据id查询用户")
    @GetMapping("{id}")
    public UserVO getUserById(@ApiParam("用户id") @PathVariable("id") Long id) {
        //查询用户
        User user = userService.getById(id);
        //把po拷贝到vo
        UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);
        return userVO;

    }

 根据id批量查询用户

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

    }

Iservice接口复杂业务

根据id扣减用户余额

    @ApiOperation("根据id扣除余额")
    @PutMapping("/{id}/deduction/{money}")
    public void deductMoneyById(
            @ApiParam("用户id") @PathVariable("id") Long id,
            @ApiParam("扣减的金额") @PathVariable("money") Integer money
    ){
        userService.deductBalance(id,money);
    }

IUserService接口

public interface IUserService extends IService<User> {

    void deductBalance(Long id,Integer money);
}

UserServiceImpl类

package com.itheima.mp.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.mapper.UserMapper;
import com.itheima.mp.service.IUserService;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    @Override
    public void deductBalance(Long id, Integer money) {
        //查询用户
        User user = this.getById(id);
        //校验用户状态
        if(user==null || user.getStatus() == 2){
            throw new RuntimeException("用户状态异常");
        }
        //校验余额是否充足
        if(user.getBalance() < money){
            throw new RuntimeException("用户余额不足!");
        }
        //扣减余额
        baseMapper.deductBalance(id,money);
    }
}

userMapperr类 

 @Update("update user set balance = balance - #{money} where id = id")
    void deductBalance(@Param("id")Long id,@Param("money")Integer money);

 通过localhost:8080/doc.html就可以访问接口文档

IService的Lambda方法

<select id="queryUsers" resultType="com.itheima.mp.domain.po.UserSELECT *
    FROM tb_user
    <where>
        <if test="name != null">
            AND username LIKE #{name]</if><if test="status != null">
            ANDstatus`=#{status}
        </if>
        <if test="minBalance != null and maxBalance != null">
            AND balance BETWEEN #{minBalance}AND #{maxBalance}
        </if>
    </where>
</select>

 UserController类

    @ApiOperation("根据复杂条件查询用户接口")
    @GetMapping("/list")
    public List<UserVO> queryUsers(UserQuery userQuery) {
        //查询用户po
        List<User> users = userService.queryUsers(userQuery.getName(),userQuery.getStatus(),userQuery.getMinBalance(),userQuery.getMaxBalance());
        List<UserVO> userVOS = BeanUtil.copyToList(users, UserVO.class);
        return userVOS;
    }

IService接口 

List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance);

UserServiceImpl实现类 

    @Override
    public List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {

        List<User> users = lambdaQuery()
                .like(name != null, User::getUsername, name)
                .eq(status != null, User::getStatus, status)
                .ge(minBalance != null, User::getBalance, minBalance)
                .le(maxBalance != null, User::getBalance, maxBalance)
                .list();

        return users;
    }

    @Override
    public void deductBalance(Long id, Integer money) {
        //查询用户
        User user = this.getById(id);
        //校验用户状态
        if(user==null || user.getStatus() == 2){
            throw new RuntimeException("用户状态异常");
        }
        //校验余额是否充足
        if(user.getBalance() < money){
            throw new RuntimeException("用户余额不足!");
        }
        //余额
        int remain = user.getBalance() - money;
        lambdaUpdate().set(User::getBalance, remain)
                .set(remain == 0, User::getStatus, 2)
                .eq(User::getId, id)
                //防止多线程引发
                .eq(User::getBalance, user.getBalance())
                .update();
    }

IService的批量新增

    @Test
    void testSaveBatch(){
        long b = System.currentTimeMillis();
        //每次批量处理1000条
        List<User> list = new ArrayList<>(1000);
        for(int i = 1;i <= 100000;i++){
            list.add(buildUser(i));
            if(i % 10000 == 0){
                //每1000条批量处理一次
                userService.saveBatch(list);
                list.clear();
            }
        }
        long e = System.currentTimeMillis();
        System.out.println("耗时:"+(e - b));
    }

 在application.yml文件中加入rewriteBatchedStatements=true

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true

总结

通过本文的讲解,我们深入探讨了 MyBatis-Plus 中 IService 接口的多种常见用法。首先,IService 的基本业务方法简化了常见的 CRUD 操作,开发者无需编写冗长的 SQL 语句,便能实现数据库的增、删、改、查等操作。其次,借助 MyBatis-Plus 强大的 Lambda 功能,开发者可以更加灵活和简洁地构建查询条件,避免了传统 SQL 中条件拼接的复杂性。接着,我们介绍了如何通过 IService 实现复杂业务逻辑,尤其是多表操作的处理,进一步增强了应用的可扩展性和灵活性。最后,批量操作作为大数据量处理中的一项重要优化方法,saveBatch 使得批量插入变得更加简单高效,减少了数据库访问的次数。

通过充分掌握 IService 接口的使用,你可以大幅提升开发效率,减少代码重复度,并且能够灵活应对各种复杂的业务场景。希望本文所介绍的内容能够帮助你更好地理解并应用 MyBatis-Plus 的强大功能,提升你的开发水平与应用性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2269482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MAC环境安装(卸载)软件

MAC环境安装&#xff08;卸载&#xff09;软件 jdknode安装node&#xff0c;并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净&#xff0c;可以再细分删除验证删除结果 jdk 1.下载jdk 先去官网下载自己需要的版…

VScode SSH 错误:Got bad result from install script 解決

之前vscode好好的&#xff0c;某天突然连接报错如下 尝试1. 服务器没有断开,ssh可以正常连接 2. 用管理员权限运行vscode&#xff0c;无效 3. 删除服务器上的~/.vscode-server 文件夹&#xff0c;无效 试过很多后&#xff0c;原来很可能是前一天anaconda卸载导致注册表项 步…

MATLAB中与矩阵运算相关的函数简介

d e t ( a ) det(a) det(a)表示求方阵的秩 t r a c e ( a ) trace(a) trace(a)表示求方阵对角线之和 i n v ( a ) inv(a) inv(a)表示求方阵的逆矩阵 t r i u ( a ) triu(a) triu(a)表示求矩阵的上三角部分&#xff0c;其余变成0 t r i l ( a ) tril(a) tril(a)表示求矩阵的…

20241227通过配置nomodeset参数解决更新grub之后,ubuntu20.04.5无法启动的问题

20241227通过配置nomodeset参数解决更新grub之后&#xff0c;ubuntu20.04.5无法启动的问题 2024/12/27 17:34 0.397475]pci0000:00:07.0:DPC:RPPI0 l0gsize 0 is invalid dev/nvmeon1p9:clean,251849/4276224 files,3266309/17089792 blocks 缘起&#xff1a;公司电脑要安装加密…

46. Three.js案例-创建颜色不断变化的立方体模型

46. Three.js案例-创建颜色不断变化的立方体模型 实现效果 知识点 Three.js基础组件 WebGLRenderer THREE.WebGLRenderer是Three.js提供的用于渲染场景的WebGL渲染器。它支持抗锯齿处理&#xff0c;可以设置渲染器的大小和背景颜色。 构造器 antialias: 是否开启抗锯齿&am…

ES elasticsearch-8.17.0-windows-x86_64使用

1、下载ES(elasticsearch 简称 ES 下载链接&#xff1a;https://www.elastic.co/downloads/elasticsearch) ES 下载链接&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.0-windows-x86_64.zip))&#xff0c;需要在修改ES配置&#xff0…

4G报警器WT2003H-16S低功耗语音芯片方案开发-实时音频上传

一、引言 在当今社会&#xff0c;安全问题始终是人们关注的重中之重。无论是家庭、企业还是公共场所&#xff0c;都需要一套可靠的安全防护系统来保障人员和财产的安全。随着科技的飞速发展&#xff0c;4G 报警器应运而生&#xff0c;为安全防范领域带来了全新的解决方案。…

uniapp Stripe 支付

引入 Stripe npm install stripe/stripe-js import { loadStripe } from stripe/stripe-js; Stripe 提供两种不同类型组件 Payment Element 和 Card Element&#xff1a;如果你使用的是 Payment Element&#xff0c;它是一个更高级别的组件&#xff0c;能够自动处理多种支…

java Redisson 实现限流每秒/分钟/小时限制N个

1.引入maven包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>red…

2D图像测量到3D点云之物体三维尺寸测量!!!!

0&#xff0c;引言 本文将从双目采集的2D图像到3D点云进行转化&#xff0c;并进行物体尺寸测量&#xff0c;旨在为读者展示2D图像如何关联3D点云&#xff0c;并进行相关工业应用。 将2D图像转化为3D点云&#xff0c;并进行物体尺寸测量的技术&#xff0c;在工业领域有着广泛的…

【专题】2024年出口跨境电商促销趋势白皮书报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p38722 在当今全球化加速演进、数字经济蓬勃发展的大背景下&#xff0c;跨境电商行业正以前所未有的态势重塑国际贸易格局&#xff0c;成为各方瞩目的焦点领域。 根据亚马逊发布的《2024年出口跨境电商促销趋势白皮书》&#xff0c;…

【亚马逊云】基于Amazon EC2实例部署 NextCloud 云网盘并使用 Docker-compose 搭建 ONLYOFFICE 企业在线办公应用软件

文章目录 1. 部署EC2实例2. 安装 Docker 服务3. 安装docker-compose4. 创建Docker-compose文件5. 创建nginx.conf文件6. 运行docker-compose命令开始部署7. 访问ONLYOFFICE插件8. 访问NextCloud云盘9. 下载并启用ONLYOFFICE插件10. 上传文件测试11. 所遇问题12. 参考链接 1. 部…

Flutter:打包apk,详细图文介绍

困扰了一天&#xff0c;终于能正常打包apk安装了&#xff0c;记录下打包的流程。建议参考我这篇文章时&#xff0c;同时看下官网的构建说明。 官网构建并发布 Android 应用详情 1、AS创建Flutter项目 2、cmd执行命令 生成一个sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

k8s部署nginx+sshd实现文件上传下载

要通过 nginx 和 sshd 实现文件的上传和下载&#xff0c;通常的做法是结合 SSH 协议和 HTTP 协议&#xff0c;使用 nginx 提供 Web 服务器功能&#xff0c;同时使用 sshd&#xff08;即 SSH 服务&#xff09;来处理通过 SSH 协议进行的文件传输。 SSH 实现文件的上传和下载&…

Java开发生态2024年度总结报告

1 关键要点 尽管数据显示 Java 17 是最常用 JDK&#xff0c;但其用户占比并未超过半数。根据 New Relic 2024 Java 生态系统状态报告&#xff0c;Java 17、11 和 8 的用户比例分别为 35%、33% 和 29%。New Relic 数据中所谓“快速采用”指 Java 21 的采用率仅为 1.4%。虽相较 J…

电路仿真软件PSIM简介

在从事开关电源相关产品开发的工程师或者正在学习开关电源的学习者&#xff0c;常常会用到各种仿真软件进行电路的仿真&#xff0c;不仅可以快速验证电路参数&#xff0c;还能清楚知道各器件的工作状态。 现在的电路仿真软件很多&#xff0c;例如matlab、Multisim、Simplis&…

文档大师:打造一站式 Word 报告解决方案1

前言 在政府、医院、银行、财务以及销售等领域&#xff0c;常常需要创建各种报告文件来展开工作汇报&#xff0c;譬如季度销售报告、年度总结报告、体检报告和保险合同等。在没有报表工具支持之前&#xff0c;这类报告主要通过 Word 制作&#xff0c;费时费力且难以维护&#…

电子电气架构 --- 安全相关内容汇总

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…

LeetCode--排序算法(堆排序、归并排序、快速排序)

排序算法 归并排序算法思路代码时间复杂度 堆排序什么是堆&#xff1f;如何维护堆&#xff1f;如何建堆&#xff1f;堆排序时间复杂度 快速排序算法思想代码时间复杂度 归并排序 算法思路 归并排序算法有两个基本的操作&#xff0c;一个是分&#xff0c;也就是把原数组划分成…

短视频矩阵系统搭建开发指导

在数字化营销的广阔天地中&#xff0c;抖音短视频已迅速崛起为一个拥有巨大影响力的社交媒体平台。随着其受众范围的日益扩大&#xff0c;采用有效的搜索引擎优化&#xff08;SEO&#xff09;策略以增强视频的曝光度和吸引流量变得至关重要。本文旨在阐述一种专为抖音短视频量身…