SpringCloud微服务01-MybatisPlus-Docker

https://b11et3un53m.feishu.cn/wiki/MWQIw4Zvhil0I5ktPHwcoqZdnec

一、微服务介绍

单体架构所有功能集群在一个架构中,难以维护复杂需求

微服务之间是不同的TomCat要跨服务查询,

学习是如何拆分单体架构为微服务

二、MybatisPlus

1.快速入门

①入门案例

这个mapper继承BaseMapper后就可以直接使用它的方法,增删改查。

②常见注解

继承就可以直接操作对应的数据表原因在于实体类,我们需要遵循一些约定才能自动实现

如果有不想遵循这些约定的内容就需要在实体类中注解。

③常见配置

除了实体包名和mapper地址,其余都是默认设置即可。
MyBatisPlus适合单表查询,多表还是需要自己写SQL

2.核心功能

①条件构造器

where的条件不一定是id可能更加负责,Wrapper

案例:

上述查询例子可以改成如下Lambda形式,避免了硬编码

②自定义SQL

使用MP违反了在逻辑层操作数据库的规则

自定义SQL,where条件过于复杂时采用Wrapper构建where条件,然后传入mapper,然后只需要写除where条件以外的内容就行,注解或者xml都行
注意:mapper层接收时wrapper必须有如下注解

③Service接口

基础用法

查一个get,查多个list

自定义接口继承IService,自定义实现类继承ServiceImpl

在继承ServiceImpl时要确定mapper和实体类

使用时在serviceImp中注入对应service类

案例-基础业务和复杂业务

如果没有涉及到逻辑操作,只是对数据库进行增删改查直接只需要controller即可:
第5个业务代码可以判读是否状态正常,正常再扣钱,需要自定义service和mapper
controller:
这里的userService是,不推荐Autowired注入。
构造函数:(这种写起来太复杂)

可以通过final定义常量以及加RequiredArgsConstructor注解来通过构造函数实现注入。
lombok注解可以生成构造函数,定义为常量后就必须在初始化的时候注入使用RequiredArgsConstructor只会注入常量的


service:

案例-IService的Lambda查询

原生Mybatis

controller:

service:这里参数中前面condition中填入SQL中if条件


最后的.list()可以改成.one(),.page(),.count(),来操作得到的不同的数据。

这里如果有多个线程的话可能会造成并发,可以加一个判断我的查询的余额是否和之前得到的余额相同,相同才扣钱。乐观锁

案例-IService批量新增

减少了网络请求,但是如果没设置为true,sql驱动还是一条一条语句插入


在数据库配置文件这里url后面加上设置参数为true,SQL驱动就会将很多条插入语句拼成下述语句

3.扩展功能

①代码生成

使用MybatisPlus一些基础步骤,实体类,mapper,service,serviceImpl继承类

代码生成就可以根据数据库中的表生成这些代码
步骤:
下载插件

下载好后点击Other中的Config Database将数据库信息填进去

第二步,点击这里设置生成代码的配置,点击generate就可以生成

②静态工具

需要传入Class字节码,除了save和update

涉及到多表查询可以,注入那个表对应的service,可能会发生循环依赖,这时候可以使用静态工具进行查询,注入mapper没mp,service强大

需求①,在userServiceImpl中涉及到它表查询可以使用使用DB静态工具,指定字节码即可

需求②

这里逻辑就是根据id查询到所有user然后,在地址表中查询到每个userId对应的地址(可能有多个)形成一个地址列表,然后使用stream流中的groupingBy方法根据userId分组形成map数据。最后再根据user的列表遍历封装uservo。

这里有两个stream流的使用:
1.将List列表中对象的某一个字段形成新的列表可以使用

List<Long> userTds = users.stream().map(User ::getId).collect(Collectors.toList());

2.就是对列表中的对象分组。

③逻辑删除

如果采用逻辑删除就要加上额外的逻辑判断

mp中配置一下表中代表逻辑删除的字段名叫什么?这里是flag

④枚举处理器

用枚举类型代表状态,但是表中仍然是Int类型,mybatis有个TypeHandler就可以实现类型转换
对枚举类进行注解EnumValue就代表转化的是哪一个字段,JsonValue加在什么字段上就代表返回的是什么类型的值枚举。

