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

MySQL使用C语言连接

文章目录

  • MySQL使用C语言连接
    • 引入库
      • 下载库文件
      • 在项目中使用库
    • 使用库
      • 连接数据库
      • 下发SQL请求
      • 获取查询结果

MySQL使用C语言连接

引入库

要使用C语言连接MySQL,需要使用MySQL官网提供的库。

下载库文件

下载库文件

首先,进入MySQL官网,选择DEVELOPER ZONE(开发人员专区),然后点击MySQL Downloads。如下:

在这里插入图片描述

接下来选择Download Archives。如下:

在这里插入图片描述

因为我们是要使用C语言连接MySQL,所以这里选择MySQL Connector/C。如下:

在这里插入图片描述

最后选择适合自己平台的mysql connect库,然后点击下载就行了。如下:

在这里插入图片描述

上传到云服务器

因为我下载的是Linux下使用的库文件,因此下载完毕后需要将其上传到云服务器,我准备将下载的库文件存放在一个名为thirdPath的目录下。如下:

在这里插入图片描述

使用rz -E命令将刚才下载的库文件上传到云服务器。如下:

在这里插入图片描述

然后使用tar命令将压缩包解压到当前目录下。如下:

在这里插入图片描述

为了方便后面演示,这里使用mv命令将解压后的目录名称改短一点。如下:

在这里插入图片描述

进入解压后的目录当中,可以看到有一个include子目录和一个lib子目录。如下:

在这里插入图片描述

其中,include目录下存放的一堆头文件。如下:

在这里插入图片描述

而lib目录下存放的就是动静态库。如下:

在这里插入图片描述

在项目中使用库

在项目中使用库

为了方便在项目中使用刚才的库文件,可以在项目目录下创建两个软连接,分别连接到刚才的include目录和lib目录。如下:

在这里插入图片描述

这时直接在项目目录下,就能看到刚才include和lib目录下的内容。如下:

在这里插入图片描述

下面先通过调用mysql_get_client_info来判断库是否引入成功,该函数的作用就是获取客户端的版本信息。

代码如下:

#include <iostream>
#include <mysql.h>
using namespace std;int main()
{//获取客户端的版本信息cout<<"mysql client version: "<<mysql_get_client_info()<<endl;return 0;
}

为了方便后续重复编译源文件,可以在项目目录下创建一个Makefile,Makefile当中的内容如下:

在这里插入图片描述

说明一下:

  • -I:用于指明头文件的搜索路径。
  • -L:用于指明库文件的搜索路径。
  • -l:用于指明需要连接库文件路径下的哪一个库。

Makefile编写完毕后,直接通过make命令即可编译代码生成可执行程序。如下:

在这里插入图片描述

但此时生成的可执行程序还不能直接运行,通过ldd命令可以看到,该可执行程序所依赖的mysqlclient库找不到。如下:

在这里插入图片描述

原因如下:

  • gcc/g++编译器默认都是动态链接的,编译代码时默认使用的是动态库,所以生成的可执行程序在运行时需要找到对应的动态库进行链接,而我们使用的mysqlclient库并不在系统的搜索路径下。
  • 需要注意的是,Makefile中的-I-L-l这三个选项,只是在编译期间告诉编译器头文件和库文件在哪里,而可执行程序生成后就与编译器无关了。

解决该问题通常有三种做法:

  1. 将库文件拷贝到系统默认的库文件搜索路径下/lib64
  2. 将库文件所在的目录路径添加到LD_LIBRARY_PATH环境变量中,该环境变量可以用于指定查找动态库时的其他路径。
  3. 将库文件所在的目录路径保存到以.conf为后缀的配置文件中,然后将该文件拷贝到/etc/ld.so.conf.d/目录下,并使用ldconfig命令对配置文件进行更新,该目录下所有配置文件中的路径也将作为查找动态库时的搜索路径。

这里我们采用第三种方式进行解决。如下:

在这里插入图片描述

此时该可执行程序所依赖的mysqlclient库就能够被找到了。如下:

在这里插入图片描述

运行可执行程序后,可以看到客户端的版本为6.1.11,也就是刚才下载的库文件的版本。如下:

在这里插入图片描述

使用库

至此库已经成功被引入,剩下就是库接口的使用问题了。

连接数据库

创建MySQL对象

在连接数据库之前,需要先创建一个MySQL对象,创建MySQL对象的函数如下:

