【01】手把手教你0基础部署SpringCloud微服务商城教学-Mybatis篇(上)

序言:

微服务是一种软件架构风格,它是以专注于单一职责的很多小型项目为基础,组合出复杂的大型应用。

想学习SpringCloud搭建项目,首先我们需要学习的就是Mybatis和Docker。

大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。

因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是MybatisPlus.

本专栏系列皆是基于黑马程序员的课程《java黑马商城项目微服务实战开发》进行编写,笔者一步步跟随课程进行项目开发,也会把自身遇到的问题错误全都记录下来,从初学者的角度出发,希望能在一些细微之处帮助到各位读者,大家通过本博客辅助课程视频能够达到更好的学习效果。

本文用到的代码及相关PPT大家也可以自行去课程链接进行下载使用。

课程链接:java黑马商城项目微服务实战开发

Mybatis-Plus

首先我们先把数据库配置好,本博客参考的是黑马程序员的SpringCloud微服务商城项目。

Part1.基础环境搭建

1.首先我们会拿到一个mp-demo的文件,把这个文件导入idea。

2.我们会有一个mp.sql的数据库文件,我自己用的是Navicat,把mp.sql导入数据库。

3.建立idea和mp数据库的联系。

Part2.尝试使用Mybatis进行代码优化入门案例

1.在pom.xml里引入依赖

<!--MybatisPlus-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency>

2.给UserMapper找个爸爸

3.我们可以运行一下test测试类里的方法,会发现是可以正常运行的,是绿的。

由于我个人用的是JDK21 这个课程的lombok和JDK的版本比较老,就会出现ERROR:java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have m

解决办法也很简单,可以用老版本的JDK,但是我更为推荐第二种

我们可以在依赖库中更新lombok的版本

这个是JDK21更新后的Bug,我们只要把lombok更正为1.18.30以上版本就可以解决这个异常。

4.删这些手写的方法

5.在测试类里更改

根据类型进行一一修改,我们run一下会发现完全ok,不需要那么多冗杂的简单代码。

Part3.Mybatis-Plus常用注解与配置

一.常用注解

类名驼峰转下划线作为表名

名为id的字段作为主键

变量名驼峰转下划线作为表的字段名

如:createTime→create_time

通过这种方式mp就可以自动识别,帮我们完成简单的sql语句。

但如果我们没有按照规范的写法,mp就需要我们自己去定义了。

@TableName:用来指定表名

@TableId:用来指定表中的主键字段信息

@TableFieId:用来指定表中的普通字段信息

如图,虽然咱们是规范写法,就是做一个示意。

尤其要注意

①isMarried这种带is作为判断的boolean类型的值,我们的mp在识别时候会因为把带is的识别为布尔型去掉is,这样就会出现歧义,我们一定要给这种变量加一个@TableFieId注解。