第二步进行配置

⑤JSON处理器


做两步,在字段上加上这个注解开启JSON类型转换器,在类上TableName中加上autoResultMap等于true

4.插件功能

①page分页插件

想要使用什么插件要在配置类中进行配置

pageNo是页码,pageSize是一页有多少数据

②通用分页实体

定义一个通用分页实体类

其他具体实体类继承这个通用类

定义分页查询通用返回类:

controller:

service:

封装page和封装结果与业务不太相关,可以用个工具类,这里是在类中定义

在pageQuery定义方法:

重载一个用creatTime排序的方法

在pageDTO中定义方法:

上述service:

如果说我拷贝的uservo中有字段名与user不一致,需要自己写copy就可以写个重载方法:

这里需要传入一个function函数

三、Docker

快速构建、运行、管理应用的工具,运维的工具

传统linx部署很麻烦,Docker可以一键部署

1.快速入门

docker这里的镜像就类似于绿色安装包,下载好后就可以使用,并且软件镜像之间相互隔离


安装应用后,会在本地下载镜像,运行镜像就会创造容器,一个镜像可以创造多个容器
容器间是相互隔离的,多实例部署,形成集群,没有干扰;一个服务也可以部署多个不同应用的实例
docker在部署的时候忽略了安装的过程,系统的差异,系统间的干扰,应用间的干扰

2.命令解读

docker的命令都以docker开始,docker run和-d一般绑定使用这样就可以不影响其他操作

设置端口映射这里:每一个容器都相当于一个微型的服务器有自己的ip和端口号不对外访问,我们只能访问到外部的虚拟机的ip,然后这里3306:3306就代表访问外部的端口3306就会访问内部这个服务器的3306端口。如果不同容器都要映射那要改变前面的外部的端口号

cd ~ 返回根目录

3.Docker基础

①常见命令

对容器的操作:docker start是对关闭的容器进行启动,docker run是创建并允许容器;docker ps是查看容器运行状况;docker rm是删除容器,docker rmi是删除镜像;docker logs是查看容器日志,docker exec是进入容器。

保存docker,不知道具体命令可以加--help

下载tar文件的镜像

查看log:一般加上-f可以追踪日志,ctrl+c退出

进入容器:bash加上就可以就可以进入类似计算机的base操作面板

可以进入容器再连接应用:(类似计算机里连接mysql)

删除容器:

由于查看容器进程显示东西太多,但是格式化代码太长:

首先:输入

vi ~/.bashrc

进入一个文件这里可以定义命令的别名:这里按 i 进入编辑模式,编辑完按Esc进入命令模式,然后按 :wq 保存并退出

:wq输入地方在esc后

最后激活:

②数据卷

容器只包含了镜像运行所需的命令或者依赖,直接进入容器进行修改行不通

数据卷可以让宿主机中的实体文件和容器中某一文件进行双向绑定,这样就可以在宿主机中对容器进行修改。

容器挂载数据卷:只能在创建的时候挂载

③本地目录挂载

匿名卷代表的是创建容器时自动创建的卷,例如MYSQL就必须挂载到一个卷中进行数据的增删操作

但是匿名卷的话,如果对MYSQL进行版本升级,创建新的MYSQL容器后就会使数据丢失,所以需要跟本地目录进行挂载

本地目录必须以”/“或”./“开头

首先在本地上创建所需目录

再运行docker run命令

④自定义镜像

分层可以共用基础层,把一些镜像公有的部分分层这样制作省略操作,下载也省略操作,也节省体积

有人已经做好了JDK的配置:

from代表了我们从什么基础上扩展

构建Java程序镜像
首先:上传jdk.tar文件,load该tar文件

其次上传自己的jar包以及dockerfile镜像描述文件,并进入目录输入构建镜像命令

⑤网络

springboot需要与mysql,redis等进行连接,虽然容器是独立的,但有一个相同的网关

容器间可以通过网桥进行连接,但是容器自己的ip会发生变化,如果容器关闭启动

由于创建的自定义网桥可以通过容器名互相访问



