当前位置: 首页 > news >正文

基于SpringBoot实现MySQL备份与还原

基于SpringBoot实现MySQL备份与还原,需求是在页面上对所有的平台数据执行备份和恢复操作,那么就需要使用代码去调用MySQL备份和恢复的指令,下面是具体实现步骤;

MySQL备份表设计

CREATE TABLE IF NOT EXISTS `mysql_backups` (`id` INT ( 11 ) NOT NULL AUTO_INCREMENT COMMENT '主键id',`mysql_ip` VARCHAR ( 15 ) DEFAULT NULL COMMENT '数据库IP',`mysql_port` VARCHAR ( 5 ) DEFAULT NULL COMMENT '数据库端口',`mysql_cmd` VARCHAR ( 230 ) DEFAULT NULL COMMENT '备份命令',`mysql_back_cmd` VARCHAR ( 230 ) DEFAULT NULL COMMENT '恢复命令',`database_name` VARCHAR ( 20 ) DEFAULT NULL COMMENT '数据库名称',`backups_path` VARCHAR ( 50 ) DEFAULT NULL COMMENT '备份数据地址',`backups_name` VARCHAR ( 50 ) DEFAULT NULL COMMENT '备份文件名称',`operation` INT ( 11 ) DEFAULT NULL COMMENT '操作次数',`status` INT ( 1 ) DEFAULT NULL COMMENT '数据状态(1正常,-1删除)',`recovery_time` DATETIME DEFAULT NULL COMMENT '恢复时间',`create_time` DATETIME DEFAULT NULL COMMENT '备份时间',PRIMARY KEY ( `id` ),
INDEX baskups_index ( mysql_ip, mysql_port, backups_path, database_name,backups_name) USING BTREE COMMENT '索引'
) ENGINE = INNODB AUTO_INCREMENT = 1 CHARSET = UTF8 ROW_FORMAT = COMPACT COMMENT = 'MySQL数据备份表';

数据状态这个字段可加可不加,我的视角是这个备份属于永久存储,不可删除的,所以前端界面上不能有删除按钮,但是后台可能会对一些数据做操作,就加了status这个字段。

实体类设计

import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;import java.util.Date;/*** ClassName:SystemMysqlBackups* 类描述: MySQL备份实体*/
@Data
@TableName("mysql_backups")
public class SystemMysqlBackups {/*** 主键id*/@TableId(value = "id", type = IdType.AUTO)private Long id;/*** MySQL服务器IP地址*/@TableField("mysql_ip")private String mysqlIp;/*** MySQL服务器端口号*/@TableField("mysql_port")private String mysqlPort;/*** MySQL服务器端口号*/@TableField("database_name")private String databaseName;/*** MySQL备份指令*/@TableField("mysql_cmd")private String mysqlCmd;/*** MySQL恢复指令*/@TableField("mysql_back_cmd")private String mysqlBackCmd;/*** MySQL备份存储地址*/@TableField("backups_path")private String backupsPath;/*** MySQL备份文件名称*/@TableField("backups_name")private String backupsName;/*** 操作次数*/@TableField("operation")private Integer operation;/*** 数据状态*/@TableField("status")private Integer status;/*** 恢复时间*/@TableField("recovery_time")private Date recoveryTime;/*** 备份时间*/@TableField("create_time")private Date createTime;}

注解说明:

@Data:Lombok简化实体类注解

@TableName:MybatisPlus的注解,标识表名

@TableId:标识主键,设置主键增长类型

@TableField:标识表字段

mapper和映射文件
mapper 接口代码:

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zj.module.repository.model.system.backups.SystemMysqlBackups;
import org.apache.ibatis.annotations.Param;import java.util.List;/*** InterfaceName:SystemMysqlBackupsMapper* 接口描述: MySQL备份接口*/
public interface SystemMysqlBackupsMapper extends BaseMapper<SystemMysqlBackups> {/*** 查询所有备份数据*/List<SystemMysqlBackups> selectBackupsList();/*** 根据ID查询*/SystemMysqlBackups selectListId(@Param("id") Long id);
}

以上两个方法可以不写,但是我们公司使用的 MybatisPlus 版本明明都配置好了逻辑删除,无法使用,所以只能写这些重复的轮子。