②还有一些像叫order的,和数据库关键字有冲突,我们就需要@TableFieId(“`order”)来解决冲突。

③还有一些数据库中不存在的数据,可能分库分表处理后,但是这个类里有,我们需要设置@TableFieId(exist=false)来进行处理。

二.常用配置

基本上是都不用咱们配置,可能有一些特殊需求咱们再做细微的改动,具体的功能作用都可以去查官方文档。

如图简单改改,我们把老的mybatis删掉,功能测试也都是一样可以run的。

Part4.Mybatis-Plus核心功能

一.条件构造器

案例1基于QueryWrapper的查询

需求1:查询出名字中带o的,存款大于等于1000元的人的id、username、binfo、balance字段

需求2:更新用户名为jack的用户的余额为2000

需求3:更新id为1,2,4的用户的余额,扣200。

需求4:用Lambda实现需求1

我们在实际编程中,尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码这种情况。

二.自定义SQL

需求:将id在指定范围内的用户(例如1,2,4)的余额扣减指定值。

1.先编写一个测试

2.根据给定的查询条件(wrapper)更新用户余额。

具体功能如下:

使用@Param("ew")标注的QueryWrapper<User>类型参数wrapper来指定需要更新余额的用户条件。

使用@Param("amount")标注的int类型参数amount来表示需要更新的金额数。

函数执行更新操作,但未明确说明具体的更新逻辑(如是增加还是减少)。

3.拼接

这样我们就可以用mp定义where语句(复杂的查询需要几十行,用mp就很简单),简单的部分再手搓

三.Service接口

我们可以看到IService也提供了特别多,功能也都涵盖了增删改查,通过Service接口我们可以非常便捷的操作一堆以前需要写for-each循环的代码。

我们通常需要先定义一个UserService接口,再用一个UserServiceImpl去开发业务,在开发业务中,我们需要现在UserService里定义方法,再去UserServiceImpl实现方法。

现在我们通过IService,我们直接先让接口继承他,我们的Service就提供了很多方法,那以前写的UserServiceImpl就需要重写很多方法,那不是更麻烦吗,诶,mp给我们提供了ServiceImpl都帮咱们重写好了,我们一样实现类也继承mp的实现类。

逻辑理通了,现在我们来上手实际操作一下。

1.先按照老传统定义接口和实现类。

2.然后分别继承IService和IServiceImpl

3.现在我们来写一个新增测试类看看实际效果,注意包的结构,是新建的ServiceTest包!!!

我们run一下看看结果

我们再来搞一个查询试试效果哈

诶,一样完美查询,mp真牛逼吧孩子。

四.案例·基于Restful风格实现下面的接口:

1.首先我们先引进来两个依赖

       <!--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>

2.然后再配置一下swagger

这个配置大家不用去改哈,那个controller我们一会会给他创建出来

knife4j:enable: trueopenapi:title: 用户管理接口文档description: "用户管理接口文档"email: zhanghuyi@itcast.cnconcat: 虎哥url: https://www.itcast.cnversion: v1.0.0group:default:group-name: defaultapi-rule: packageapi-rule-resources:- com.itheima.mp.controller

3.导入dto、vo

4.创建一个controller文件夹,定义UserController类。

然后我发现这个地方红一半,Controller不红,Mapping红了。

然后我发现是一个愚蠢的错误,我把RequestMappin写成了RestMapping,怪不得红,简单修改一下就绿了。

5.我们现在依托于接口参数编写接口

我们现在来写第一个新增用户的接口,关于代码注释,我写的很详细,大家看图哪怕没有很深的基础也可以看懂。

遇到的问题:

完整的controller代码如下

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.domain.vo.UserVO;
import com.itheima.mp.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;import java.util.List;//定义了一个RESTful API控制器,用于处理与用户相关的HTTP请求
@Api(tags = "用户管理接口")
//标注@RestController和@RequestMapping("/users"),
//表示这是一个处理HTTP请求的控制器,所有请求路径以/users开头。
@RestController
@RequestMapping ("/users")
@RequiredArgsConstructor
public class UserController {private final IUserService userService;
//相比于AutoWire Mybatis-Plus提倡我们用构造函数来注入依赖,我们可以用lombok来简化代码编写@PostMapping//saveUser方法标注@PostMapping,处理POST请求,位于/users路径下@ApiOperation("新增用户接口")//方法接收JSON格式的UserFormDTO对象,将其转换为User对象//并调用userService.save(user)保存用户信息。public void saveUser(@RequestBody UserFormDTO userDTO){//我们有mp之后,拿到手先想mp有没有封装好的方法,有就直接用,没有就自己手写//1.把DTO拷贝到POUser user=BeanUtil.copyProperties(userDTO,User.class);//2.新增userService.save(user);}@DeleteMapping@ApiOperation("删除用户接口")public void deleteUserById(@ApiParam("用户id") @PathVariable("id") Long id){userService.removeById(id);}@GetMapping("{id}")@ApiOperation("根据id查询用户接口")public UserVO queryUserById(@ApiParam("用户id")@PathVariable("id") Long id){//1.查询用户POUser user = userService.getById(id);//2.把PO拷贝到VOreturn BeanUtil.copyProperties(user, UserVO.class);}@GetMapping@ApiOperation("根据id查询用户接口")public List<UserVO> queryUserByIds(@ApiParam("用户id集合")@RequestParam("ids") List<Long> ids){//1.查询用户POList<User> users = userService.listByIds(ids);//2.把PO拷贝到VOreturn BeanUtil.copyToList(users, UserVO.class);}}

第五个接口带业务逻辑,我们就需要自己定义service和mapper了

1.先和以前一样在controller写逻辑

然后deductBanlance这个方法不是mp的自带方法,它会报红,现在我们去实现这个方法

2.在service里先进行声明

3.在serviceImpl里进行方法的实现

4.在mapper实现

现在我们来尝试以下我们编写的service是否能够正常运行

1.用alt+8启动service→启动SpringBoot

2.打开本地网页

http://localhost:8080//doc.html#/home

3.测试代码

新增功能好使

查询功能也好使

然后就是最复杂的扣除余额功能,我们发现也是oo又kk,响应码200说明我们的代码运行成功。

感谢阅读。

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

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

相关文章

没人告诉你的职场人情世故

看到前同事在群里分享的新年开工遭遇&#xff0c;真是让人感同身受。 第一天就遇到挫折&#xff0c;因为工作做得太快、太早交付&#xff0c;结果反被领导批评&#xff0c;还得重做&#xff0c;头大如斗。这不就提醒我们得时时刻刻记着职场里的那些不成文的规矩吗&#xff1f;…

【C++】常用数据结构纲要(简易版)

非静无以成学。——诸葛亮 数据结构概括 1、什么是数据结构呢&#xff1f;2、讲述过的结构2、1、前言2、2、树->二叉树->两种平衡二叉树2、3、单链表->双链表->带有哨兵位的链表 3、B树3、1、概念及图示3、2、B树数据处理3、2、1、查找3、2、2、插入 4、哈希表4、1…

测试点总结 | 搜索功能如何测试?

这里仅针对通用搜索框的常见测试点进行总结分享&#xff0c;实际工作中需结合搜索功能的背景业务需求及其他依赖条件来综合设计测试点。 一、功能实现部分 &#xff08;1&#xff09;如果支持模糊查询&#xff0c;搜索名称中任意一个字符是否能搜索到 对于支持模糊查询的搜索…

猫头虎分享已解决Bug || AssertionError: Torch not compiled with CUDA enabled 解决方案

&#x1f42f; 猫头虎分享已解决Bug || AssertionError: Torch not compiled with CUDA enabled 解决方案 摘要 今天猫头虎收到粉丝提问&#xff1a;“猫哥&#xff0c;我在使用 PyTorch 进行 AI大模型训练 时&#xff0c;出现了 AssertionError: Torch not compiled with CUD…

10.9 LeetCode 3289 0001 3295

思路&#xff1a; 1、用数组下标来表示是否出现过&#xff0c;初始为 0&#xff0c;出现则加 1&#xff0c;判断大于等于 2 的数字即为多次出现。 2、先将数组排序&#xff0c;依次遍历排序过的数组&#xff0c;若第 i 位与第 i1 位相等&#xff0c;则说明是重复数字。 class …

mybatis解析异常

1.问题现象 Caused by: org.springframework.dao.TransientDataAccessResourceException: Error attempting to get column sale_id from result set. Cause: java.sql.SQLException: Cannot convert value from column 19 to TIMESTAMP. 造成原因:需要给表中中增加字段以满…

审稿人喜欢什么样的Novelty?

在学术出版的世界里&#xff0c;“novelty”&#xff08;创新性&#xff09;是一个被频繁提及的词汇。它似乎是衡量一篇文章价值的黄金标准。然而&#xff0c;当我们深入挖掘这个概念时&#xff0c;会发现所谓的创新性并不是那么绝对。今天&#xff0c;我们就来聊聊审稿人眼中的…

No.15 笔记 | CSRF 跨站请求伪造

目录 一、基础知识 &#xff08;一&#xff09;cookie 和 session、同源策略 &#xff08;二&#xff09;CSRF 原理 二、CSRF 类型 &#xff08;一&#xff09;GET 类型 &#xff08;二&#xff09;POST 类型 三、CSRF 实例讲解 &#xff08;一&#xff09;真实案例 &am…

软件测试学习笔记丨数据库进阶及redis数据库

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32358 一、数据库进阶 1.1 MySQL中SQL执行原理 1. SQL语句执行过程 2. Server组件 连接器&#xff1a;连接管理&#xff0c;权限验证查询缓存&#xff1a;命中直接返回结果分析器&#xff…

秋天来临,猫咪又到换毛季,掉毛严重怎么办?宠物空气净化器有用吗?

秋天到了&#xff0c;新一轮的宠物换毛季又来了。谁能想到这只胖猫和之前刚接回来时的皮包骨小猫是同一只&#xff01;除了养了一年长了些肉外&#xff0c;更多的都是换毛季掉毛”膨胀“的。每天下班回家都要搞卫生&#xff0c;家里衣服上、地板上&#xff0c;目光所及之处都有…

acwing:1576. 再次树遍历

打卡一道有意义的题。 题签&#xff1a; 通过使用栈可以以非递归方式实现二叉树的中序遍历。 例如&#xff0c;假设遍历一个如下图所示的 66 节点的二叉树&#xff08;节点编号从 11 到 66&#xff09;。 则堆栈操作为&#xff1a;push(1); push(2); push(3); pop(); pop(); pu…

智能配音软件哪款好?分享5个搞怪软件

想要让视频或社交媒体内容更加生动有趣&#xff1f;搞笑配音软件是个不错的选择。 无论是嘻哈风格的视频&#xff0c;还是搞怪的段子&#xff0c;合适的配音都能让内容增色不少。 今天&#xff0c;就让我们来探索六个文字配音软件&#xff0c;它们不仅能帮你实现搞笑配音&…

H5如何做性能测试?

说起H5性能测试&#xff0c;可能许多同学有所耳闻&#xff0c;但是不知道该如何去做性能测试&#xff0c;或者不知道H5应该关注哪些性能指标。今天我们就来看下。希望阅读本文后&#xff0c;能够有所了解。 常用指标 1、H5性能相关参数介绍 白屏时间&#xff1a;用户首次看到…

L16171819 【哈工大_操作系统】进程同步与信号量信号量临界区保护信号量的代码实现死锁处理

L2.9 进程同步与信号量 让进程走走停停&#xff0c;实现进程同步。 1.、信号量的定义 生产者Producer需要判断是否还有空闲缓冲区生产资源&#xff0c;所以定义一个标志empty&#xff0c;初始值为最大可用资源数&#xff0c;在开头维护&#xff1b;同时&#xff0c;在消费者…

3-GPIO八大输出模式 推挽输出 与 开漏输出

推挽输出 与 开漏输出 GPIO有八大输出模式 下图为每个GPIO口的基本结构&#xff1a; 通过这张图来学习 最右侧是I/O引脚&#xff0c;是从STM32引脚到GPIO口的导线&#xff0c;与其他芯片进行连接的线。 芯片内部电路所能承受的电压有限&#xff0c;当未知的静电进入GPIO口&a…

selenium:Select类操作复选框和下拉框(7)

复选框/下拉框操作的Select类 主要使用selinium中的类Select来模拟选择网页上的下拉框或者复选框中的内容&#xff0c;使用前先导入 from selenium.webdriver.support.ui import Select 主要方法如下&#xff1a; 函数 功能 select_by_value 根据复选框/下拉框的值选择 se…

视觉检测系统实时识别工地安全帽佩戴情况

在建筑工地上&#xff0c;工人佩戴安全帽是确保施工安全的基本措施。然而&#xff0c;工人有时因疏忽或其他原因未能及时佩戴安全帽&#xff0c;这可能导致严重的安全隐患。传统的人工监督往往无法实现对工地的全覆盖或全天候监控&#xff0c;效率低下&#xff0c;容易出现漏检…

【GESP】C++一级练习BCQM3034,还是浮点数计算,国庆七天乐

一道又回到简单浮点数计算水平的题&#xff0c;巩固基本语法练习。 题解详见&#xff1a;https://www.coderli.com/gesp-1-bcqm3034/ 【GESP】C一级练习BCQM3034&#xff0c;还是浮点数计算&#xff0c;国庆七天乐 | OneCoder一道又回到简单浮点数计算水平的题&#xff0c;巩固…

SpringBoot+XXL-JOB:高效定时任务管理

前言 在现代应用程序中&#xff0c;定时任务是不可或缺的一部分。Spring Boot 和 XXL-Job 为你提供了一个强大的工具组合&#xff0c;以简化任务调度和管理。 本文将带领你探索如何将这两者集成在一起&#xff0c;实现高效的定时任务管理。无论你是初学者还是有经验的开发者&…

IDM6.42下载器!下载速度就像坐上了火箭,嗖嗖的快到飞起!

亲爱的朋友们&#xff0c;今天我要给大家安利一款下载神器——Internet Download Manager 6.42&#xff08;简称IDM&#xff09;&#xff01;这款软件简直就是下载界的“速度与激情”&#xff0c;用了它之后&#xff0c;你会发现下载速度就像坐上了火箭&#xff0c;嗖嗖的快到飞…