1、mysql模块

之前介绍的express模块可以很简单的布置后端服务器,但是服务器数据的存储工作是有数据库操作的,所以这里必须要对数据库进行对接

与数据可对象的模块这里使用的是mysql模块

node连接任何数据库都需要相应的模块连接响应的数据库操作

该模块十用来与mysql数据库进行连接的模块,并对数据库进行操作;该模块属于第三方模块

下载模块

npm install mysql

2、使用mysql数据库模块

这里介绍使用数据库模块的方式,先连带复习下数据库

创建数据库,并创建对应的数据表

set names utf8;
drop database if exists mydatyabase;
create database mydatabase charset=utf8;
use mydatabase;
create table mytables(
    mid int primary key auto_increament,
    mname varchar(30) not null
);

创建数据库的实例只是复习,并不是说使用这个例子

现在开始使用mysql模块:

步骤一:加载模块

const mysql=require('mysql');

步骤二:创建链接

var connection = mysql.creatConnection({
    host:'127.0.0.1',
    user:'root',
    password:'root',
    database:'mydatabase'
})//设置链接
connection.connect();
//使用设置的链接进行链接

步骤三:使用链接进行数据库操作

connection.query('数据库查询语句','回调函数,处理查询结果')

3、数据库链接参数解析

库连接对象var connection=mysql.createConnection({options})

创建连接对象需要有参数{options}下面详细讲述{options}对象:

属性名             对应的含义
host              表示的是主机名
port              表示的是主机项目的端口
user              表示的是对应数据库的用户名
password          表示的是数据用户的密码
database          表示的是链接的数据库
charset           表示的是字符集使用的编码方式
connectTimeouit   表示的是设置链接超时时间

4、数据库操作方法解析

connection.query(数据库操作语句,回调函数)

query方法会执行对数据的操作语句,并使用回调函数获取查询结果。

回调函数(err,result)=>{

         if(err) throw err

         console.log(result)

}

参数:

         err:可能出现的错误

         result:返回的结果

5、使用数据库链接池进行链接

当前方式每次请求时都需要连接,后续连接需要等前面的连接执行完成后才能获取操作,对服务器性能影响很大;数据连接池的作用就是提前先建立一批连接,保存在一个集合中,然后使用的时候就获取连接进行操作,操作完释放等待下次获取连接

使用方式:

步骤一:创建数据库链接池

const pool=mysql.createPool({options})

数据库链接池参数解析:

host:'127.0.0.1',//主机地址或者主机名
port:80,//端口
user:'root',//用户名
password:'wad123',//用户密码
database:'xuezi',//数据库
charset:'utf8',//编码格式,默认utf8
connectionLimit:10//连接池大小,默认15个

步骤二:使用数据库链接池进行数据库操作

pool.query("select * from emp",(err,results)=>{
	if(err){throw err}
	console.log(results)
})
或者:
pool.getConnection(function(err,conn){
	conn.query('..',function(err,result){
		//处理结果
		conn.release()//释放连接
	})
})

6、数据sql注入攻击与占位符

sql注入攻击:

之前的执行方法可以看到是进行sql语句的拼接操作的,但是当用户输入非法语句的时候,就可能出现原本的sql语句的寓意被篡改的轻快,从而使得用户获取到非法结果,这种方式称为注入攻击

let ename="tom'or'1"
pool.query("select * from emp where ename='"+ename+"'",(err,results)=>{
	if(err){throw err}
	console.log(results)
})

这种情况下,sql语句拼接就是:select * from emp where ename='tom'or'1',作用就变成了查询所有数据了

解决方法:

MySQL模块提供了解决办法,在query方法中提供了第二个参数进行过滤

pool.query("select * from emp where ename=?",[ename],(err,results)=>{
	if(err){throw err}
	console.log(results)
})

第二个参数就是将用户输入数据进行筛选,这里使用了占位符?,表示占位作用

占位符就是【?】表示这个位置是有东西的,但是内容待定,所以称为占位符

扩展:

使用占位符代替对象,例如要进行数据库数据插入操作的时候,可以将数据组成对象进行传递,【当然对象的属性名要与数据的名一一对应】

要传递的对象:

let obj={
	eid:null,
	ename:'吴京',
	sex:1,
	birthday:'2021-03-24',
	salary:4500,
	dept_id:1
}

传递方式:

let sqlStr='insert into emp set ?'
pool.query(sqlStr,[obj],(err,results)=>{
	if (err) throw err
	console.log(results)
})