MYSQL* mysql_init(MYSQL *mysql);

说明一下

  • 该函数用来分配或者初始化一个MySQL对象,用于连接MySQL服务器。
  • 如果传入的参数是NULL,那么mysql_init将自动为你分配一个MySQL对象并返回。
  • 如果传入的参数是一个地址,那么mysql_init将在该地址处帮你完成初始化。

MYSQL对象中包含了各种信息,其类型定义如下:

typedef struct st_mysql {NET net;			/* Communication parameters */unsigned char	*connector_fd;		/* ConnectorFd for SSL */char *host,*user,*passwd,*unix_socket,*server_version,*host_info;char *info, *db;struct charset_info_st *charset;MYSQL_FIELD	*fields;MEM_ROOT field_alloc;my_ulonglong affected_rows;my_ulonglong insert_id;		/* id if insert on table with NEXTNR */my_ulonglong extra_info;		/* Not used */unsigned long thread_id;		/* Id for connection in server */unsigned long packet_length;unsigned int port;unsigned long client_flag,server_capabilities;unsigned int protocol_version;unsigned int field_count;unsigned int server_status;unsigned int server_language;unsigned int warning_count;struct st_mysql_options options;enum mysql_status status;my_bool	free_me;		/* If free in mysql_close */my_bool	reconnect;		/* set to 1 if automatic reconnect *//* session-wide random string */char scramble[SCRAMBLE_LENGTH+1];my_bool unused1;void *unused2, *unused3, *unused4, *unused5;LIST *stmts;                     /* list of all statements */const struct st_mysql_methods *methods;void *thd;/*Points to boolean flag in MYSQL_RES  or MYSQL_STMT. We set this flagfrom mysql_stmt_close if close had to cancel result set of this object.*/my_bool *unbuffered_fetch_owner;/* needed for embedded server - no net buffer to store the 'info' */char *info_buffer;void *extension;
} MYSQL;

说明一下:

  • MYSQL对象中的methods变量是一个结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。

连接数据库

创建完MySQL对象后就可以连接数据库了,连接数据库的函数如下:

MYSQL* mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned long clientflag);

参数说明:

  • mysql: 表示在连接数据库前,调用mysql_init函数创建的MySQL对象。
  • host: 表示需要连接的MySQL服务器的IP地址,"127.0.0.1"表示连接本地MySQL服务器。
  • user: 表示连接MySQL服务器时,所使用用户的用户名。
  • passwd: 表示连接MySQL服务器时,所使用用户的密码
  • db: 表示连接MySQL服务器后,需要使用的数据库。
  • port: 表示连接的MySQL服务器,所对应的端口号。
  • unix_socket: 表示连接时应该使用的套接字或命名管道,通常设置为NULL。
  • clientflag: 可以设置为多个标志位的组合,表示允许特定的功能,通常设置为0。

返回值说明:

  • 如果连接数据库成功,则返回一个MySQL对象,该对象与第一个参数的值相同。
  • 如果连接数据库失败,则返回NULL。

关闭数据库连接

与数据库交互完毕后,需要关闭数据库连接,关闭数据库连接的函数如下:

void mysql_close(MYSQL *sock);

说明一下:

  • 该函数的参数,就是连接数据库前调用mysql_init创建的MySQL对象。
  • 如果传入的MySQL对象是mysql_init自动创建的,那么调用mysql_close时就会释放这个对象。

连接示例

比如使用如下代码连接我的MySQL服务器:

#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;const string host = "49.232.66.206";
const string user = "dragon";
const string passwd = "3524nwe@ytkrSJTEW";
const string db = "connect_demon";
const int port = 3306;int main()
{//1、创建MySQL对象MYSQL* ms = mysql_init(nullptr);//2、连接数据库if(mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){cerr<<"数据库连接失败!"<<endl;return 1;}cout<<"数据库连接成功!"<<endl;//3、关闭数据库mysql_close(ms);cout<<"数据库关闭成功!"<<endl;return 0;
}

使用make命令生成可执行程序,运行后即可看到连接数据库成功、关闭数据库成功。如下:

在这里插入图片描述

下发SQL请求

下发SQL请求

与数据库建立连接期间,就可以向MySQL服务器下发SQL请求,下发SQL请求的函数如下:

int	mysql_query(MYSQL *mysql, const char *q);