映射文件代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mobaijun.module.dao.system.backups.SystemMysqlBackupsMapper"><resultMap id="Base_Result_Map" type="com.mobaijun.module.model.system.backups.SystemMysqlBackups"><id column="id" property="id"/><result column="mysql_ip" property="mysqlIp"/><result column="mysql_port" property="mysqlPort"/><result column="mysql_cmd" property="mysqlCmd"/><result column="mysql_back_cmd" property="mysqlBackCmd"/><result column="database_name" property="databaseName"/><result column="backups_path" property="backupsPath"/><result column="backups_name" property="backupsName"/><result column="operation" property="operation"/><result column="status" property="status"/><result column="recovery_time" property="recoveryTime"/><result column="create_time" property="createTime"/></resultMap><sql id="Base_Column_List">idas id,`mysql_ip` as mysqlIp,`mysql_port` as mysqlPort,`mysql_cmd` as mysqlCmd,`mysql_back_cmd` as mysqlBackCmd,`database_name` as databaseName,`backups_path` as backupsPath,`backups_name` as backupsName,`operation` as operation,`status` as status,`recovery_time` as recoveryTime,`create_time` as createTime</sql><select id="selectListId" resultMap="Base_Result_Map">SELECT *FROM `mysql_backups`WHERE `status` != 0AND id = #{id}</select><select id="selectBackupsList" resultMap="Base_Result_Map">SELECT *FROM `mysql_backups`WHERE `status` != 0ORDER BY create_time DESC</select>
</mapper>

Service 接口和实现类
service 接口

import com.baomidou.mybatisplus.service.IService;
import com.mobaijun.module.model.system.backups.SystemMysqlBackups;import java.util.List;/*** ClassName:SystemMysqlBackupsservice* 类描述: MySQL备份接口*/
public interface SystemMysqlBackupsService extends IService<SystemMysqlBackups> {/*** 查询所有备份数据*/List<SystemMysqlBackups> selectBackupsList();/*** mysql备份接口*/Object mysqlBackups(String filePath, String url, String userName, String password);/*** 根据ID查询*/SystemMysqlBackups selectListId(Long id);/*** 恢复数据库** @param smb      恢复对象* @param userName 数据库用户名* @param password 数据库密码* @return*/Object rollback(SystemMysqlBackups smb, String userName, String password);
}

