SQL基础入门——C++与SQL连接实践
在开发中,C++与SQL数据库的连接和交互是非常常见的需求。通过将C++与SQL数据库连接起来,我们可以轻松地执行数据存取、查询、更新等操作。C++与数据库的集成通常依赖于数据库的连接器或驱动程序,本章节将详细讲解如何在C++中使用MySQL Connector与SQLite连接,并深入讨论如何执行SQL查询(包括SELECT
、INSERT
等操作)以及如何处理查询结果。
1. 使用C++的MySQL Connector与SQLite连接
在进行C++与SQL数据库的连接时,我们需要使用对应的数据库驱动程序或连接器。对于MySQL,常用的库是 MySQL Connector/C++,对于SQLite,使用的是 SQLite3 C API。下面分别介绍如何配置和使用这两个库。
1.1 使用MySQL Connector/C++连接MySQL数据库
MySQL提供了一个官方的C++连接器(MySQL Connector/C++),它提供了一组类和函数来实现C++程序与MySQL数据库的通信。这个连接器支持多种MySQL版本,并且可以跨平台使用。
1.1.1 安装MySQL Connector/C++
首先,你需要安装MySQL Connector/C++。根据操作系统的不同,安装方式可能会有所不同:
- Windows:可以从MySQL官方网站下载Windows版的MySQL Connector/C++,并按照安装向导进行安装。
- Linux:可以使用包管理工具进行安装,例如,在Ubuntu上使用
apt
命令:sudo apt-get install libmysqlcppconn-dev
- MacOS:通过Homebrew安装:
brew install mysql-connector-c++
1.1.2 配置和代码示例
安装完成后,我们需要在C++代码中包含MySQL Connector/C++的头文件,并链接到库。
C++连接MySQL的示例代码:
#include <mysql_driver.h>
#include <mysql_connection.h>
#include <cppconn/prepared_statement.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <iostream>
#include <stdexcept>using namespace std;int main() {try {// 创建MySQL连接对象sql::mysql::MySQL_Driver *driver;sql::Connection *con;// 获取MySQL驱动并连接数据库driver = sql::mysql::get_mysql_driver_instance();con = driver->connect("tcp://127.0.0.1:3306", "user", "password");// 选择数据库con->setSchema("test_db");// 创建查询语句sql::Statement *stmt = con->createStatement();sql::ResultSet *res = stmt->executeQuery("SELECT * FROM employees");// 处理查询结果while (res->next()) {cout << "ID: " << res->getInt("id") << ", Name: " << res->getString("name") << endl;}// 清理资源delete res;delete stmt;delete con;} catch (sql::SQLException &e) {cout << "Error: " << e.what() << endl;}return 0;
}
步骤解释:
- 使用
sql::mysql::get_mysql_driver_instance()
获取MySQL驱动。 - 使用
driver->connect()
方法连接到MySQL服务器,并选择目标数据库。 - 使用
createStatement()
创建SQL语句对象,执行SELECT
查询。 - 使用
ResultSet
对象处理查询结果。
编译命令:
g++ -o mysql_example mysql_example.cpp -lmysqlcppconn
1.2 使用SQLite3连接SQLite数据库
SQLite是一种轻量级的嵌入式数据库,适用于嵌入式系统、移动应用以及需要小型数据库的应用。与MySQL不同,SQLite不需要独立的数据库服务器,它直接在应用程序中运行。SQLite提供了C语言的API,C++开发者可以直接使用C API与SQLite交互。
1.2.1 安装SQLite3
在Linux和MacOS系统中,SQLite3通常是预安装的。如果没有安装,可以通过以下命令安装:
-
Linux (Debian/Ubuntu):
sudo apt-get install sqlite3 libsqlite3-dev
-
MacOS (使用Homebrew):
brew install sqlite
在Windows平台,可以下载SQLite的预编译二进制文件,并将sqlite3.dll
和相关头文件添加到C++项目中。
1.2.2 配置和代码示例
SQLite3提供了C语言接口,C++可以直接使用这些API。下面是一个C++程序示例,展示如何使用SQLite3连接和查询SQLite数据库。
C++连接SQLite的示例代码:
#include <sqlite3.h>
#include <iostream>
#include <stdexcept>using namespace std;// 回调函数,用于处理查询结果
static int callback(void *data, int argc, char **argv, char **azColName) {for (int i = 0; i < argc; i++) {cout << azColName[i] << ": " << (argv[i] ? argv[i] : "NULL") << endl;}return 0;
}int main() {sqlite3 *db;char *errMsg = 0;// 打开数据库连接if (sqlite3_open("test.db", &db)) {cerr << "Can't open database: " << sqlite3_errmsg(db) << endl;return 1;}// 执行查询语句const char* sql = "SELECT * FROM employees";if (sqlite3_exec(db, sql, callback, 0, &errMsg) != SQLITE_OK) {cerr << "SQL error: " << errMsg << endl;sqlite3_free(errMsg);} else {cout << "Query executed successfully" << endl;}// 关闭数据库连接sqlite3_close(db);return 0;
}
步骤解释:
- 使用
sqlite3_open()
打开SQLite数据库文件(如果文件不存在,则会自动创建)。 - 使用
sqlite3_exec()
执行SQL查询,并将结果通过回调函数callback()
输出。 - 使用
sqlite3_close()
关闭数据库连接。
编译命令:
g++ -o sqlite_example sqlite_example.cpp -lsqlite3
2. 在C++中执行SQL查询:SELECT, INSERT
执行SQL查询时,C++与数据库的交互主要通过连接器提供的API完成。我们可以执行各种SQL命令,包括SELECT
、INSERT
、UPDATE
等操作。常见的步骤是构造查询语句、执行查询、处理结果集。
2.1 执行SELECT
查询
对于SELECT
查询,程序会返回查询结果集,通常我们需要遍历结果集并提取数据。
MySQL示例:
sql::ResultSet *res = stmt->executeQuery("SELECT id, name, age FROM employees WHERE age > 30");while (res->next()) {int id = res->getInt("id");string name = res->getString("name");int age = res->getInt("age");cout << "ID: " << id << ", Name: " << name << ", Age: " << age << endl;
}
SQLite示例:
const char* sql = "SELECT id, name, age FROM employees WHERE age > 30";
if (sqlite3_exec(db, sql, callback, 0, &errMsg) != SQLITE_OK) {cerr << "SQL error: " << errMsg << endl;sqlite3_free(errMsg);
}
2.2 执行INSERT
查询
INSERT
语句用于向数据库表中插入数据。与SELECT
不同,INSERT
语句不会返回结果集,但需要检查执行是否成功。
MySQL示例:
sql::PreparedStatement *prep_stmt = con->prepareStatement("INSERT INTO employees(name, age) VALUES (?, ?)");
prep_stmt->setString(1, "John Doe");
prep_stmt->setInt(2, 28);
prep_stmt->executeUpdate();
delete prep_stmt;
SQLite示例:
const char* sql = "INSERT INTO employees (name, age) VALUES ('John Doe', 28)";
if (sqlite3_exec(db, sql, 0, 0, &errMsg) != SQLITE_OK) {cerr << "SQL error: " << errMsg << endl;sqlite3_free(errMsg);
}
3. 处理查询结果:mysql_fetch_row
/ sqlite3_step
处理查询结果是与SQL数据库交互中的重要部分。对于MySQL和SQLite,查询结果的处理方式略有不同。
3.1 MySQL - 使用mysql_fetch_row
在较旧的MySQL C API中,mysql_fetch_row()
是用来获取查询结果的函数。它返回一个包含行数据的数组。
MYSQL_RES *res;
MYSQL_ROW row;
res = mysql_store_result(con);
while ((row = mysql_fetch_row(res)) != NULL) {cout << "ID: " << row[0] << ", Name: " << row[1] << endl;
}
3.2 SQLite - 使用sqlite3_step
SQLite中使用sqlite3_step()
函数遍历查询结果。每次调用sqlite3_step()
时,返回一行数据,直到所有数据处理完毕。
sqlite3_stmt *stmt;
sqlite3_prepare_v2(db, "SELECT id, name FROM employees", -1, &stmt, 0);
while (sqlite3_step(stmt) == SQLITE_ROW) {int id = sqlite3_column_int(stmt, 0);const char* name = (const char*)sqlite3_column_text(stmt, 1);cout << "ID: " << id << ", Name: " << name << endl;
}
sqlite3_finalize(stmt);
总结
本章节介绍了如何在C++程序中使用MySQL Connector和SQLite3进行数据库连接与交互。我们展示了如何执行常见的SQL查询(包括SELECT
、INSERT
等),并处理查询结果。通过这些实践,开发者可以方便地将SQL数据库集成到C++项目中,充分发挥数据库在数据存储和管理中的优势。对于实际应用中的性能需求,可以通过优化SQL查询、连接池等技术进一步提升系统的效率。
相关文章:
SQL基础入门——C++与SQL连接实践
在开发中,C与SQL数据库的连接和交互是非常常见的需求。通过将C与SQL数据库连接起来,我们可以轻松地执行数据存取、查询、更新等操作。C与数据库的集成通常依赖于数据库的连接器或驱动程序,本章节将详细讲解如何在C中使用MySQL Connector与SQL…...
对max_seq_length参数的理解,基于open-instruct框架:中英文解释
使用open-instruct (https://github.com/allenai/open-instruct )框架,对其中的max_seq_length参数的理解记录下来。 bash脚本内容如下: # 设置模型和训练参数 MODEL_NAMEgoogle/gemma-2-2b MACHINE_RANK0 MAIN_PROCESS_IP127.0.0.1 MAIN_PROCESS_PORT2…...
似然分布(Likelihood Distribution)和似然函数(Likelihood Function)有什么区别?中英双语
中文版 在统计学中,似然分布(Likelihood Distribution)和似然函数(Likelihood Function)是两个相关但有所不同的概念。它们都涉及给定参数的情况下,数据出现的概率,但是它们的使用方式和含义有…...
LINUX2.4.x网络安全框架
在分析LINUX2.4.x网络安全的实现之前先简介一下它里面包括的几个重要概念:netfilter、iptables、match、target、nf_sockopt_ops、网络安全功能点的实现。详解会在后面的分析中讲到。 首先是netfilter,它定义了协议栈中的检查点和在检查点上引用的数据结…...
Python毕业设计选题:基于django+vue的智能停车系统的设计与实现
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 车主管理 车辆信息管理 车位信息管理 车位类型管理 系统…...
AI界的信仰危机:单靠“规模化”智能增长的假设,正在面临挑战
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
JMeter 并发策略-针对准点秒杀场景的压测实现
一、场景的压测实现 1,创建线程组,10并发用户执行5次; 2,创建 Synchronizing Timer 元件,用于同步线程,设置同步元件 Synchronizing Timer 3,创建 http 请求4,创建 view results in table 元件…...
【如何提升代码工程质量】code review篇
应该对于基本上所有软件相关的公司来说,都有committer机制,即代码写好之后会提交合并请求,待相关人员code review通过后再进行合入,所以code review就是代码合入代码仓库的最后一道关卡,对于代码质量的影响也是不容忽视…...
1041.困于环中的机器人
题目: 解题思路; 由于机器人会一直重复指令,存在重复多次指令才回到原点的情况,需要对不同情况经行分析。 当执行一次指令后回到原点,则机器人永远无法回到原点。当执行一次指令后不回到原点,只有方向向北的无法在多次…...
Python实现IP代理池
文章目录 Python实现IP代理池一、引言二、步骤一:获取代理IP1、第一步:爬取代理IP2、第二步:验证代理IP的有效性 三、步骤二:构建IP代理池四、使用示例1、完整的使用示例2、注意事项3、处理网络问题 五、总结 Python实现IP代理池 …...
【Linux网络编程】第二弹---Socket编程入门指南:从IP、端口号到传输层协议及编程接口全解析
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、Socket 编程预备 1.1、理解源 IP 和目的 IP 1.2、认识端口号 1.2.1、端口号范围划分 1.2.2、理解 &q…...
【机器学习】机器学习学习笔记 - 监督学习 - 多项式回归决策树回归 - 03
多项式回归 解决线性回归的准备性不足问题(线性回归只能是直线,多项式回归引入多项式可以是曲线)通过对预测值进行多项式转换, 使得回归模型可以是非线性的多项式回归的优点是可以处理非线性的数据多项式回归的缺点是它对数据进行了多项式转换 加菲工具࿰…...
篡改猴(Tampermonkey)使用指南:为您的浏览器增添超级能力
篡改猴(Tampermonkey)使用指南:为您的浏览器增添超级能力 篡改猴(Tampermonkey) 是一款流行的用户脚本管理工具,可以在浏览器中安装和运行用户脚本,从而增强或自定义网页的功能。无论是去广告、…...
23省赛区块链应用与维护(房屋租凭【下】)
23省赛区块链应用与维护(房屋租凭) 背景描述 随着异地务工人员的增多,房屋租赁成为一个广阔市场。目前,现有技术中的房屋租赁是由房主发布租赁信息,租赁信息发布在房屋中介或租赁软件,租客获取租赁信息后,现场看房,并签订纸质的房屋租赁合同,房屋租赁费用通过中介或…...
Java中三种常用布局方式
引言 在Java Swing和JavaFX中,布局管理器(Layout Managers)用于控制组件(如按钮、文本框等)在容器(如窗口、面板等)内的位置和大小。下面介绍Java Swing中常用的三种布局方式: 1. Fl…...
06_数据类型
数据类型 数据类型分类 JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbol 类型的值和第八种 BigInt类型,当前课程暂不涉及) 据类型分类 原始类型(基础类型) var age = 20, var name = 尚学堂"; var le…...
及时+准确|主动元数据平台在监管报送场景中的应用实践
面对海量的数据报送需求和日益严格的监管要求,如何实现监管报送的全链路自动化数据质量保障,是金融机构亟待解决的重要课题。本文旨在介绍一种全新的监管报送场景方案,帮助金融机构通过“一键溯源与口径自动盘点、指标同源自动化分析、全链路…...
[python脚本处理文件入门]-18.使用Python进行PDF文件的合并与拆分
哈喽,大家好,我是木头左! Python PDF处理库概览 1. PyPDF2 PyPDF2是一个纯Python编写的库,用于PDF文件的读写和操作。它提供了丰富的功能,包括PDF文件的合并、拆分、加密、解密等。PyPDF2的安装非常简单,只需通过pip即可安装: pip install PyPDF2安装完成后,你就可以…...
4、常量和进制转换
1、常量 1.1、常量 常量是在程序运行中值不能内改变(常数)。 整型:12 55 实型:21.5 字符型常量: ‘A’ 1.2、常量不同进制表示 常量数据在计算机中除了用 十进制 表示,还可以用 二进制、八进制、十六进制表示。 十进制数据&…...
C++:探索哈希表秘密之哈希桶实现哈希
文章目录 前言一、链地址法概念二、哈希表扩容三、哈希桶插入逻辑四、析构函数五、删除逻辑六、查找七、链地址法代码实现总结 前言 前面我们用开放定址法代码实现了哈希表: C:揭秘哈希:提升查找效率的终极技巧_1 对于开放定址法来说&#…...
java函数式编程和Lambda表达式
https://www.bilibili.com/video/BV1fz421C7tj?spm_id_from333.788.videopod.episodes&vd_source12d5954938d20d50645e227a6a728c76 如果一个接口中只有一个方法,那么就可以函数对象化: interface Add {int add(int a, int b);}Add add (a, b) -&…...
【线程】Java多线程代码案例(2)
【线程】Java多线程代码案例(2) 一、定时器的实现1.1Java标准库定时器1.2 定时器的实现 二、线程池的实现2.1 线程池2.2 Java标准库中的线程池2.3 线程池的实现 一、定时器的实现 1.1Java标准库定时器 import java.util.Timer; import java.util.Timer…...
IOU Loss详解
IoU(Intersection over Union是目标检测中常用的指标,用于评估预测框和真实框的重叠程度。基于 IoU 的损失函数(IoU Loss)是通过优化 IoU 值来提升模型预测框的精度。 IoU 的计算公式 给定预测框 ( B_p ) 和真实框 ( B_g )&#…...
nfs服务器
1、简介 NFS (Network File System,网络文件系统)是FreeBSD支持的文件系统中的一种,它允许网络中的计 算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源,主要在unix系列操作系统上…...
Diving into the STM32 HAL----- IWDG and WWDG Timers笔记
墨菲定律指出,任何可能出错的事情都会出错。尤其是对于嵌入式系统来说,情况尤其如此。除了硬件故障也会对软件产生影响外,即使是最仔细的设计也可能会出现一些意外情况,导致我们设备的异常行为。这可能会产生重大成本,…...
使用statefulset管理pod
deployment主要管理无状态的pod,就算需要磁盘也是期望做动态扩容的。而对于那种有状态需要存储数据的,如log、数据库、消息中间件需要持久化数据的,则建议使用StatefulSet,我们的pod现在扩充了pv和pvc,那就使用Statefu…...
6个AI生成PPT的网站,pptai一键生成
演讲和展示PPT是当今办公和学习中的重要组成部分,无论是工作汇报、发表研究成果,还是课件培训,一款精心制作的PPT能够有效吸引观众的参与,并将你的信息深入人心。借助不断进步的人工智能技术,众多免费的AI PPT生成器可…...
【力扣】541.反转字符串2
问题描述 思路解析 每当字符达到2*k的时候,判断,同时若剩余字符>k,只对前k个进行判断(这是重点)因为字符串是不可变变量,所以将其转化为字符串数组,最后才将结果重新转变为字符串 字符串->字符数组 …...
如何优雅的用PyQt访问http(仅供参考)
使用pydantic或dataclaass创建一个数据存储对象 第一种 # coding: utf-8 from typing import Anyimport requests from pydantic import Field, BaseModelclass ResponseModel(BaseModel):status: bool Field(True, description"响应状态")message: str Field(请求…...
小程序租赁系统开发的优势与应用解析
内容概要 随着科技的迅猛发展,小程序租赁系统应运而生,成为许多企业优化业务的重要工具。首先,它提升了用户体验。想象一下,用户只需轻轻一点,就能够浏览和租赁心仪的商品,这种便捷的过程使繁琐的操作大大…...
Group Convolution(分组卷积)
分组卷积的优点: 减少参数数量: 在分组卷积中,每个分组只与一部分输入通道进行卷积运算,这意味着模型的参数数量会减少。例如,如果一个卷积层有8个输入通道和8个输出通道,且不使用分组,那么将有…...
uniapp在H5使用vue-router路由返回上一页不会触发销毁函数解决方法
问题:uniapp在H5使用vue-router路由,如果在H5平台上进行页面刷新操作,再返回上一页,可能会遇到beforeDestroy、destroyed、onUnload生命周期钩子不被触发的问题。这是因为在H5中,页面的刷新实际上是整个应用的重新加载…...
YOLOv8配置文件应该如何命名?
文末有重点 1.配置文件解析代码yolov8/ultralytics/nn/tasks.py 如下: def yaml_model_load(path):"""Load a YOLOv8 model from a YAML file."""import repath Path(path)if path.stem in (fyolov{d}{x}6 for x in nsmlx for d i…...
扫雷-完整源码(C语言实现)
云边有个稻草人-CSDN博客 在学完C语言函数之后,我们就有能力去实现简易版扫雷游戏了(成就感满满),下面是扫雷游戏的源码,快试一试效果如何吧! 在test.c里面进行扫雷游戏的测试,game.h和game.c…...
数据库(MySQL黑马)
基础篇 MySQL概述 数据库概述 数据库相关概念 主流的关系型数据库管理系统 MySQL数据库的安装与启动 下载:MySQL :: MySQL Community Downloads 安装步骤 MySQL―8.0.40超详细保姆级安装教程_mysql8.0.40安装教程-CSDN博客文章浏览阅读1k次。_mysql8.0.40安装教…...
UE5 Line Trace By Channel(通道线条追踪)节点
在 Unreal Engine 5 (UE5) 中,Line Trace By Channel 是一个常用于进行物理射线检测(raycasting)的节点。它会沿着一条从起点到终点的直线发射一条射线,并检测射线与世界中任何物体的碰撞。这个节点广泛应用于枪械射击、检测物体、…...
How to use the ‘git log‘ command to get change log for each file?
1. Using git log command #!/bin/bash# 目标文件名 output_file"git_log.csv"# 打印 CSV 文件的标题行 echo "CommitID,Author,Author Email,Date,Added-Lines Removed-Lines File" > $output_file echo "CommitID,Author,Author Email,Date,Add…...
node.js中实现router模块化管理
index.js const express require(express); const app express()// 导入路由模块 const router require(./router/index)// 注册路由模块 app.use(router)app.listen(3000, ()>{console.log(http://127.0.0.1:3000) })router/index.js const express require(express…...
突破性算法:让无人机集群在狭窄空间内穿针引线
导读 在建筑救援、森林搜索等任务中,无人机集群经常会遇到狭窄空间限制和动态障碍物变化等挑战。这些挑战会导致集群内部冲突,或在执行任务时因避让动态障碍物而导致系统混乱。实际应用场景和任务的严格特征往往使得全局搜索难以优化,而局部避…...
人工智能如何改变你的生活?
在我们所处的这个快节奏的世界里,科技融入日常生活已然成为司空见惯的事,并且切实成为了我们生活的一部分。在这场科技变革中,最具变革性的角色之一便是人工智能(AI)。从我们清晨醒来直至夜晚入睡,人工智能…...
C语言main()函数
C语言main()函数 argc(argument count) 在C或C程序中,argc(argument count的缩写)是一个由程序运行时环境自动提供的整数,用于指示传递给main函数的命令行参数的数量。因此,不需要(…...
【LC】162. 寻找峰值
题目描述: 峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须…...
Zero to JupyterHub with Kubernetes上篇 - Kubernetes 离线二进制部署
前言: 纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 k8s二进…...
HTML5+JavaScript实现消消乐游戏
HTML5JavaScript实现消消乐游戏 点击两个相邻的方块来交换它们位置。 如果交换后形成三个或更多相同图案的方块连成一线,这些方块会被消除。 消除后,上方的方块会下落填补空缺,顶部会生成新的方块。 每消除一个方块得10分。例如࿰…...
深度学习:在PyTorch中进行模型验证完整流程
深度学习:在PyTorch中进行模型验证完整流程(以图像为例) 详细说明在PyTorch中进行模型验证的全过程。 模型验证的详细步骤和流程 1. 设置计算设备 选择合适的计算设备是性能优化的第一步。基于系统的资源(GPU的可用性…...
洛谷 P1747 好奇怪的游戏 C语言 bfs
题目: https://www.luogu.com.cn/problem/P1747#submit 题目描述 爱与愁大神坐在公交车上无聊,于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被打上了马赛克)。这个游戏类似象棋,但…...
豆包MarsCode
01 AI代码陪练 来到豆包MarsCode官网:http://sqllb.com/6FRiH76 ,点击左上方的代码练习,就能看到一个AI代码陪练的练习场。 在左边栏,可以看到各种各样的算法题目,在右侧是MarsCode AI,中间是算法题目和…...
Docker网络模式:桥接(Bridge)模式与主机模式(Host)实操对比(一)
文章目录 前言一、桥接模式(Bridge Mode)前言 随着容器化技术的发展,Docker 已成为开发和部署应用的首选工具之一。Docker 不仅简化了应用的打包过程,还提供了多种网络模式来满足不同应用场景下的需求。本文将重点探讨两种常用的 Docker 网络模式——桥接模式(Bridge Mod…...
3. STM32_串口
数据通信的基础概念 什么是串行/并行通信: 串行通信就是数据逐位按顺序依次传输 并行通信就是数据各位通过多条线同时传输。 什么是单工/半双工/全双工通信: 单工通信:数据只能沿一个方向传输 半双工通信:数据可以沿两个方向…...
【Git】Git 命令参考手册
目录 Git 命令参考手册1. 创建仓库1.1 创建一个新的本地仓库1.2 克隆一个仓库1.3 克隆仓库到指定目录 2. 提交更改2.1 显示工作目录中已修改的文件,准备提交2.2 将文件添加到暂存区,准备提交2.3 将所有已修改的文件添加到暂存区,准备提交2.4 …...