Node操作MySQL数据库

安装mysql

npm i mysql -S

引入模块

let mysql = require('mysql');

测试mysql模块是否能正常工作

const mysql = require('mysql')

// 连接配置mysql
const connection = mysql.createConnection({
 host:'localhost',//连接到的数据库的主机名。(默认值:localhost)
 port:'3306',//要连接的端口号。(默认:3306)
 user:'root',//需要认证的MySQL用户。
 password:'123456',//MySQL用户的密码。
 database:'User',//用于此连接的数据库名称(可选)。
})
//建立连接
connection.connect(function (err) { 
 if (err) { 
  console.log('连接失败:'+err)
  return;
 }
 console.log('连接成功')
});

connection.query("SELECT 1+1 as solution", function (err, rows, fields) { 
 if (err) { 
  console.log('err:' + err)
  return
 }
 console.log(rows[0].solution)
})

connection.end(function (err) { 
 if (err) { 
  return
 }
 console.log('关闭成功')
})

注:这里如果你的mysql版本在8.0以上会报错,原因是加密方式的原因报错。
连接失败:Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
err:Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
解决方案

mysql -u root -p
123456
use User;
alter user 'root'@'localhost' identified with mysql_native_password by '123456';
flush privileges;

创建数据表


//创建用户表
const sql = `create table if not exists userinfo (
 id int unsigned auto_increment,
 username varchar(100) not null,
 password varchar(20) not null,
 primary key ( id )
 )engine=innodb default charset=utf8`

 //删除表
// const sql = `DROP TABLE userinfo`
connection.query(sql, function (err, result, fields) { 
 if (err) { 
  console.log('err:' + err)
  return
 }
 console.log('创建成功:'+JSON.stringify(result))//创建成功:{"fieldCount":0,"affectedRows":0,"insertId":0,"serverStatus":2,"warningCount":2,"message":"","protocol41":true,"changedRows":0}
})

插入数据

//插入数据
const sql = `insert into userinfo(id,username,password) value(0,?,?)`;
const data = ['huhao','123456']
connection.query(sql, data, function (err, result, fields) { 
 if (err) { 
  console.log('err:' + err)
  return
 }
 console.log('成功:'+JSON.stringify(result))
})

查询数据

//查询数据
const sql = `select * from userinfo`;
connection.query(sql, function (err, result, fields) { 
 if (err) { 
  console.log('err:' + err)
  return
 }
 console.log('成功:'+JSON.stringify(result))//创建成功:[{"id":1,"username":"huhao","password":"123456"}]
})

修改数据

//更新数据
const sql = `update userinfo set username=?,password=? where id=?`;
const data =['xiao hu','abc123',1]
connection.query(sql, data, function (err, result, fields) { 
 if (err) { 
  console.log('err:' + err)
  return
 }
 console.log('成功:'+JSON.stringify(result))
})

删除数据

//删除数据
const sql = `delete from userinfo where id=1`;
connection.query(sql, function (err, result, fields) { 
 if (err) { 
  console.log('err:' + err)
  return
 }
 console.log('成功:'+JSON.stringify(result))
})

node mysql 使用连接池

使用mysql.createConnection()的方法有缺陷,就是每操作一张表就要建立一次连接对象,如果一个项目中有很多表,那就要和数据库创建很多次连接,再断开,效率很低,也容易出现问题。
数据库服务器需要为每次链接创建一次数据库链接。这样就很浪费数据库的资源,并且频繁的创建和关闭数据库的链接,很容易导致服务器内存溢出等情况发生。

数据库连接池在初始化时将会创建一定数量的数据库连接对象放到连接池中,连接池都将一直保证至少拥有这么多的连接数量,当有数据库需要被连接的时候,它会向数据库连接池申请资源和使用,使用完成后会释放到数据库连接池中。当然数据库连接池中拥有最小连接数量和最大连接数量,当数据库的连接超过连接池中最大的数量的时候,这些请求将被加入到等待队列中。

创建连接池

const mysql = require('mysql')

// 连接配置mysql
var pool  = mysql.createPool({
 host:'localhost',//"数据库服务器地址",
 port: "3306", // MySQL数据库端口号
 database:'User',// "数据库名",
 user:'root',//"连接数据库的用户名",
 password:'123456',//"连接数据库的密码",
 connectionLimit: 20,//"指定连接池中最大的链接数,默认是10",
 multipleStatements: true,//"是否运行执行多条sql语句,默认值为false"
});

从连接池中获取一个连接

pool.getConnection(function(err, connection) {
   //代码
})

关闭连接池

pool.end(function(err) {
  	// The connection is terminated now
});

当完成使用池,必须结束所有的连接,否则Node.js事件循环将保持活动,直到连接被MySQL服务器关闭。如果发生了一个致命的错误,一个err参数将被提供给回调函数,但是无论如何连接将被终止。end方法接受一个可选的回调函数,可以使用它来知道所有连接何时结束。

从连接池中移除连接对象
关闭连接并将其从池中删除,该池将在下一次需要连接时创建一个新连接

connection.destroy();

与end()不同,destroy()方法不接受回调参数。

释放连接对象(放回到连接池)

connection.release();

以上都是在最后使用连接池后执行。

连接池操作mysql


pool.getConnection(function(err,connection) {
 if (err) throw err; //连接失败时
  pool.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
   if (error) throw error;
   console.log('The solution is: ', results[0].solution);
   // 释放连接
   // connection.release(); 
   //关闭连接池
   // pool.end();
  });
 
   //插入数据
  const insertsql = `insert into userinfo(id,username,password) value(0,?,?)`;
  const adddata = ['xiao hao','123456']
   pool.query(insertsql, adddata, function (err, result, fields) { 
    if (err) { 
     console.log('err:' + err)
     return
    }
    console.log('成功:' + JSON.stringify(result))
    // connection.release(); 
    // pool.end();
   })
 
   //查询数据
  const sql = `select * from userinfo`;
  pool.query(sql, function (err, result, fields) { 
   if (err) { 
    console.log('err:' + err)
    return
   }
   console.log('成功:'+JSON.stringify(result))//创建成功:[{"id":1,"username":"huhao","password":"123456"}]
  })

   //更新数据
  const updatesql = `update userinfo set username=?,password=? where id=?`;
  const updatedata =['xiao hu','abc123',2]
  pool.query(updatesql, updatedata, function (err, result, fields) { 
   if (err) { 
    console.log('err:' + err)
    return
   }
   console.log('成功:'+JSON.stringify(result))
  })
   
   //删除数据
  const delsql = `delete from userinfo where id=2`;
  pool.query(delsql, function (err, result, fields) { 
   if (err) { 
    console.log('err:' + err)
    return
   }
   console.log('成功:' + JSON.stringify(result))
   // 释放连接
   connection.release(); 
   //关闭连接池
   pool.end();
  })
});

  目录