上述连接网络是容器创建后连接,可以创建时连接:-network

4.项目部署

DockerCompose

格式有点不一致

上传文件后就可以:

运行命令就可以一键部署

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

老黄终于不穿皮衣了,分享一个AI换装AI试衣软件!

用AI实现在线试衣&#xff0c;或者在线换装&#xff0c;这不是一个新概念&#xff0c;肯定有人这么想过&#xff0c;但并不是所有人能都能轻松做到啊&#xff01; 今天就来分享一个人人都可以实现的方法&#xff0c;而且是那种傻瓜式的不用付钱的那种&#xff0c;甚至可以把软件…

Tkinter组件:Scrollbar-滚动条

Tkinter组件&#xff1a;Scrollbar Scrollbar&#xff08;滚动条&#xff09;组件用于滚动一些组件的可见范围&#xff0c;根据方向可分为垂直滚动条和水平滚动条。Scrollbar 组件常常被用于实现文本、画布和列表框的滚动。 1. 何时使用 Scrollbar 组件&#xff1f; Scrollb…

2000-2022年上市公司供应链效率数据(含原始数据+结果)

2000-2022年上市公司供应链效率数据&#xff08;含原始数据结果&#xff09; 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;年份、股票代码、省份、城市、区县、省份代码、城市代码、区县代码、首次上市年份、上市状态、股票简称、行业名称、行业代码、库存周转率、供…

【qt】数值的输入与输出

数值的输入与输出 一.与c中的输入与输出的区别二.QString转数值三.数值转QString1.number()2.asprintf() 四.小项目1.总价和进制2.QSpinBox代替3.QSlider滑动块4.QScrollBar滚动条5.QDial表盘6.QLcdnumber lcd显示 五.总结一下下 一.与c中的输入与输出的区别 在c中我们一般通过…

使用LangChain和Neo4j快速创建RAG应用

大家好&#xff0c;Neo4j 通过集成原生的向量搜索功能&#xff0c;增强了其对检索增强生成&#xff08;RAG&#xff09;应用的支持&#xff0c;这标志着一个重要的里程碑。这项新功能通过向量索引搜索处理非结构化文本&#xff0c;增强了 Neo4j 在存储和分析结构化数据方面的现…

【MYSQL】一颗B+树可以保存多少条数据

引言 事万物都有自己的单元体系&#xff0c;若干个小单体组成一个个大的个体。就像拼乐高一样&#xff0c;可以自由组合。所以说&#xff0c;如果能熟悉最小单元&#xff0c;就意味着我们抓住了事物的本事&#xff0c;再复杂的问题也会迎刃而解。 存储单元 存储器范围比较大…

虚拟资源在线交易服务平台源码 线上虚拟商品交易平台搭建

在信息爆炸的时代&#xff0c;虚拟资源、素材、源码系统等等以其独特的魅力&#xff0c;逐渐成为人们日常生活和工作中不可或缺的一部分。如何高效地获取、管理和交易这些虚拟资源&#xff0c;分享一款虚拟资源在线交易服务平台源码&#xff0c;轻松搭建线上虚拟商品交易平台&a…

本来还挺喜欢……

前阵子买了个天空星开发板&#xff0c;到手之后发觉不对劲。 之前我们玩玩开发板都是用的面包板的&#xff0c;就算是ESP那种比较宽的板子用两个面包板拼一下也勉强可以用。 但是天空星它的引脚是分为两组&#xff0c;每组有两排&#xff0c;如果我们还是直接使用面包板的话&a…

【JVM】从可达性分析,到JVM垃圾回收算法,再到垃圾收集器

《深入理解Java虚拟机》[1]中&#xff0c;有下面这么一段话&#xff1a; 在JVM的各个区域中&#xff0c;如虚拟机栈中&#xff0c;栈帧随着方法的进入和退出而有条不紊的执行者出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的&#xff08;尽管在…

C++--String类

系列文章目录 文章目录 目录 系列文章目录 文章目录 前言 一、为什么要学习string 1.c语言的字符串 2.OJ上的使用 二、string类的接口介绍 1.string简介 2.string构造成员函数 3.operator函数 4.string容器size和length 5.重载operator[]和引用返回的意义 5.1 oper…

