初识mysql数据库之引入mysql客户端库
目录
一、下载第三方库
1. 准备工作
1. 使用mysql官网提供的库
2. yum源安装
二、测试第三方库是否可用
三、mysql常用接口介绍
1. 查看官方文档
2. 初始化
3. 关闭mysql
4. 连接mysql
5. 下达sql指令
四、一个简单的C++客户端库连接mysql程序
1. 头文件
2. 初始化与退出
3. 连接mysql
4. 下达sql指令
5. 测试
5.1 退出
5.2 插入数据
5.3 修改程序
5.4 更新数据
5.5 删除数据
5.6 查询数据
5.7 当前插入存在的问题
6. 获取select后的数据
6.1 提取数据
6.2 理解MYSQL_RES结构
6.3 提取表的行和列
6.4 获取表数据
6.5 获取列名
7. 释放空间
8. 事务支持
9. 程序代码
一、下载第三方库
在以前的文章中,我们使用的都是命令行式的mysql客户端。但是还有其他形式的客户端的,比如图形化界面、网页版等等。当然, 也包括语言级别的库或包能帮我们去直接访问数据库。
因此,在这里就为大家介绍一下如何使用语言级别的库来访问mysql。在这之前,可以先在mysql中创建一个用户,方便后续的测试。
1. 准备工作
创建如下一个用户:
然后在root用户下再创建如下一个数据库,并将这个数据库的所有权限交给该用户:
在后续的所有关于mysql的测试,都是使用的这个数据库。
然后再在这个数据库中建立一个如下的user表:
1. 使用mysql官网提供的库
要使用语言级别的库,这里提供两种方法。第一种方法就是直接到mysql官网上下载对应的库。
首先,搜索“mysql.com”,打开mysql的官网:
大家打开后的界面可能会这里的不太一样,因为mysql的官网样式可能会变化。
进入官网后,选择“DOWNLOADS”,在里面可以看到如下内容:
点击进去后,就可以看到如下界面:
里面可以选择下载你需要的各种类型的库。其中就包括封装好的语言级别的库。因为使用的语言是C++,大家可能就会想下载C++语言级别的库。但在这里比较推荐使用 C API库,因为这个库最简单。
点击后就会出现如上界面。在图中圈出来的部分显示,mysql官网推荐下载的版本。直接点击下载即可。
点击后就可以看到如下内容:
在这里,选择你要将这个库安装在哪个平台下,然后选择对应的版本即可。因为我们使用的是linux64位系统,所以选择对应版本即可:
选择好后下载即可。
当你下载好后,它就是一个压缩包,将它通过“rz”命令放到你的linux机器下,然后解压安装即可。但是在这里, 不太推荐这种方法。因为大家在安装的过程中可能会出现一些问题。
2. yum源安装
如果大家看过我之前的文章“mysql数据库安装”的话,里面就介绍了如何安装mysql的yum源,这里不再赘述。如果大家是使用的yum源安装,那么在大家安装好mysql时,其实就已经把mysql的安装包下载好了。
大家可以输入“ls /lib64/mysql/”查看linux中是否有如下内容:
然后在输入“ls /usr/include/mysql”命令,查看是否存在该头文件。
如果这两个内容都存在,那么就说明此时你的linux下已经安装好了需要的东西。但如果没有,就输入“yum install -y mysql-devel”命令安装一下即可。
二、测试第三方库是否可用
当做好上面的准备工作后,,就可以打开vscode,在上文中创建的test_db目录下创建一个test.cpp文件。然后引入linux中的mysql库。
注意,这个mysql目录会在安装好mysql后自动被放到/usr/include/路径下。这个路径是已经配置好了的默认路径,不用我们写。但是mysql.h在mysql目录下,而mysql并没有被配置到默认路径,所以需要自己写剩下的路径。
头文件包好后,此时就可以使用“mysql_get_client_info()”函数了,该函数就是mysql.h中携带的,它的作用是获取当前使用的mysql的客户端版本。在这里,就用这个函数来测试一下是否这个头文件可用。
写出如下测试信息:
保存好后,就可以进行编译生成对应的文件了:
但是当编译后可以发现,此时会出现报错。报错的原因很简单,其实是因为在这里使用的库是一个第三方库,编译器并不知道这个库的位置,也就无法使用库中的内容。因此,在编译时,需要带上使用的第三方库的路径。
那这个路径在哪里呢?其实就在"/lib64/mysql/"下:
在这里,要使用的就是上图中圈出来的静态库。因此,在编译时带上库的路径和库名称:
如果大家不知道为什么这里要带-L和-l,以及为什么编译时的静态库名称少了lib和.a,可以到我以前的文章“动态库链接”中查看。这里不再赘述。
可以发现,当链接了库后,就可以编译成功了。执行该程序:
执行成功,这就说明此时已经能够使用第三方库的内容了。
如果大家在测试时发现还是无法运行,就可以输入“ldd 文件名”查看该可执行文件链接的库:
如果大家发现上图中圈出来的库的动态库链接对象为空,就说明这个库没有能够链接到指定的库上。此时大家可以把这个库后面指向的库添加到系统的配置文件或环境变量中。至于如何添加,这里不再多说,大家可以自行网上搜索。
三、mysql常用接口介绍
1. 查看官方文档
在介绍mysql的常用接口之前,大家可以先到mysql的官网“mysql.com”中选择下图中的内容:
点击后往下翻,里面全是mysql库的文档。找到C API库,点击5.7:
在进入的页面的左边点击下图内容:
里面存放的就是关于mysql的接口的介绍。
这里只截取了其中一部分。
大家可以将这个网页保存一下,当你需要查看某些函数的作用和怎么使用时,就可以查看这个文档。
2. 初始化
首先大家要知道,mysqld是一个网络服务,这就意味着在实际进行mysql操作之前,一定需要连接上mysql。而在连接mysql之前,还需要对mysql进行初始化。
要初始化化,就需要使用“mysql_init(MYSQL *mysql)”接口:
该接口会返回一个MYSQL结构体,里面包含了创建mysql需要的一些数据。如果初始化失败,它就会返回一个空指针。在使用时,该接口的参数直接填nullptr即可。
3. 关闭mysql
当不需要使用mysql后,就需要手动关闭。此时就需要调用“mysql_close()”接口:
它的参数就是mysql_init()的返回值。
4. 连接mysql
上文说了, mysqld是一个网络服务,所以要使用mysql,我们必须要先连接。当然,在连接之前还需要初始化,初始化的函数上文中已经介绍了。
要连接mysql,就需要使用"mysql_real_connect()"接口:
介绍一下里面的参数。
第一个参数mysql,就是mysql_init()接口的返回值;
第二个参数host,就是要连接的主机;
第三个参数user,就是要用哪个用户登录mysql;
第三个参数password,就是这个用户的密码;
第五个参数db,就是要使用的数据库;
第六个参数port,就是要连接的mysqld的端口号;第五个参数unix_socket是域间套接字,大家可以看成就是使用管道,但这里我们是要使用网络,所以不用管这个参数,填为nullptr即可;
最后一个参数client_flag是用户的一些选项,这里填为0即可。
5. 下达sql指令
要向mysqld下达sql指令,需要使用“mysql_query()”接口:
该接口的第一个参数就是mysql_init()的返回值;第二个参数就是我们要下达的sql指令。以字符串的方式传递给该接口。在这个字符串中的sql指令,可以带,也可以不带。
当这个接口执行成功后,它会返回0;失败则会返回非0的错误码。
四、一个简单的C++客户端库连接mysql程序
有了上面的几个接口,其实就已经可以初步的使用C++客户端库了。为了方便大家看到实际的使用过程,这里利用C++客户端库写一个简单的可以控制mysql内的数据库的程序。
1. 头文件
首先,准备如下头文件:
里面的内容大家应该都很清楚,不再多说。
2. 初始化与退出
调用mysql_init()接口初始化,获得一个MYSQL结构体指针:
然后再将退出mysql写好:
3. 连接mysql
调用mysql_real_connect()接口,连接mysql:
有了上面的内容,其实我们就已经可以开始对特定的数据库做操作了。在这之前,先编译生成可执行文件,看看该程序是否可以正常连接:
可以正常运行,此时就可以着手操作数据库了。
4. 下达sql指令
为了方便测试,在这里就采取从简单读取sql指令的方式:
5. 测试
准备好如上代码后,我们就可以开始测试了,测试用的数据库和表在上文中已经说过了,这里就不再多说。
首先,为了能看到数据库中表的数据的变化,我们先用该程序中的用户登录mysql:
登录成功后,进入conn库,然后查看user表的数据:
可以看到,此时user表内没有任何数据。然后启动写好的程序:
5.1 退出
首先来测试一下能否退出:
退出没有问题,进行下一个测试。
5.2 插入数据
重新启动程序,然后输入insert语句:
此时就提示该指令执行成功。那到底是不是真的成功了呢?查看一下user表的数据:
可以看到,user表中确实多出了刚刚在mytest程序中要插入的数据。注意,在上面的mysql语句中,是带了“;”的,其实在mysql_query()接口中,也是可以不带“;”的。再插入一个数据:
这条sql语句中就没有带“;”。查看user表的数据:
依然插入成功了。
要知道,在linux中,我们使用mysql的时候,不就是使用的mysql的客户端进行操作么?因此,如果大家愿意,其实也可以使用C++客户端库自己写一个客户端来与mysqld交互。
5.3 修改程序
通过上面的测试其实就可以发现,我们是可以用C++客户端库自己写一份客户端的。但没有这个必要,毕竟有现成的何必自己去写呢?
同时大家可以发现,在linux下以命令行的方式去提交sql指令,有点麻烦。因此,修改一下程序,直接从程序中提供sql语句:
此时就可以直接在sql字符串内写好要执行的sql语句,然后重新编译执行即可。测试起来就比在命令行中写方便。
5.4 更新数据
修改好程序后,在sql字符串中写好update语句:
重新编译并执行。然后查看user表内的数据:
修改成功。
5.5 删除数据
再来测试一下delete语句:
重新编译并执行。查看user表内的数据:
删除成功。
5.6 查询数据
再来测试一下select语句:
重新编译并执行:
可以看到,执行成功了。然后呢?数据库的数据呢?在这个场景下,我们自己写的程序就是一个上层应用,该程序将指定的sql语句发送给数据库后,这些sql语句就被会看成事务。因此,在以前的文章中讲的事务执行失败、事务需要回滚等等操作,都由数据库自行处理,无需上层应用去考虑。
同时,在insert、delete、update这些sql语句中,都是对数据库做操作。因此,使用这些数据后,上层应用只需要知道这些sql语句是否执行成功,无需看到执行成功后的数据。但是select语句不一样,在上层应用中调用该语句,不就是想查看特定数据,然后用这些数据去执行一些特定的操作么。但是在这里,虽然执行select语句成功了,但是上层应用中依然仅仅知道执行成功,而无法看到查询结果。
因此, 在select语句之后,还需要调用其他接口来让我们看到查询出来的结果。
5.7 当前插入存在的问题
如果大家仔细观察了user表的数据,就会发现,在这个表中,插入的用户名字都是英文的。那如果插入中文呢?测试一下:
重新编译并执行:
程序执行成功,没有问题。我们再来看一下user表内的数据:
可以发现,虽然插入成功了,但是user表中本应存储“张三”这个名字的位置,却是乱码。这其实就是编码格式的问题。
在mysql数据库中已经配置过了,在该数据库下默认使用utf8的编码集。但是这仅仅是服务端下的编码格式。当前使用的客户端,即该程序下,它使用的编码集并不是utf8。而是默认的latin1。因此,在此时我们的客户端在发送数据时是将数据按Latin1的编码格式进行编码的;但是当mysqld服务端接收到数据后,确实以utf8的格式进行解码的。编码与解码使用的编码格式不同,也就导致了服务端中出现乱码。
由此,在客户端中,我们还需要设置编码格式。此时,就需要使用“msql_set_character_set()”接口:
第一个参数mysql,就是mysql_init()的返回值;第二个参数csname,就是要使用的编码集的名字。这个接口需要在连接成功,即调用mysql_real_connect()接口后使用。
重新执行一次insert语句:
重新编译并执行。查看user表的数据:
没有出现乱码。
此时大家可能有个疑问,在上面没有设置编码格式时,为什么在编码格式不同的情况下,中文会乱码,英文和数字却不会乱码呢?其实很简单,英文字母一共也就26个,个位数字也是只有10个。因为它们的数量很少,所以不同的编码集对这些内容的适配都很好。但中文不同,中文字符有上万个,常用的中文字符也有数千个,大量的字符就导致了不同的编码集可能采用不同的编码方式进行处理,也就可能出现乱码了。
6. 获取select后的数据
6.1 提取数据
在实际上,当用mysql_query()接口执行select语句后,它会将数据库中查询到的结果保存到该接口传入的参数MSYQL结构体中。在这个结构体中是有专门的缓冲区来保存这些数据的。
虽然这些数据是保存在MYSQL结构体提供的缓冲区内,但依然需要将这些数据从它的缓冲区中提取出来。
要从MYSQL中提取出数据,就需要使用“mysql_store_result()”接口:
这个接口的参数就是mysql_init()的返回值。成功时返回对应的结构体指针,失败则返回null。
我们可以在官网文档中查看关于该结构的说明:
根据文档说明可以知道,这个结构会将查询结果按行为单位放置在“结果集”,即该结构当中。
由此,就可以使用对应接口提取了:
当提取出来对应的数据后,如何显示呢?在了解如何显示之前,还需要了解一下MYSQL_RES是如何存储数据的。
6.2 理解MYSQL_RES结构
假设现在有如下一张表:
对于这张表,可以将其组成部分看做两个,分别是表结构和表数据。表结构就是列属性,表数据就是每列中的数据。而组成表的这些符号,在数据库中实际并未存储,而是在显示时打印出来供用户区分表内的各个部分的。
首先大家要知道,当数据库中查询出来的数据被转储到MYSQL_RES结构中时,它们必然已经是被放到了内存里,这也就说明,此时这些函数是有对应的地址的。
当上层应用调用select语句查询表时,它就是将表结构和表数据添加到MYSQL结构体内准备好的缓冲区中:
当调用mysql_store_result()接口时,就是将MYSQL结构体里面的缓冲区中保存的数据按行转储到MYSQL_RES结构当中:
那MYSQL_RES内如何保存这些数据呢?为了方便大家理解,这里用只以表数据来举例。MYSQL_RES可以将其看成两层数组。第一层数组里面保存的是char**的二级指针,每个二级指针指向一个数组,这个数组里面保存的是char*的一级指针。每个指针都指向对应行数据:
当然,实际的MYSQL_RES中还存有很多余这张表相关的其他数据。但是大家可以将其整体结构就理解为上图所示。
由此,如果我们想从MYSQL_RES内拿到数据,其实就可以按照数组的方式,从这个结构体的各个成员变量中以下标的形式拿取。
但是,我们怎么知道表数据一共有多少行和多少列呢?此时就可以调用C++客户端库内的其他相关函数了。
6.3 提取表的行和列
要提取表的行,可以使用“mysql_num_rows()”接口:
它的参数就是“mysql_store_result()”的返回值。
要提取表的列,可以使用“mysql_num_fields()”接口:
它的参数也是“mysql_store_result()”的返回值。
通过这两个接口,就可以分别获得查询出来的表的行和列了。那么这两个接口到底能不能正确获取呢?我们来测试一下:
传入如下select语句:
重新编译并运行:
打印的结果和我们的预期一样,没有问题。
6.4 获取表数据
要获取表数据,还需要了解一个接口,即“mysql_fetch_row()”接口:
这个接口的参数就是mysql_store_result()接口的返回值。当它调用成功时,它会返回一个MYSQL_ROW变量。
对于这个接口,大家可以将其看做一个迭代器,当第一次调用这个接口时,它会指向MYSQL_RES结构中的第一行的数据的起点。让我们可以通过指针的形式访问数据。当再次调用的时候,它会自动跳到第二行数据的起点。
转到这个类型的定义上去看看:
可以看到,在源码中,它就是一个char**。
通过这个接口,我们就能以下标的形式获取表数据。
注意,mysql中的所有数据,在上层应用读取出来时全部都是被看做字符串。
有了上面的认识,就可以在程序中添加如下代码了:
然后选择查询表内的所有数据:
重新编译并执行:
成功拿取到了表数据。由此,我们就可以拿到我们对应的表数据了。未来大家想拿着这份数据去做什么,就由大家自己决定。
6.5 获取列名
现在我们已经可以获取表数据了。那如果还想获取列名呢?此时就需要使用“mysql_fetch_fields()”接口了:
这个接口可以一次性获取所有列的列名。它的参数就是mysql_store_result()的返回值。当调用成功时,它返回一个MYSQL_FIELD结构体,里面就保存了列的各项属性:
例如列名、列的原生名(给列取别名的情况)、属于哪个表、属于哪个原生表、属于哪个数据库、列的类型等等属性。
此时就可以解答大家的一个问题了。上文中说了,查询到的表数据在上层应用中是以字符串的形式保存的。但是我们在使用的时候不一定是用字符串形式使用啊。例如age就是int类型的。那我们在上层使用这些数据时,如何将它们从字符串转化为原来的类型呢?其实就是通过这个接口拿到列属性,然后通过MSYQL_FIELD结构体中的type变量里面保存的类型,来将其重新转化回去。
由此,就可以在程序中添加如下代码,来获取列了:
重新编译并执行:
此时就成功的将列名获取了。当然,大家也可以尝试下获取其他列属性,这里就不再测试了。
7. 释放空间
在上文中我们知道了,当我们查询数据时,查询结果其实已经被保存在内存中了。而这些数据其实就是被保存在用new这类申请内存空间的接口申请的内存中。而我们知道,在C++中,用new这类接口申请的空间是需要用户自行释放的。这里也是如此。
但是和以前不同,在这里我们最好不要用free()、delete这类释放空间的接口,而是使用C++客户端库为我们提供的接口,即“mysql_free_result()”接口:
这个接口就会释放掉调用mysql_store_result()接口后开辟的内存空间。
8. 事务支持
在C++客户端库中也是支持事务的。可以选择一次性将一批sql语句传给数据库。可以采用如下接口:
这里就不再演示了,大家可以自行尝试使用一下。
9. 程序代码
在上文中所有的接口整合起来,就可以写出如下的程序:
#include <iostream>
#include <string>
#include <mysql/mysql.h>// const std::string host = "127.0.0.1";
const std::string host = "localhost";//当使用本地登录时,本地换回和localhost都是可行的
const std::string user = "connector";
const std::string password = "123456";
const std::string db = "conn";
const unsigned int port = 3306;int main()
{//1. 初始化MYSQL *ms = mysql_init(nullptr);if(ms == nullptr){std::cerr << "init MYSQL error" << std::endl;return 1;}//2. 连接mysqlif(mysql_real_connect(ms, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr){std::cerr << "connect MYSQL error" << std::endl;return 2;}mysql_set_character_set(ms, "utf8");//设置编码格式//3. 执行各类sql语句// std::string sql = "update user set name='jimmy' where id=2";// std::string sql = "delete from user where id=2";std::string sql = "select * from user";// std::string sql = "insert into user (name, age, telphone) values ('张三', 10, '3456')";// std::string sql = "insert into user (name, age, telphone) values ('李四', 13, '4567')";// std::string sql = "select * from user where id=1";int n = mysql_query(ms, sql.c_str());if(n == 0)std::cout << "success" << std::endl;else{std::cerr << "failed: " << n << std::endl;return 3;}// std::string sql;//接收sql指令// while(true)// {// std::cout << "MYSQL>> ";// if(!std::getline(std::cin, sql) || sql == "quit")//从键盘读取sql指令// {// std::cout << "bye bye" << std::endl;// break;// }// int n = mysql_query(ms, sql.c_str());// if(n == 0)// std::cout << sql << " success " << n << std::endl;// else// std::cerr << sql << " error " << n << std::endl;// }// std::cout << "connect MYSQL success" << std::endl;//4. 查询结果转储MYSQL_RES *res = mysql_store_result(ms);if(res == nullptr){std::cerr << "mysql_store_result failed" << std::endl;return 4;;}//5. 获取表的行和列my_ulonglong rows = mysql_num_rows(res);my_ulonglong fields = mysql_num_fields(res);// std::cout << "行: " << rows << " 列: " << fields << std::endl;//6. 获取列属性MYSQL_FIELD *field_array = mysql_fetch_fields(res);for(int i = 0; i < fields; ++i)std::cout << field_array[i].name << "\t";std::cout << std::endl;//7. 获取表数据for(int i = 0;i < rows; ++i)//先遍历行{MYSQL_ROW row = mysql_fetch_row(res);for(int j = 0; j < fields; ++j)std::cout << row[j] << "\t";std::cout << std::endl;}//8. 释放空间并关闭mysqlmysql_free_result(res);mysql_close(ms);return 0;
}
里面的各个部分所使用的接口和出现的结果在上文中已经演示了,这里不再赘述。
相关文章:
初识mysql数据库之引入mysql客户端库
目录 一、下载第三方库 1. 准备工作 1. 使用mysql官网提供的库 2. yum源安装 二、测试第三方库是否可用 三、mysql常用接口介绍 1. 查看官方文档 2. 初始化 3. 关闭mysql 4. 连接mysql 5. 下达sql指令 四、一个简单的C客户端库连接mysql程序 1. 头文件 2. 初始化…...
勘探开发人工智能技术:机器学习(1)
0 提纲 2.1 什么是机器学习 2.2 不确定性 2.3 数据类型 2.4 分类、回归、聚类 2.5 分类问题的训练与测试 2.6 性能评价指标 1 什么是机器学习 对于西瓜这个抽象类来说,它具有“色泽”,“根蒂”,“敲声”三个属性: 通过观察这个…...
MySQL查看当前数据库视图-SQL语句
引言 查询语句为: show full tables where table_type 可查询当前数据库表 一,创建一个视图 # 创建视图 create view v_stu as # 视图内容(连接的一个表) select name from t_stu union all select tname from t_teach; 二&…...
Clickhouse 存储引擎
一、常用存储引擎分类 1.1 ReplacingMergeTree 这个引擎是在 MergeTree 的基础上,添加了”处理重复数据”的功能,该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。 特点: 1使用ORDERBY排序键作为判断重复的唯一键 2.数据的去重只会在合并…...
基于golang多消息队列中间件的封装nsq,rabbitmq,kafka
基于golang多消息队列中间件的封装nsq,rabbitmq,kafka 场景 在创建个人的公共方法库中有这样一个需求,就是不同的项目会用到不同的消息队列中间件,我的思路把所有的消息队列中间件进行封装一个消息队列接口(MQer)有两个方法一个…...
【第一阶段】kotlin的函数
函数头 fun main() {getMethod("zhangsan",22) }//kotlin语言默认是public,kotlin更规范,先有输入( getMethod(name:String,age:Int))再有输出(Int[返回值]) private fun getMethod(name:String,age:Int): Int{println("我叫…...
PAM安全配置-用户密码锁定策略
PAM是一个用于实现身份验证的模块化系统,可以在操作系统中的不同服务和应用程序中使用。 pam_faillock模块 pam_faillock模块用来实现账号锁定功能,它可以在一定的认证失败次数后锁定用户账号,防止暴力破解密码攻击。 常见选项 deny&…...
AndroidManifest.xml日常笔记
1 Bundle介绍 Bundle主要用于传递数据;它保存的数据,是以key-value(键值对)的形式存在的。 我们经常使用Bundle在Activity之间传递数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组…...
SpringBoot异步框架
参考:解剖SpringBoot异步线程池框架_哔哩哔哩_bilibili 1、 为什么要用异步框架,它解决什么问题? 在SpringBoot的日常开发中,一般都是同步调用的。但经常有特殊业务需要做异步来处理,例如:注册新用户&…...
导出LLaMA ChatGlm2等LLM模型为onnx
通过onnx模型可以在支持onnx推理的推理引擎上进行推理,从而可以将LLM部署在更加广泛的平台上面。此外还可以具有避免pytorch依赖,获得更好的性能等优势。 这篇博客(大模型LLaMa及周边项目(二) - 知乎)进行…...
C++项目:在线五子棋对战网页版--匹配对战模块开发
玩家匹配是根据自己的天梯分数进行匹配的,而服务器中将玩家天梯分数分为三个档次: 1. 普通:天梯分数小于2000分 2. 高手:天梯分数介于2000~3000分之间 3. 大神:天梯分数大于3000分 当玩家进行对战匹配时,服…...
ssh 连接断开,正在执行的shell脚本也被中断了
背景 最近在训练chatGLM,一次训练经常要花掉近2个小时,但是由于网络不稳定,经常ssh莫名的断开,导致训练不得不重新开启,这就很浪费时间了 解决方案 下面教大家一种在后台执行命令的方案,即使你ssh连接断…...
UML 用例图,类图,时序图,活动图
UML之用例图,类图,时序图,活动图_用例图 时序图_siyan985的博客-CSDN博客 https://www.cnblogs.com/GumpYan/p/14734357.html 用例图与类图 - 简书...
Java 面试题2023
Java core JVM 1、JVM内存模型 2、JVM运行时内存分配 3、如何确定当前对象是个垃圾 4、GCrooot 包括哪些? 5、JVM对象头包含哪些部分 6、GC算法有哪些 7、JVM中类的加载机制 8、分代收集算法 9、JDK1.8 和 1.7做了哪些优化 10、内存泄漏和内存溢出有什么区别 11、J…...
【CSS3】CSS3 动画 ④ ( 使用动画制作地图热点图 )
文章目录 一、需求说明二、动画代码分析1、地图背景设置2、热点动画位置测量3、热点动画布局分析4、动画定义5、小圆点实现6、波纹效果盒子实现7、延迟动画设置 三、代码示例 一、需求说明 实现如下效果 , 在一张地图上 , 以某个位置为中心点 , 向四周发散 ; 核心 是实现 向四周…...
命令模式(Command)
命令模式是一种行为设计模式,可将一个请求封装为一个对象,用不同的请求将方法参数化,从而实现延迟请求执行或将其放入队列中或记录请求日志,以及支持可撤销操作。其别名为动作(Action)模式或事务(Transaction)模式。 Command is …...
Dapper 微型orm的光
介绍 Dapper是一个轻量级的ORM(对象关系映射)框架,它可以方便地将数据库查询结果映射到.NET对象上,同时也支持执行原生SQL查询。下面我将详细介绍Dapper的使用方法。 安装Dapper 首先,你需要通过NuGet包管理器将Dap…...
Mysql随心记--第一篇
MylSAM:查询速度快,有较好的索引优化和数据压缩技术,但是它不支持事务 InnoDB:它支持事务,并且提供行级的锁定,应用也相当广泛 docker ps -a --filter "ancestormysql" 查看linux中创建了多少个d…...
使用dockerfile安装各种服务组件
使用dockerfile安装各种服务组件 elasticsearch、minio、mongodb、nacos、redis 一、使用dockerfile安装elasticsearch:7.8.0 1、Dockerfile文件 FROM elasticsearch:7.8.0 #添加分词器 ADD elasticsearch-analysis-ik /usr/share/elasticsearch/plugins/elasticsearch-anal…...
如何简单的无人直播
环境搭建 ffmpeg安装,我这里用的是centos搭建的,其他平台可以自己百度 yum -y install wgetwget --no-check-certificate https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.0.3-64bit-static.tar.xztar -xJf ffmpeg-4.0.3-64bit-static.ta…...
【基于HBase和ElasticSearch构建大数据实时检索项目】
基于HBase和ElasticSearch构建大数据实时检索项目 一、项目说明二、环境搭建三、编写程序四、测试流程 一、项目说明 利用HBase存储海量数据,解决海量数据存储和实时更新查询的问题;利用ElasticSearch作为HBase索引,加快大数据集中实时查询数…...
ProComponent 用法学习
相信很多同学都用过 Ant Design 这一 react 著名组件库,而 ProComponents 则是在 antd 之上进行封装的页面级组件库(指一个组件就可以搞定一个页面)。它同时也是 Ant Design Pro 中后台框架所用的主要组件库。如果你手上有要用 react 开发的中…...
巨人互动|Google海外户Google Analytics的优缺点是什么?
Google Analytics是一个由谷歌开发的网站分析工具,旨在帮助网站和移动应用程序运营者收集和分析数据,以更好地了解用户行为和改进业务。虽然Google Analytics具有许多优势,但也存在一些缺点。在本文中,我们将探讨Google Analytics…...
MySQL数据库的操作
MySQL 连接服务器 库的操作创建数据库数据库删除查看数据库进入数据库查看所在的数据库修改数据库显示创建语句查看连接情况 表的操作创建表查看数据库所有的表查看表的详细信息查看创建表时的详细信息删除表修改表名向表中插入数据在表结构中新增一列对表结构数据的修改删除表…...
人工智能行业岗位一览
人工智能行业的岗位薪资高、待遇好、涨薪快已经是公开的事实,那么在人工智能行业中具体有哪些职业岗位呢?对于普通人来说,想要入行人工智能又有哪些机会呢? 下面是人工智能领域中的一部分职业岗位,随着技术的不断发展&…...
《Linux运维实战:Docker基础总结》
一、简介 1、docker的基本结构是什么,包含哪些组件? docker的基本机构是c/s模式,即客户端/服务端模式。 由docker客户端和docker守护进程组成。docker客户端通过命令行或其它工具使用docker sdk与docker守护进程通信,发送容器管理…...
Clash 意外退出后 chrome / google 谷歌 浏览器无法连接互联网
解决方案: 以管理员模式打开命令行,输入:netsh winsock reset ,然后重启电脑 如果还不行的话, 在 chromevs中选中 设置>隐私和安全>安全>使用安全 dns> 使用您当前的服务提供商 即可...
89 | Python人工智能篇 —— 深度学习算法 Keras 实现 MNIST分类
本教程将带您深入探索Keras,一个开源的深度学习框架,用于构建人工神经网络模型。我们将一步步引导您掌握Keras的核心概念和基本用法,学习如何构建和训练深度学习模型,以及如何将其应用于实际问题中。 文章目录 Keras 构建实际mnist图像分类案例.1. 介绍2. 环境搭建3. 数据准…...
每天一道leetcode:剑指 Offer 32 - III. 从上到下打印二叉树 III(中等广度优先遍历)
今日份题目: 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。 示例 给定二叉树: [3,9,20,null,null,15,7…...
day10 快速排序 方法重载 和 方法递推
方法重载 斐波拉契数列问题 使用重载思想解决 public static int method(int n){if (n 2 ){return 1 ;}return (n-1)*2method(n-1);}public static int f(int n){if (n 1){return 1;}if (n 2){return 2;}return f(n-1)f(n-2);} 快速排序 思维很简单,类似二…...
长沙大型网站建设公司/app拉新推广平台
消除多路复用DAC的输出错误在某些应用(如数据记录器)中,具有多路复用模拟输出是非常理想的。当一次仅有单个输出有效时,电压输出DAC">数模转换器(DAC)和模拟多路复用器可以实现这个需求。你可以使用此类信号来激活桥路。还可能需要双极输出&…...
政府网站信息建设经验/b2b平台有哪些平台
本文实例为大家分享了python实现五子棋小程序的具体代码,供大家参考,具体内容如下一、结合书上例子,分三段编写:wuziqi.py#coding:utf-8from win_notwin import *from show_qipan import *maxx10 #10行10列maxy10qipan[[0,0,0,0,1…...
文明网站建设方案/好看的网页设计作品
零基础学黑客,搜索公众号:白帽子左一作者:掌控安全—柚子 环境搭建 源码下载官网:https://www.wuzhicms.com/ 放到本地phpstudy根目录下,访问install路径进行安装。 访问后台: 访问前台: 敏感…...
商丘网站制作案例/互动营销
简介:本文主要目的是把现今主流的Dubbo框架项目和精准测试进行对接,通过精准测试的数据穿透、数据采集、测试用例与代码的双向追溯、数据分析等一系列精准测试的特有功能达到对项目质量的保证。 本次环境搭建分为基础环境准备、Dubbo环境搭建、精准测试…...
广东网站建设服务商/托管竞价推广公司
这是最简单的linux下postfix 安装步骤首先下载postfix源代码包:wget http://www.postfix.cn/source/official/postfix-2.6.5.tar.gztar vxfz postfix-2.6.5.tar.gzcd postfix-2.6.5useradd postfix -M -s /sbin/nologingroupadd postdropmakemake install一路enter直…...
做微信网站多少钱/网站制作
原文:I Love IIS7 在这个节日(这个节日对于我来说,明天早上9:45结束)里,我做了一些web编程,我发现我爱上IIS7了。我喜欢它的新元素"联合的" config,它允许每个虚拟目录指定其自身的脚本映射,即你…...