参数说明:

  • mysql: 表示在连接数据库前,调用mysql_init函数创建的MySQL对象。
  • q: 表示向MySQL服务器下发的SQL请求,SQL最后可以不带分号。

返回值说明:

  • 返回值为0表示SQL执行成功,否则表示SQL执行失败。

设置编码格式

在连接数据库之后,需要统一客户端和服务器的编码格式,避免在数据交互过程中出现乱码,设置编码格式的函数如下:

int mysql_set_character_set(MYSQL *mysql, const char *csname);

参数说明:

  • mysql: 表示在连接数据库前,调用mysql_init函数创建的MySQL对象。
  • csname: 表示要设置的编码格式,如"utf8"

返回值说明:

  • 返回值为0表示设置成功,否则表示设置失败。

测试表介绍

下面在与MySQL数据库交互时,访问的都是connect_demon数据库,该数据库下有一个user表,表中有三条记录。如下:

在这里插入图片描述

向数据库中插入数据

在调用mysql_query函数时,向MySQL服务器下发一条insert SQL。如下:

#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;const string host = "49.232.66.206";
const string user = "dragon";
const string passwd = "3524nwe@ytkrSJTEW";
const string db = "connect_demon";
const int port = 3306;int main()
{//1、创建MySQL对象MYSQL* ms = mysql_init(nullptr);//2、连接数据库if(mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){cerr<<"数据库连接失败!"<<endl;return 1;}cout<<"数据库连接成功!"<<endl;mysql_set_character_set(ms, "utf8"); //设置编码格式为utf8//3、向数据库表中插入记录std:string sql = "insert into user values (4,'赵六',25)";if(mysql_query(ms, sql.c_str()) != 0){cout<<"插入数据失败!"<<endl;return 2;}cout<<"插入数据成功!"<<endl;//4、关闭数据库mysql_close(ms);cout<<"数据库关闭成功!"<<endl;return 0;
}

使用make命令生成可执行程序,运行后在MySQL中即可看到对应数据被成功插入。如下:

在这里插入图片描述

删除数据库中的数据

在调用mysql_query函数时,向MySQL服务器下发一条delete SQL。如下:

#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;const string host = "49.232.66.206";
const string user = "dragon";
const string passwd = "3524nwe@ytkrSJTEW";
const string db = "connect_demon";
const int port = 3306;int main()
{//1、创建MySQL对象MYSQL* ms = mysql_init(nullptr);//2、连接数据库if(mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){cerr<<"数据库连接失败!"<<endl;return 1;}cout<<"数据库连接成功!"<<endl;mysql_set_character_set(ms, "utf8"); //设置编码格式为utf8//3、删除数据库表中的记录std:string sql = "delete from user where id=4";if(mysql_query(ms, sql.c_str()) != 0){cout<<"删除数据失败!"<<endl;return 2;}cout<<"删除数据成功!"<<endl;//4、关闭数据库mysql_close(ms);cout<<"数据库关闭成功!"<<endl;return 0;
}

使用make命令生成可执行程序,运行后在MySQL中即可看到对应数据被成功删除。如下:

在这里插入图片描述

修改数据库中的数据

在调用mysql_query函数时,向MySQL服务器下发一条update SQL。如下:

#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;const string host = "49.232.66.206";
const string user = "dragon";
const string passwd = "3524nwe@ytkrSJTEW";
const string db = "connect_demon";
const int port = 3306;int main()
{//1、创建MySQL对象MYSQL* ms = mysql_init(nullptr);//2、连接数据库if(mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){cerr<<"数据库连接失败!"<<endl;return 1;}cout<<"数据库连接成功!"<<endl;mysql_set_character_set(ms, "utf8"); //设置编码格式为utf8//3、修改数据库表中的记录std:string sql = "update user set age=22 where id=1";if(mysql_query(ms, sql.c_str()) != 0){cout<<"修改数据失败!"<<endl;return 2;}cout<<"修改数据成功!"<<endl;//4、关闭数据库mysql_close(ms);cout<<"数据库关闭成功!"<<endl;return 0;
}

使用make命令生成可执行程序,运行后在MySQL中即可看到对应数据被成功修改。如下:

在这里插入图片描述

获取查询结果

获取查询结果

  • 对数据库中的数据进行增删改操作时,都只需要调用mysql_query向服务器下发对应的SQL请求。
  • 而对数据库中的数据进行查询操作时,除了需要调用mysql_query向服务器下发对应的查询SQL,还需要获取查询结果。