实现类:

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.mobaijun.module.core.constant.common.Constants;
import com.mobaijun.module.core.tips.ErrorTip;
import com.mobaijun.module.dao.system.backups.SystemMysqlBackupsMapper;
import com.mobaijun.module.model.system.backups.SystemMysqlBackups;
import com.mobaijun.module.service.system.backups.SystemMysqlBackupsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.Date;
import java.util.List;/*** ClassName:SystemMysqlBackupsService* 类描述: MySQL备份实现*/
@Slf4j
@Service
public class SystemMysqlBackupsServiceImpl extends ServiceImpl<SystemMysqlBackupsMapper, SystemMysqlBackups> implements SystemMysqlBackupsService {@Resourceprivate SystemMysqlBackupsMapper systemMysqlBackupsMapper;@Overridepublic List<SystemMysqlBackups> selectBackupsList() {return systemMysqlBackupsMapper.selectBackupsList();}@Overridepublic Object mysqlBackups(String filePath, String url, String userName, String password) {// 获取ipfinal String ip = url.substring(13, 22);// 获取端口号final String port = url.substring(23, 27);// 获取数据库名称final String database_name = url.substring(28, 42);// 数据库文件名称StringBuilder mysqlFileName = new StringBuilder().append(Constants.DATA_BASE_NAME).append("_").append(DateUtil.format(new Date(), "yyyy-MM-dd-HH-mm-ss")).append(Constants.FILE_SUFFIX);// 备份命令StringBuilder cmd = new StringBuilder().append("mysqldump ").append("--no-tablespaces ").append("-h").append(ip).append(" -u").append(userName).append(" -p").append(password)// 排除MySQL备份表.append(" --ignore-table ").append(database_name).append(".mysql_backups ").append(database_name).append(" > ").append(filePath).append(mysqlFileName);// 判断文件是否保存成功if (!FileUtil.exist(filePath)) {FileUtil.mkdir(filePath);return new ErrorTip(HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE.value(), "备份失败,文件保存异常,请查看文件内容后重新尝试!");}// 获取操作系统名称String osName = System.getProperty("os.name").toLowerCase();String[] command = new String[0];if (Constants.isSystem(osName)) {// Windowscommand = new String[]{"cmd", "/c", String.valueOf(cmd)};} else {// Linuxcommand = new String[]{"/bin/sh", "-c", String.valueOf(cmd)};}SystemMysqlBackups smb = new SystemMysqlBackups();// 备份信息存放到数据库smb.setMysqlIp(ip);smb.setMysqlPort(port);smb.setBackupsName(String.valueOf(mysqlFileName));smb.setDatabaseName(database_name);smb.setMysqlCmd(String.valueOf(cmd));smb.setBackupsPath(filePath);smb.setCreateTime(DateTime.now());smb.setStatus(1);smb.setOperation(0);systemMysqlBackupsMapper.insert(smb);log.error("数据库备份命令为:{}", cmd);// 获取Runtime实例Process process = null;try {process = Runtime.getRuntime().exec(command);if (process.waitFor() == 0) {log.info("Mysql 数据库备份成功,备份文件名:{}", mysqlFileName);} else {return new ErrorTip(HttpStatus.INTERNAL_SERVER_ERROR.value(), "网络异常,数据库备份失败");}} catch (Exception e) {e.printStackTrace();return new ErrorTip(HttpStatus.INTERNAL_SERVER_ERROR.value(), "网络异常,数据库备份失败");}return smb;}@Overridepublic SystemMysqlBackups selectListId(Long id) {return systemMysqlBackupsMapper.selectListId(id);}@Overridepublic Object rollback(SystemMysqlBackups smb, String userName, String password) {// 备份路径和文件名StringBuilder realFilePath = new StringBuilder().append(smb.getBackupsPath()).append(smb.getBackupsName());if (!FileUtil.exist(String.valueOf(realFilePath))) {return new ErrorTip(HttpStatus.NOT_FOUND.value(), "文件不存在,恢复失败,请查看目录内文件是否存在后重新尝试!");}StringBuilder cmd = new StringBuilder().append("mysql -h").append(smb.getMysqlIp()).append(" -u").append(userName).append(" -p").append(password).append(" ").append(smb.getDatabaseName()).append(" < ").append(realFilePath);String[] command = new String[0];log.error("数据库恢复命令为:{}", cmd);// 获取操作系统名称String osName = System.getProperty("os.name").toLowerCase();if (Constants.isSystem(osName)) {// Windowscommand = new String[]{"cmd", "/c", String.valueOf(cmd)};} else {// Linuxcommand = new String[]{"/bin/sh", "-c", String.valueOf(cmd)};}// 恢复指令写入到数据库smb.setMysqlBackCmd(String.valueOf(cmd));// 更新操作次数smb.setRecoveryTime(DateTime.now());smb.setOperation(smb.getOperation() + 1);// 获取Runtime实例Process process = null;try {process = Runtime.getRuntime().exec(command);if (process.waitFor() == 0) {log.error("Mysql 数据库恢复成功,恢复文件名:{}", realFilePath);} else {return new ErrorTip(HttpStatus.GATEWAY_TIMEOUT.value(), "网络异常,恢复失败,请稍后重新尝试!");}} catch (Exception e) {e.printStackTrace();return new ErrorTip(HttpStatus.GATEWAY_TIMEOUT.value(), "网络异常,恢复失败,请稍后重新尝试!");}return smb;}
}

写的工具类方法如下:

/*** 文件后缀*/
public static final String FILE_SUFFIX = ".sql";/*** 判断操作系统类型、Linux|Windows
*/
public static boolean isSystem(String osName) {Boolean flag = null;if (osName.startsWith("windows")) {flag = true;} else if (osName.startsWith("linux")) {flag = false;}return flag;
}

控制器

import com.mobaijun.module.core.constant.common.Constants;
import com.mobaijun.module.core.tips.ErrorTip;
import com.mobaijun.module.core.tips.SuccessTip;
import com.mobaijun.module.model.system.backups.SystemMysqlBackups;
import com.mobaijun.module.service.system.backups.SystemMysqlBackupsService;
import com.mobaijun.module.web.annotion.ApiJsonObject;
import com.mobaijun.module.web.annotion.ApiJsonProperty;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.Map;/*** ClassName:SystemMysqlBackupsController* 类描述: MySQL数据备份接口*/
@RestController
@Api(description = "MySQL数据备份")
@RequestMapping(value = "/api/system/baskups")
public class SystemMysqlBackupsController {/*** 数据库用户名*/@Value("${spring.datasource.username}")private String userName;/*** 数据库密码*/@Value("${spring.datasource.password}")private String password;/*** 数据库url*/@Value("${spring.datasource.url}")private String url;/*** Windows数据库备份地址*/@Value("${spring.datasource.win-path}")private String windowsPath;/*** Linux数据库备份地址*/@Value("${spring.datasource.linux-path}")private String linuxPath;@Autowiredprivate SystemMysqlBackupsService systemMysqlBackupsService;@ApiOperation(value = "获取所有备份数据列表")@GetMapping("/backupsList")public Object backupsList() {List<SystemMysqlBackups> systemMysqlBackups = systemMysqlBackupsService.selectBackupsList();return new SuccessTip(systemMysqlBackups);}@ApiOperation(value = "MySQL备份")@PostMapping("/mysqlBackups")public Object mysqlBackups() {String path = null;// 获取操作系统名称String osName = System.getProperty("os.name").toLowerCase();if (Constants.isSystem(osName)) {// Windowspath = this.windowsPath;} else {// Linuxpath = this.linuxPath;}// 数据库用户名String userName = this.userName;// 数据库密码String password = this.password;// 数据库地址String url = this.url;// 调用备份Object systemMysqlBackups = systemMysqlBackupsService.mysqlBackups(path, url, userName, password);return new SuccessTip(systemMysqlBackups);}@ApiOperation(value = "恢复数据库")@PutMapping("/rollback")public Object rollback(@ApiJsonObject(name = "恢复数据库", value = {@ApiJsonProperty(name = "id", example = "1", value = "数据id", dataType = "long", required = true)})@ApiParam(value = "恢复数据库") @RequestBody Map<String, Object> map) {Long id = Long.valueOf(map.get("id").toString());if (id == null) {return new ErrorTip(HttpStatus.INTERNAL_SERVER_ERROR.value(), "id不能为null,请重新尝试!");}// 数据库用户名String userName = this.userName;// 数据库密码String password = this.password;// 根据id查询查询已有的信息SystemMysqlBackups smb = systemMysqlBackupsService.selectListId(id);// 恢复数据库Object rollback = systemMysqlBackupsService.rollback(smb, userName, password);// 更新操作次数systemMysqlBackupsService.updateById(smb);return new SuccessTip(rollback);}
}

相关文章:

基于SpringBoot实现MySQL备份与还原

基于SpringBoot实现MySQL备份与还原&#xff0c;需求是在页面上对所有的平台数据执行备份和恢复操作&#xff0c;那么就需要使用代码去调用MySQL备份和恢复的指令&#xff0c;下面是具体实现步骤&#xff1b; MySQL备份表设计 CREATE TABLE IF NOT EXISTS mysql_backups (id …...

【VUE 监听用户滑动】

监听滑动方法 一. touchstart、touchmove、touchend二.v-touch三. 自定义指令 一. touchstart、touchmove、touchend 在 Vue 中监听用户往哪个方向滑动可以通过添加事件监听器&#xff0c;然后在事件回调函数中判断滑动方向。常用的事件监听器有touchstart、touchmove、touche…...

通义大模型:打造更智能、更灵活的自然语言处理技术

大家好&#xff0c;今天我想向大家介绍一款备受瞩目的自然语言处理技术——通义大模型。作为一种基于深度学习的人工智能技术&#xff0c;通义大模型能够模拟人类的思维方式&#xff0c;实现更智能、更灵活的自然语言处理&#xff0c;为我们的生活和工作带来了极大的便利。 在…...

Go 流程控制

if语句使用 package mainimport "fmt"func main() {score : 700if score 700 {fmt.Println("清华")}//if支持一个初始化语句 初始化语句和条件判断用;分割if a : 700; a 700 {fmt.Println("清华")}}清华 清华if_else使用 package mainimpor…...

Python opennsfw/opennsfw2 图片/视频 鉴黄 笔记

nsfw&#xff08; Not Suitable for Work&#xff09;直接翻译就是 工作的时候不适合看&#xff0c;真文雅 nsfw效果&#xff0c;注意底部的分数 大体流程&#xff0c;输入图片/视频&#xff0c;输出0-1之间的数字&#xff0c;一般情况下&#xff0c;Scores < 0.2 认为是非…...

四、Linux中cd、pwd以及相对/绝对路径和特殊路径符

1、cd命令&#xff1a; cd命令可以切换当前工作目录&#xff0c;基础语法是&#xff1a; cd [linux路径] &#xff08;1&#xff09;、打开Linux的命令提示行&#xff0c;当前工作目录是home&#xff0c;输入“cd /”&#xff0c;可以切换到根目录下&#xff0c;在根目录下输…...

第八章 CUDA内存应用与性能优化篇(上篇)

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…...

chrome浏览器改为黑色背景

chrome浏览器改为黑色背景 https://blog.csdn.net/yuchen_123456/article/details/127487278 不一样的地方&#xff1a;...

【AI】《动手学-深度学习-PyTorch版》笔记(十七):卷积神经网络入门

AI学习目录汇总 1、从全链接层到卷积 1.1 卷积 我们在前面学习的多层感知机中,已经认识了全链接层,缺点很明显,在稍微大点的网络模型中,参数成指数级别增长。参数量很快就达到数十亿,这样的量级几乎无法计算。为此科学家们想出一个减少参数的方法:卷积。 从全链接层到…...

element-ui table表格,根据缩放自适应

安装依赖 npm install af-table-columnmain.js 中引入依赖&#xff0c; import Vue from vue import ElementUI from element-ui //需要按需引入&#xff0c;先引入vue并引入element-ui import AFTableColumn from af-table-column Vue.use(AFTableColumn)demo样式&#xff1…...

【electron】electron安装过慢和打包报错:Unable to load file:

文章目录 一、安装过慢问题:二、打包报错&#xff1a;Unable to load file: 一、安装过慢问题: 一直处于安装过程 【解决】 #修改npm的配置文件 npm config edit#添加配置 electron_mirrorhttps://cdn.npm.taobao.org/dist/electron/二、打包报错&#xff1a;Unable to load…...

微服务部署中的动态扩缩容和故障迁移实践经验!快来看看!

随着微服务架构的快速普及&#xff0c;越来越多的组织开始将传统的单体应用转变为分布式的微服务系统。在这种架构下&#xff0c;动态扩缩容和故障迁移变得尤为重要&#xff0c;因为它们能够帮助我们应对不断变化的负载和故障情况。本文将详细介绍动态扩缩容和故障迁移的概念&a…...

代码随想录第四十五天

代码随想录第四十五天 Leetcode 70. 爬楼梯Leetcode 322. 零钱兑换Leetcode 279. 完全平方数 Leetcode 70. 爬楼梯 题目链接: 爬楼梯 自己的思路:之前是用斐波那契做的&#xff0c;但是现在学了完全背包&#xff0c;可以将m2拓展的更大一点&#xff0c;我们可以将楼顶n设为背包…...

Vue Baidu Map--自定义点图标bm-marker

自定义点图标 将准备好的图标放到项目中 使用import引入&#xff0c; 并在data中进行声明 <script> import mapIconRed from ./vue-baidu-map/img/marker_red_sprite.png export default {data() {return {mapIconRed,}}, } </script>在<bm-marker>中加入参…...

ZooKeeper的基本概念

集群角色 通常在分布式系统中&#xff0c;构成一个集群的每一台机器都有自己的角色&#xff0c;最典型的集群模式就是Master/Slave模式(主备模式)。在这种模式中&#xff0c;我们把能够处理所有写操作的机器称为Master机器&#xff0c;把所有通过异步复制方式获取最新数据&…...

SpringBoot复习:(51)默认情况下DataSource是怎么创建出来的,是什么类型的?

DataSource是通过DataSourceAutoConfiguration创建的&#xff0c;这个类代码如下&#xff1a; 可以看到DataSourceAutoConfiguration有个静态内部类PooledDataSourceConfiguration,在这个类上有个Import注解&#xff0c;导入了DataSourceConfiguration.Hikari这个类&#xff0…...

Python+Selenium自动化测试环境搭建步骤(selenium环境搭建)

一、自动化简介 1.自动化测试概念&#xff1a; 是把以人为驱动的测试转化为机器执行的一种过程&#xff0c;它是一种以程序测试程序的过程 2.自动化测试分类&#xff1a; 一般IT上所说的自动化测试是指功能自动化测试&#xff0c;通过编码的方式用一段程序来测试一个软件的功…...

实现简单纯Canvas文本输入框,新手适用

文章目录 概要效果技术细节代码 概要 Canvas上面提供输入&#xff1a; 一、最简单可能是用dom渲染一个input,覆盖在图形上面进行文本编辑&#xff0c;编辑完再把内容更新到图形.这样简单&#xff0c;但是缺点也明显&#xff0c;就是它不是真正绘制在canvas上面&#xff0c;没…...

React构建的JS优化思路

背景 之前个人博客搭建时&#xff0c;发现页面加载要5s才能完成并显示 问题 React生成的JS有1.4M&#xff0c;对于个人博客服务器的带宽来说&#xff0c;压力较大&#xff0c;因此耗费了5S的时间 优化思路 解决React生成的JS大小&#xff0c;因为我用的是react-router-dom…...

vim键盘图

国外&#xff1a;http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html&#xff0c;原创&#xff0c;有SVG图&#xff0c;有分步骤的图。 国内翻译&#xff1a;[https://blog.csdn.net/qq_41052753/article/details/101031847 有几个配色&#xff0c;很高清&…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...