Node操作mysql数据库

主要还是偏应用型,主要分为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相应的数据库里面去查看是否有相应的表被新建了,这个语句是没有问题的,因为我成功了:)。

扫描二维码关注公众号,回复: 2610253 查看本文章

插入数据

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里面的函数来操作数据库了。

当然这只是项目里面的一个操作数据库的思路,至于你想怎么改,只要能实现你的要求,都可以,整个流程走通了再考虑优化也不是不行对吧。

猜你喜欢

转载自blog.csdn.net/YPJMFC/article/details/79413442