获取查询结果的函数如下:

MYSQL_RES* mysql_store_result(MYSQL *mysql);

说明一下:

  • 该函数会调用指定MySQL对象中对应的函数指针来获取查询结果,并将获取到的查询结果保存到MYSQL_RES变量中进行返回。
  • 需要注意的是,MYSQL_RES变量的内存空间是malloc出来的,因此在使用完后需要调用free函数进行释放,否则会造成内存泄露。

MYSQL_RES变量中保存了查询得到的各种信息,其类型定义如下:

typedef struct st_mysql_res {my_ulonglong  row_count;MYSQL_FIELD	*fields;MYSQL_DATA	*data;MYSQL_ROWS	*data_cursor;unsigned long *lengths;		/* column lengths of current row */MYSQL		*handle;		/* for unbuffered reads */const struct st_mysql_methods *methods;MYSQL_ROW	row;			/* If unbuffered read */MYSQL_ROW	current_row;		/* buffer to current row */MEM_ROOT	field_alloc;unsigned int	field_count, current_field;my_bool	eof;			/* Used by mysql_fetch_row *//* mysql_stmt_close() had to cancel this result */my_bool       unbuffered_fetch_cancelled;void *extension;
} MYSQL_RES;

获取查询结果的行数

获取查询结果的行数的函数如下:

my_ulonglong mysql_num_rows(MYSQL_RES *res);

说明一下:

  • 该函数将会从指定的MYSQL_RES对象中,获取查询结果的行数。

获取查询结果的列数

获取查询结果的列数的函数如下:

unsigned int mysql_num_fields(MYSQL_RES *res);

说明一下:

  • 该函数将会从指定的MYSQL_RES对象中,获取查询结果的列数。

获取查询结果的列属性

获取查询结果的列属性的函数如下:

MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES *res);

说明一下:

  • 该函数将会从指定的MYSQL_RES对象中,获取查询结果的列属性。

mysql_fetch_fields函数将会返回多个MYSQL_FIELD对象,每个MYSQL_FIELD对象中保存着对应列的各种列属性,其类型定义如下:

typedef struct st_mysql_field {char *name;                 /* Name of column */char *org_name;             /* Original column name, if an alias */char *table;                /* Table of column if column was a field */char *org_table;            /* Org table name, if table was an alias */char *db;                   /* Database for table */char *catalog;	      /* Catalog for table */char *def;                  /* Default value (set by mysql_list_fields) */unsigned long length;       /* Width of column (create length) */unsigned long max_length;   /* Max width for selected set */unsigned int name_length;unsigned int org_name_length;unsigned int table_length;unsigned int org_table_length;unsigned int db_length;unsigned int catalog_length;unsigned int def_length;unsigned int flags;         /* Div flags */unsigned int decimals;      /* Number of decimals in field */unsigned int charsetnr;     /* Character set */enum enum_field_types type; /* Type of field. See mysql_com.h for types */void *extension;
} MYSQL_FIELD;

获取查询结果中的一行数据

获取查询结果中的一行数据的函数如下:

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

说明一下:

  • 该函数将会从指定的MYSQL_RES对象中,获取查询结果中的一行数据。

MYSQL_ROW对象中保存着一行数据,这一行数据中可能包含多个字符串,对应就是这行数据中的多个列信息,因此MYSQL_ROW本质就是char**类型,其类型定义如下:

typedef char **MYSQL_ROW;		/* return data as array of strings */

查询示例

比如查询user表中的数据并进行打印输出。如下:

#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;const string host = "49.232.66.206";
const string user = "dragon";
const string passwd = "3524nwe@ytkrSJTEW";
const string db = "connect_demon";
const int port = 3306;int main()
{//1、获取MySQL实例(相当于给我们创建了一个MySQL句柄)MYSQL* ms = mysql_init(nullptr);//2、连接数据库if(mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){cerr<<"数据库连接失败!"<<endl;return 1;}cout<<"数据库连接成功!"<<endl;mysql_set_character_set(ms, "utf8"); //设置编码格式为utf8//3、查询数据库表中的记录//a、执行查询语句std:string sql = "select * from user";if(mysql_query(ms, sql.c_str()) != 0){cout<<"查询数据失败!"<<endl;return 2;}cout<<"查询数据成功!"<<endl;//b、获取查询结果MYSQL_RES* res = mysql_store_result(ms);int rows = mysql_num_rows(res); //数据的行数int cols = mysql_num_fields(res); //数据的列数//获取每列的属性并打印列名MYSQL_FIELD* fields = mysql_fetch_fields(res);for(int i = 0;i < cols;i++){cout<<fields[i].name<<"\t";}cout<<endl;for(int i = 0;i < rows;i++){//获取一行数据并进行打印MYSQL_ROW row = mysql_fetch_row(res);for(int j = 0;j < cols;j++){cout<<row[j]<<"\t";}cout<<endl;}free(res); //释放内存空间//4、关闭数据库mysql_close(ms);cout<<"数据库关闭成功!"<<endl;return 0;
}

