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)
})