如何开通微软必应bing国内竞价广告账户?

微软必应Bing作为全球第二大搜索引擎&#xff0c;凭借其特有的用户群和市场定位&#xff0c;为中国广告主开辟了一片潜力无限的蓝海市场。云衔科技通过专业实力&#xff0c;为广告主提供全方位支持&#xff0c;从开户到代运营&#xff0c;助力企业扬帆起航。 一、微软必应bing…

百度云防护502 Bad Gateway原因总结和处理方法

最近&#xff0c;随着原百度云加速用户新接入百度云防护后&#xff0c;很多站长反馈网站打不开&#xff0c;出现了502 Bad Gateway的情况。 为此&#xff0c;百度云这里给大家总结下&#xff0c;出现502的大概几个原因&#xff1a; 1.服务器防火墙拦截了百度云防护的IP节点请求…

(docker)进入容器后如何使用本机gpu

首次创建容器&#xff0c;不能直接使用本机gpu 在系统终端进行如下配置&#xff1a; 1.安装NVIDIA Container Toolkit 进入Nvidia官网Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.15.0 documentation&#xff0c;安装NVIDIA Container Toolkit …

红黑树(RBTree)认识总结

一、认识红黑树 1.1 什么是红黑树&#xff1f; 红黑树是一种二叉搜索树&#xff0c;与普通搜索树不同的是&#xff0c;在每个节点上增加一个“颜色”变量 —— RED / BLACK 。 通过对各个节点颜色的限制&#xff0c;确保从 根 到 NIL &#xff0c;没有一条路径会比其他路径长出…

R语言软件安装及配置

1、下载 网址&#xff1a;www.r-project.org 1.1 下载R 选择download R 选择清华源进行下载 根据自己系统情况下载&#xff0c;我选择windows系统。 先选择base。 选择最新的版本下载。 1.2 下载RTools 下载好后&#xff0c;返回&#xff0c;选择RTools进入后&#xff0c;选…

替换spring-boot中的组件版本

spring-boot是一个用于简化开发的框架&#xff0c;引入spring-boot后会自动包含spring框架&#xff0c;通过引入xxx-start来完成指定组件的功能。比如&#xff1a; spring-boot-starter-web(嵌入 Tomcat 和 web 开发需要的 servlet 和 jsp 支持)spring-boot-starter-data-jpa(…

python EEL应用程序的启动过程

EEL 启动流程 初始化 EEL (eel.init()): 设定静态文件目录&#xff0c;通常是包含 HTML、CSS、JavaScript 等文件的目录。扫描指定目录下的 JavaScript 文件&#xff0c;寻找通过 eel.expose() 暴露的函数。 启动 Web 服务器 (eel.start()): 基于 Bottle 框架启动一个轻量级的 …

2024年3月 青少年等级考试机器人理论真题四级

202403 青少年等级考试机器人理论真题四级 第 1 题 Arduino UNO/Nano主控板&#xff0c;通过按键开关切换高低电平&#xff0c;电路搭设如下&#xff0c;该电路属于&#xff1f;&#xff08; &#xff09; A&#xff1a;外部上拉电阻电路 B&#xff1a;外部下拉电阻电路 C&a…

防火墙远程桌面端口号修改,通过防火墙修改远程桌面的端口号详细操作步骤

使用防火墙修改远程桌面的端口号是一项涉及系统安全和网络配置的重要任务。 以下是详细的操作步骤&#xff0c;旨在确保您能够安全、有效地完成此操作&#xff1a; 一、准备阶段 1. 了解默认端口号&#xff1a;远程桌面端口号通常是3389&#xff0c;这是一个用于远程访问和控…

五款商用加密软件推荐 | 商用加密软件排行榜

没有网络安全就没有国家安全。信息安全是国家经济社会稳定运行&#xff0c;广大人民群众利益的保障。 对于公司来讲&#xff0c;数据安全同样是企业可持续发展的重要保障&#xff0c;防止内部核心数据、知识产权的泄露是企业数据安全的重要工作。下面是五款企业常用的加密软件…