经过本次项目实战,我增加了Node.js连接后台数据库(MySQL)进行增、删、改、查的实践经历,再结合之前在其他项目中使用C++、Java等语言连接MySQL的经历,特在此对使用Node.js,C++,Java等语言连接后台数据库的方法进行一个归纳总结和集中展示。
一、Node.js连接MySQL数据库
Web开发中后台使用Node.js连接MySQL数据库十分简单,提供的有现成的、完整MySQL工具包,在Node环境中使用npm install mysql安装即可。安装完成后通过其提供的mysql接口调用此模块,填写对应的用户名、密码和端口号等,创建与后台数据库的连接,记为connection,如图所示:
增删改查操作大致相同,均是通过get或者post函数与前端页面提供的接口建立连接,调用connection.query()函数完成后台数据库与前端页面数据的交互。需要特别注意的是,此时执行数据库操作的异常处理和结果获取等都是通过回调函数来实现的,因此程序执行具有异步性,不可使用C++和Java编程时对程序执行顺序判断的惯性思维来编写程序逻辑。增删改查示例如下:
查询数据:
增加数据:
修改数据:
删除数据:
二、Java连接MySQL数据库
Java连接MySQL需要下载JDBC驱动包mysql-connector-java-xxx.jar,然后使用JDBC连接MySQL数据库,随后填写对应的用户名、密码和端口号等,调用DriverManager.getConnection()来建立与数据库的连接,再调用executeQuery()或executeUpdate()函数来实现增删改查。示例如下:
具体增删改查操作与node.js大致相同,不再具体展示。
三、C++连接MySQL数据库
以VS2017使用C++连接MySQL数据库为例,其中环境配置的部分网上有很多的资料进行详细的说明,在此就不再赘述。主要对如何连接和进行增删改查进行说明。C++连接MySQL主要是通过一个MYSQL数据库结构体实现,调用mysql_real_connect()函数进行连接,调用mysql_query()函数进行SQL语句的执行,调用mysql_store_result()函数进行执行结果集的获取,调用mysql_free_result()函数进行执行结果集的释放,调用mysql_close()函数关闭连接。代码示例如下:
MYSQL mysql; //一个数据库结构体
MYSQL_RES* res; //一个结果集结构体
MYSQL_ROW row; // ar * * 二维数组,存放一条条记录
//初始化数据库
mysql_init(&mysql);
//设置编码方式
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME,"gbk");
//连接数据库
//判断如果连接失败就输出连接失败。
//注意你连接的账户名密码
if (mysql_real_connect(&mysql, "localhost", "root", "123456", "test", 3306, NULL, 0) == NULL) printf("连接失败!\\n"); //注意你连接的账户名密码
//注意你连接的账户名密码
//注意你连接的账户名密码
//注意你连接的账户名密码
//增删改查
char query[150]
sprintf_s(query, SQL语句);
if (mysql_query(&mysql, query)) //执行SQL语句 {
printf("Query failed (%s)\n",
mysql_error(&mysql));
}
else
{
printf("Insert success\n");
}
//获取结果集
res = mysql_store_result(&mysql); mysql_free_result(res); //关闭数据库
mysql_close(&mysql);
四、C++连接SQLite数据库
由于使用C++调用MySQL数据库需要很繁杂的环境配置,因此,在可以满足要求的条件下使用SQLite数据库不失为一种较好的选择。MySQL数据库与SQLite数据库相比上云平台更加容易,因此,许多网站的后台数据库均是采用的MySQL,而SQLite数据库则是更多的基于本地,SQLite数据库是一个轻量级的数据库,无需安装和配置环境,只需要从官网下载几个很小的、必要的文件,编译生成对应的sqlite3.lib文件(分32位和64位)即可使用。C++连接SQLite数据库主要是使用一个sqllite3类型的指针指向标记所要连接的数据库的变量,调用sqlite3_open()函数打开数据库建立连接,调用sqlite3_exec()函数实现增删改查,调用sqlite3_close()函数关闭连接,查看sqlite数据库的内容可以借助SQLiteStudio工具。代码示例如下:
#include "stdafx.h"
#include "sqlite3.h"
#include <iostream>
using namespace std;
sqlite3 * pDB = NULL;
//增加用户
bool AddUser(const string& sName, const string& sAge);
//删除用户
bool DeleteUser(const string& sName);
//修改用户
bool ModifyUser(const string& sName, const string& sAge);
//查找用户
bool SelectUser();
int _tmain(int argc, _TCHAR* argv[])
{
//打开路径采用utf-8编码
//如果路径中包含中文,需要进行编码转换
int nRes = sqlite3_open("D:\\sqlite\\test.db", &pDB);
if (nRes != SQLITE_OK)
{
cout<<"Open database fail: "<<sqlite3_errmsg(pDB);
goto QUIT;
}
//添加“赵钱孙李”
if(!AddUser("zhao", "18")||!AddUser("qian", "19")|| !AddUser("sun", "20")||!AddUser("li", "21"))
{
goto QUIT;
}
//删除“赵”
if (!DeleteUser("zhao"))
{
goto QUIT;
}
//修改“孙”
if (!ModifyUser("sun", "15"))
{
goto QUIT;
}
//查找用户
if (!SelectUser())
{
goto QUIT;
}
QUIT:
sqlite3_close(pDB);
return 0;
}
bool AddUser(const string& sName, const string& sAge)
{
string strSql = "";
strSql += "insert into user(name,age)";
strSql += "values('";
strSql += sName;
strSql += "',";
strSql += sAge;
strSql += ");";
char* cErrMsg;
int nRes = sqlite3_exec(pDB , strSql.c_str() ,0 ,0, &cErrMsg);
if (nRes != SQLITE_OK)
{
cout<<"add user fail: "<<cErrMsg<<endl;
return false;
}
else
{
cout<<"add user success: "<<sName.c_str()<<"\t"<<sAge.c_str()<<endl;
}
return true;
}
bool DeleteUser(const string& sName)
{
string strSql = "";
strSql += "delete from user where name='";
strSql += sName;
strSql += "';";
char* cErrMsg;
int nRes = sqlite3_exec(pDB , strSql.c_str() ,0 ,0, &cErrMsg);
if (nRes != SQLITE_OK)
{
cout<<"delete user fail: "<<cErrMsg<<endl;
return false;
}
else
{
cout<<"delete user success: "<<sName.c_str()<<endl;
}
return true;
}
bool ModifyUser(const string& sName, const string& sAge)
{
string strSql = "";
strSql += "update user set age =";
strSql += sAge;
strSql += " where name='";
strSql += sName;
strSql += "';";
char* cErrMsg;
int nRes = sqlite3_exec(pDB , strSql.c_str() ,0 ,0, &cErrMsg);
if (nRes != SQLITE_OK)
{
cout<<"modify user fail: "<<cErrMsg<<endl;
return false;
}
else
{
cout<<"modify user success: "<<sName.c_str()<<"\t"<<sAge.c_str()<<endl;
}
return true;
}
static int UserResult(void *NotUsed, int argc, char **argv, char **azColName)
{
for(int i = 0 ; i < argc ; i++)
{
cout<<azColName[i]<<" = "<<(argv[i] ? argv[i] : "NULL")<<", ";
}
cout<<endl;
return 0;
}
bool SelectUser()
{
char* cErrMsg;
int res = sqlite3_exec(pDB, "select * from user;", UserResult , 0 , &cErrMsg);
if (res != SQLITE_OK)
{
cout<<"select fail: "<<cErrMsg<<endl; return false;
}
return true;
}
五、总结 使用各编程语言连接数据库的大致思路和步骤大同小异,均是通过数据库的用户名、端口号、密码等与数据库建立连接,不同之处在于依赖的工具包和使用的封装好的函数不同,从而导致使用的方法不同,因此使用编程语言连接数据库的方法是一脉相连、融汇贯通的,我们可以根据自己的需求选择合适的编程语言和合适的数据库进行连接,以达到编程效率的最大化。
参考资料:https://blog.csdn.net/lanshengsheng2012/article/details/22159033