使用make命令生成可执行程序,运行后在即可看到数据的查询结果。如下:

在这里插入图片描述

相关文章:

MySQL使用C语言连接

文章目录MySQL使用C语言连接引入库下载库文件在项目中使用库使用库连接数据库下发SQL请求获取查询结果MySQL使用C语言连接 引入库 要使用C语言连接MySQL&#xff0c;需要使用MySQL官网提供的库。 下载库文件 下载库文件 首先&#xff0c;进入MySQL官网&#xff0c;选择DEVEL…...

JavaScript随手笔记---比较两个数组差异

&#x1f48c; 所属专栏&#xff1a;【JavaScript随手笔记】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…...

【C++修炼之路】21.红黑树封装map和set

每一个不曾起舞的日子都是对生命的辜负 红黑树封装map和set前言一.改良红黑树的数据域结构1.1 改良后的结点1.2 改良后的类二. 封装的set和map2.1 set.h2.2 map.h三. 迭代器3.1 迭代器封装3.2 const迭代器四.完整代码实现4.1 RBTree.h4.2 set.h4.3 map.h4.4 Test.cpp前言 上一节…...

下载ojdbc14.jar的10.2.0.1.0版本的包

一、首先要有ojdbc14.jar包 没有的可以去下载一个&#xff0c;我的是从这里下载的ojdbc14.jar下载_ojdbc14.jar最新版下载[驱动包软件]-下载之家&#xff0c; 就是无奈关注了一个公众号&#xff0c;有的就不用下了。 二、找到maven的本地仓库的地址 我的地址在这里D:\apach…...

关于欧拉角你需要知道几个点

基础理解&#xff0c;参照&#xff1a;https://www.cnblogs.com/Estranged-Tech/p/16903025.html 欧拉角、万向节死锁&#xff08;锁死&#xff09;理解 一、欧拉角理解 举例讲解 欧拉角用三次独立的绕确定的轴旋转角度来表示姿态。如下图所示 经过三次旋转&#xff0c;旋…...

git ssh配置

ssh配置 执行以下命令进行配置 git config --global user.name “这里换上你的用户名” git config --global user.email “这里换上你的邮箱” 执行以下命令生成秘钥&#xff1a; ssh-keygen -t rsa -C “这里换上你的邮箱” 执行命令后需要进行3次或4次确认。直接全部回车就…...

Linux进程概念(三)

环境变量与进程地址空间环境变量什么是环境变量常见环境变量环境变量相关命令环境变量的全局属性PWDmain函数的三个参数进程地址空间什么是进程地址空间进程地址空间&#xff0c;页表&#xff0c;内存的关系为什么存在进程地址空间环境变量 什么是环境变量 我们所有写的程序都…...

新手福利——x64逆向基础

一、x64程序的内存和通用寄存器 随着游戏行业的发展&#xff0c;x32位的程序已经很难满足一些新兴游戏的需求了&#xff0c;因为32位内存的最大值为0xFFFFFFFF&#xff0c;这个值看似足够&#xff0c;但是当游戏对资源需求非常大&#xff0c;那么真正可以分配的内存就显得捉襟…...

虚幻c++中的细节之枚举类型(enum)

文章目录前言一、原生c的枚举类型关键字classint8 - 枚举的基础类型&#xff08;underlying type&#xff09;二、枚举类型的灵活运用位运算枚举循环遍历三、虚幻风格的枚举类型UENUMUMETATEnumAsByte总结前言 虚幻引擎中的代码部分实现了一套反射机制&#xff0c;为c代码带了…...

判断某个字符串在另一个字符串中的个数

