主要还是偏应用型,主要分为3部分,Node连接mysql数据库,Node建立连接池,实际应用。
Node操作mysql数据库
安装MySQL驱动模块
当然我们的第一步是安装MySQL驱动模块:
npm install mysql --save
安装完之后如果要使用在代码中引入就可以了:
const mysql = require('mysql')
连接数据库
配置项是我们在安装mysql数据库时就要明确的,我们的mysql数据库地址,用户名和密码,以及具体是哪个数据库。
//设置好配置项
const config = {
host: 'localhost',
database: 'test',
user:'root',
password:'123456'
}
有了配置项,我们就能正确的找到对应数据库并建立连接了:
//创建连接实例
let connection = mysql.createConnnection(config)
//调用连接
connection.connect();
要检测一下有没有连接上?我们可以给connect()传一个回调函数,改成这样:
connection.connect(function(err){
if(err){
console.error('error connecting: ',err)
}
console.log('connection id is ',connection.threadId);
})
连接成功的话结果当然是类似这样:
connection id is 6
操作数据库
连接完数据库我们当然是要各种操作数据库了,怎么说呢,有时候往往把前面的demo弄通了我就觉得ok了,我会用node来操作mysql数据库了,其实到上面那一步,你什么都不会,因为等到真正让你用它去实现业务时,你就不知道如何才能写下去了,然后呢就放弃呗,放弃谁不会呢?
增删改查,一步步来。
一个数据库里我们建很多来存储不同业务数据的表,比如我们就建立一张存储用户数据的表,包括什么呢?
- 用户名name
- 用户id
- 用户设置的密码password
- 用户性别sex
- 用户头像地址avator
- 用户等级level
操作数据库的操作都是通过connection实例的query()函数完成的,而我们只要专注于那些mysql查询语句怎么写。
创建表格
let createTable = `CREATE TABLE user(
user_id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR(20) NOT NULL,
user_password VARCHAR(20) NOT NULL,
user_sex VARCHAR(1) NOT NULL,
user_avator VARCHAR(100) NOT NULL,
user_level INT NOT NULL,
PRIMARY KEY(user_id)
)`
connection.query(createTable, function(err, result){
if(err){
console.error('create failed and err is ', err)
}
console.log('create success and the result is ', result)
})
你可以立即去mysql相应的数据库里面去查看是否有相应的表被新建了,这个语句是没有问题的,因为我成功了:)。
插入数据
let addSql = 'INSERT INTO user(user_id,user_name,user_password,user_sex,user_avator,user_level) VALUES(?,?,?,?,?,?)';
let addSqlParams = [1, 'mosum', '123456', 'm', 'd://workspace://project//img//test.png', 2];
//增
connection.query(addSql,addSqlParams,function (err, result) {
if(err){
console.log('[INSERT ERROR] - ',err.message);
return;
}
console.log('--------------------------INSERT----------------------------');
//console.log('INSERT ID:',result.insertId);
console.log('INSERT ID:',result);
console.log('-----------------------------------------------------------------\n\n');
});
tips:当然这里面的用户数据不可能是我们写死的,肯定是从用户发送过来的req中获取的。
如果我们一遍遍去执行我们的示例代码,显然是会报错的,首先,已经创建的表格不能再被创建。所以我们需要在建表之前先确认一下该表是否存在:
let createTable = `CREATE TABLE if not exists user(
user_id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR(20) NOT NULL,
user_password VARCHAR(20) NOT NULL,
user_sex VARCHAR(1) NOT NULL,
user_avator VARCHAR(100) NOT NULL,
user_level INT NOT NULL,
PRIMARY KEY(user_id)
)`
connection.query(createTable, function(err, result){
if(err){
console.error('create failed and err is ', err)
}
console.log('create success and the result is ', result)
})
ok,正常的结果当然就是user表格里面被插入了一条我们指定的数据,当然类似的,如果你重复执行这段插入语句,肯定会报错的,因为我们为每个用户设立的主键user_id,它的值是不能够重复的。所以想添加其它数据,记得改变user_id。
删除数据
let delSql = 'DELETE FROM user where user_id=2';
//删
connection.query(delSql,function (err, result) {
if(err){
console.log('[DELETE ERROR] - ',err.message);
return;
}
console.log('--------------------------DELETE----------------------------');
console.log('DELETE affectedRows',result.affectedRows);
console.log('-----------------------------------------------------------------\n\n');
});
ok,删除也成功了。
更新数据
let modSql = 'UPDATE user SET user_name = ?,user_level = ? WHERE user_id = ?';
let modSqlParams = ['pengjun', 4,4];
//改
connection.query(modSql,modSqlParams,function (err, result) {
if(err){
console.log('[UPDATE ERROR] - ',err.message);
return;
}
console.log('--------------------------UPDATE----------------------------');
console.log('UPDATE affectedRows',result.affectedRows);
console.log('-----------------------------------------------------------------\n\n');
});
查询数据
let sql = 'SELECT * FROM user';
//查
connection.query(sql,function (err, result) {
if(err){
console.log('[SELECT ERROR] - ',err.message);
return;
}
console.log('--------------------------SELECT----------------------------');
console.log(result);
console.log('------------------------------------------------------------\n\n');
});
其实每次强调的去看数据库表,通过查询语句也可以直接在终端查看,但是增删改查嘛,查就在最后讲。
至此,Node操作mysql数据库的基本操作就结束了,但是mysql查询语句还有很多其他灵活的操作,这个在我们做业务时再去逐步完善。
Node操作mysql连接池
为什么要建立连接池,因为我们只有一个connection实例,单连接操作每次查询数据库后都要关闭连接才能重新建立连接,不停的连接断开会浪费性能,况且服务器需要处理并发的情况,只开起一个连接肯定是不现实的。
建立连接池
我们把之前的createConnection改为createPool,同时配置时加一个最大连接数connectionLimit
// 初始化数据库配置,建立连接池 mysql端口号默认为3306
const config = {
host: 'localhost',
database: 'test',
user:'root',
password:'123456',
connectionLimit: 10
}
const pool = mysql.createPool(config);
// 直接使用 pool.query
pool.query('SELECT * FROM user', function (err, results, fields) {
if (err) {
console.error(err);
return;
}
console.debug('results', results);
});
直接用pool.query 每次都随机分配 connection, 并且会自动回收connection。
当然如果我们想要使用相同的connnection,可以调用pool.getConnection获得连接:
pool.getConnection(function (err,connection){
if (err) {
console.error(err);
return;
}
connection.query('SELECT * FROM user', function (err, results, fields) {
if (err) {
console.error(err);
return;
}
console.debug('results', results);
connection.release(); // 释放该链接,把该链接放回池里供其他人使用
// connection.destroy(); // 如果要关闭连接并将其从池中删除,请改用connection.destroy()。该池将在下次需要时创建一个新的连接。
});
})
实际应用
为了应付繁杂庞大的业务,我们不可能把所有的操作都写在一块儿,所以就需要不同的文件来达到规范管理。
首先需要一个默认的配置项,我们可以把这个作为一个模块,卸载default.js中。
查询语句呢也可以专门写一个js来统一管理;
操作数据库的具体函数可以统一写在一个类里面,是某某表的DAO.js,这里是最底层的数据库调用;
和业务层的交互可以另外建一个models文件夹来对上面的底层操作进行进一步封装。
最后我们就可以开始在路由逻辑里面调用models里面的函数来操作数据库了。
当然这只是项目里面的一个操作数据库的思路,至于你想怎么改,只要能实现你的要求,都可以,整个流程走通了再考虑优化也不是不行对吧。