一、在Express项目中操作数据库的主要知识
①安装操作MySQL数据库的第三方模块
②通过mysql模块连接到MySQL数据库
③通过mysql模块执行SQL语句操作数据库
1、安装mysql模块
mysql模块是托管与npm上的第三方模块,它提供了在Node.js项目中连接和操作MySQL数据库的能力。
想要在项目中使用它,需要先运行如下命令,将mysql安装为项目的依赖包:
npm install mysql
2、配置mysql模块
在使用mysql模块操作MySQL数据库之前,必须先对mysql模块进行必要的配置,主要格式如下:
//导入mysql模块
const mysql = require('mysql')
const connection = mysql.createConnection({
})
//建立连接
connection.connect();
在建立连接时,可以设置以下选项:
host
:连接到的数据库的主机名。(默认值:localhost)
port
:要连接的端口号。(默认:3306)
user
:需要认证的MySQL用户。
password
:MySQL用户的密码。
database
:用于此连接的数据库名称(可选)。
3、使用mysql模块操作MySQL数据库
可以在对象(如connection、pool)上调用query()
方法,格式如下:
.query('SQL语句', function (error, results, fields) {
});
error
:发生的错误;
results
:结果;
fields
:字段,包含关于返回结果字段的信息(可选)。
//在使用占位符值时出现
.query(sqlString, values, function (error, results, fields){
})
sqlString
:SQL语句,包含占位符?
values
:如果只有一个替换字符(?),且值不是null、undefined或数组,它可以直接作为.query的第二个参数传递;
callback
:回调函数
注意:使用占位符可以过滤传入的值,防止SQL注入。
如info数据库下有一个表student,数据如下:
(1)查询数据
查询student表中的数据。注意:我们查询得到的每条数据都是一个对象,每个对象最后组成一个数组。
//导入mysql模块
const mysql = require('mysql')
const connection = mysql.createConnection({
host:'127.0.0.1',//数据库的IP地址
port:3306,//端口号
user:'root',//登录数据库的账号
password:'iampwd',//登录数据库的密码
database:'info'//指定要操作哪个数据库
})
//建立连接
connection.connect();
//查询数据
connection.query('SELECT * FROM student',(err,result)=>{
//err:可能产生的错误
//result:SQL语句的结果
if(err) throw err;
console.log(result)
})
注意:如果执行的是select查询语句,则执行的结果是数组。
(2)插入数据
向student表中新增数据,s_name为小小,s_BIRTHDAY为2020-09-09,s_gender为女。
//导入mysql模块
const mysql = require('mysql')
const connection = mysql.createConnection({
host:'127.0.0.1',//数据库的IP地址
port:3306,//端口号
user:'root',//登录数据库的账号
password:'iampwd',//登录数据库的密码
database:'info'//指定要操作哪个数据库
})
//建立连接
connection.connect();
//插入数据
connection.query(`INSERT INTO student VALUES('09','小小','2020-09-09','女')`,(err,result)=>{
//err:可能产生的错误
//result:SQL语句的结果
if(err) throw err;
console.log(result)
})
注意:如果执行的是insert into插入语句,则results是一个对象,可以通过affectedRows属性,如果它等于1,则证明插入数据成功。
(3)更新数据
更新student表中的数据。
//导入mysql模块
const mysql = require('mysql')
const connection = mysql.createConnection({
host:'127.0.0.1',//数据库的IP地址
port:3306,//端口号
user:'root',//登录数据库的账号
password:'iampwd',//登录数据库的密码
database:'info'//指定要操作哪个数据库
})
//建立连接
connection.connect();
//更新数据
connection.query('UPDATE student SET s_name="lucky" WHERE s_id=07',(err,result)=>{
//err:可能产生的错误
//result:SQL语句的结果
if(err) throw err;
console.log(result)
})
注意:如果执行的是update语句,则执行的结果results也是一个对象,可以通过affectedRows属性,如果它等于1,则证明更新数据成功。
(4)删除数据
在删除数据时,推荐根据id这样的唯一标识,来删除对应的数据。示例如下:
删除student表中的数据。
//导入mysql模块
const mysql = require('mysql')
const connection = mysql.createConnection({
host:'127.0.0.1',//数据库的IP地址
port:3306,//端口号
user:'root',//登录数据库的账号
password:'iampwd',//登录数据库的密码
database:'info'//指定要操作哪个数据库
})
//建立连接
connection.connect();
connection.query('DELETE FROM student WHERE s_id=08',(err,result)=>{
//err:可能产生的错误
//result:SQL语句的结果
if(err) throw err;
console.log(result)
})
注意:执行delete语句之后,结果也是一个对象,也会包含affectedRows属性,如果SQL语句中有多个占位符,则必须使用数组为每个占位符指定具体的值;如果SQL语句中只有一个占位符,则可以省略数组。
总结:执行删除
、更新
、插入
返回对象
,如果返回对象的属性中的affectedRows大于0,说明执行成功;执行查询
返回数组
。
4、连接池技术
上面使用mysql.createConnection()的方法有一个缺陷,就是每操作一张表就要建立一次连接对象,如果一个项目中有很多表,那就要和数据库创建很多次连接,再断开,效率很低,也容易出现问题。所以我们接下来就要学习数据库连接池技术。
数据库连接池是程序启动时建立足够数量的数据库连接对象,并将这些连接对象组成一个池,由程序动态地对池中的连接对象进行申请、使用和释放。
(1)使用数据库连接池原理及优点
数据库连接池在初始化时将会创建一定数量的数据库连接对象放到连接池中
,连接池都将一直
保证至少拥有这么多的连接数量,当有数据库需要被连接的时候,它会向数据库连接池申请资源和使用
,使用完成后会释放
到数据库连接池中。当然数据库连接池中拥有最小连接数量和最大连接数量,当数据库的连接超过连接池中最大的数量的时候,这些请求将被加入到等待队列
中。
当网站某一天有很大的流量的时候,数据库服务器需要为每次链接创建一次数据库链接。这样就很浪费数据库的资源,并且频繁的创建和关闭数据库的链接,很容易导致服务器内存溢出等情况发生。
如果将连接池配置为允许100个连接,但同时只使用5个连接,则只会建立5个连接。连接是循环的方式,从池的顶部取下连接,然后返回到池的底部。
(2)连接池的作用
数据库的连接池负责分配
、管理
和释放
数据库连接对象。它允许应用程序重复使用一个现有的数据库的连接对象,而不是重新创建一个。