/** * 用于判断字符串中字符的个数 * * param str1 原字符串 * param str2 需要判断的字符 * return 返回有几个 */ private int getCount(String str1, String str2) { //获取两个字符串的长度 int oneLength str1.length(); int toLength str2.length(); //定义两个整数&am…...

测试人员如何运用好OKR

在软件测试工作中是不是还不知道OKR是什么?又或者每次都很害怕写OKR?或者总觉得很迷茫&#xff0c;不知道目标是什么? OKR 与 KPI 的区别 去年公司从KPI换OKR之后&#xff0c;我也有一段抓瞎的过程&#xff0c;然后自己找了两本书看&#xff0c;一本是《OKR工作法》&#xf…...

CentOS7 Hive2.3.9 安装部署(mysql 8.0)

一、CentOS7安装MySQL数据库 查询载mariadb rpm -qa | grep mariadb卸载mariadb rpm -e --nodeps [查询出来的内容]安装wget为下载mysql准备 yum -y install wget在tools目录下执行以下命令&#xff0c;下载MySQL的repo源&#xff1a; wget -P /tools/ https://dev.mysql.…...

【PTA Advanced】1142 Maximal Clique(C++)

目录 题目 Input Specification: Output Specification: Sample Input: Sample Output: 思路 代码 题目 A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the clique are adjacent. A maximal clique is a clique …...

1. MySQL在金融互联网行业的企业级安装部署

这里写目录标题 1. 版本介绍示例2.安装MySQL规范(建议二进制)2.1 安装方式2.2 安装用户2.3 目录规范3.二进制安装3.1 操作系统配置3.2 MySQL 5.7.33 安装部署2.3 MySQL8.0.27安装2.4 源码安装(了解 )3.多实例部署及注意事项3.1 多实例概念3.2 多实例安装3.3 多实例第二种方式…...

【C++修炼之路】19.AVL树

每一个不曾起舞的日子都是对生命的辜负 AVL树前言&#xff1a;一.AVL树的概念二.AVL树的结构2.1 AVL树节点的定义2.2 AVL树的结构2.3 AVL树的插入2.4 AVL树的验证2.5 AVL树的删除(了解)三.AVL树的旋转&#xff08;重要&#xff09;3.1 左单旋3.2 右单旋3.3 左右双旋3.4 右左双旋…...

项目管理工具dhtmlxGantt甘特图入门教程(十):服务器端数据集成(下)

这篇文章给大家讲解如何利用dhtmlxGantt在服务器端集成数据。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足应用程序的所有需求&#xff0c;是完善的甘特图图表库 DhtmlxGantt正版试用下载&#xff08;qun 764149912&#xff09;http…...

LeetCode 793. 阶乘函数后 K 个零

f(x) 是 x! 末尾是 0 的数量。回想一下 x! 1 * 2 * 3 * ... * x&#xff0c;且 0! 1 。 例如&#xff0c; f(3) 0 &#xff0c;因为 3! 6 的末尾没有 0 &#xff1b;而 f(11) 2 &#xff0c;因为 11! 39916800 末端有 2 个 0 。 给定 k&#xff0c;找出返回能满足 f(x) …...

maven打包顺序与jvm类加载顺序

背景&#xff1a;一次dev测试过程中&#xff0c;发现代码中关于jsr303的校验失效&#xff0c;校验类如下&#xff0c;会报一个莫名其妙的运行时错误&#xff1b;遂进行排查。import javax.validation.constraints.NotBlank;Data Accessors(chain true) public class Demo {Not…...

④ 链表

24. 两两交换链表中的节点 题目链接&#xff1a;https://leetcode.cn/problems/swap-nodes-in-pairs/ 注意点&#xff1a; 遍历链表的时候什么时候截止&#xff08;避免空指针异常或无限死循环的问题&#xff09;&#xff1f; 节点数量为偶数或链表为空时&#xff0c;cur.ne…...

小孩扁桃体肿大3度能自愈吗?6岁小孩扁桃体肥大怎么治效果好?

12月7日&#xff0c;四川眉山市民唐先生说&#xff0c;他刚出生的儿子在妇产医院分娩中心住了20天后感染了败血症。据唐先生介绍&#xff0c;哈子出院时各项指标正常。他在分娩中心住了半个月左右&#xff0c;孩子喝牛奶很生气&#xff0c;第二天就开始发烧了。同一天&#xff…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...