本文将介绍如何使用mysqljs/mysql
模块实现Node.js
应用程序与MySQL
数据库的交互。
准备
安装
mysqljs/mysql
模块介绍
This is a Node.js module available through the npm registry.
This is a node.js driver for mysql. It is written in JavaScript, does not require compiling, and is 100% MIT licensed.
在Node.js应用程序根目录,使用npm命令安装mysql模块
npm install mysql
使用
1. 连接数据库
step1:导入mysql
模块
const mysql = require("mysql");
step2:调用createConnection()
创建连接对象
// createConnection(config),config:Object|String 提供两种创建连接对象的方式
// config 详情参考 https://github.com/mysqljs/mysql#connection-options
// Object 传参方式
const conn = mysql.createConnection({
host:"localhost",
port:3306,
user:"root",
password:"1234qwer",
database:"ex_test"
});
// String 传参方式,可读性差,不推荐
// URL格式的连接配置,如 mysql://user:pass@host/db?debug=true
const conn2 = mysql.createConnection("mysql://root:1234qwer@localhost:3306/ex_test?debug=true");
// 数据库连接配置,也可以使用如下方式进行配置
conn.config.database = "ex_test";
step3:调用conn.connect()
建立连接
// connect()方法接受一个具有err参数的回调函数,如果发生任何错误,它将提供详细的错误
conn.connect(function (err){
if(err){
console.log(err.message);
}else{
console.log("---------------[conn.connect] succeed.---------------")
}
})
step4:调用conn.query()
操作数据库
// 对数据库的CRUD,都是用query()方法,后边再详细说明
conn.query("select 1",function (err,results){
console.log(results);
})
step5:调用conn.end()
关闭连接
// end()接受一个回调函数,并且会在query结束之后才触发,如果query出错,仍然会终止连接,错误会传递到回调函数中处理
conn.end(function (err){
if(err){
console.log(err.message);
}else{
console.log("---------------[conn.end] succeed.---------------")
}
});
// 要立即强制连接,可以使用destroy()方法
// destroy()立即终止数据库连接,即使还有query没有完成,它不会像end()方法那样采取任何回调参数
conn.destroy();
2. 操作数据库
对数据库的操作(CRUD、建库、建表等),都是使用query()方法,该方法接收三个参数:
第1个参数:sql语句,或者option Object;
第2个参数:为sql语句中的占位符提供的值,是单个值,或多个值组成的数组,或对象;
第3个参数:回调函数,回调函数有3个参数(error,result,fields),error是发生错误时的错误信息,results是sql执行结果,fields是涉及的字段(如果有);
详情参考:https://github.com/mysqljs/mysql#performing-queries
2.1 创建库
// 创建数据库 nodejs_mysql_db(不存在时才创建)
let db_sql = "CREATE DATABASE IF NOT EXISTS `nodejs_mysql_db` DEFAULT CHARSET utf8;"
conn.query(db_sql,function (err,results){
if(err){
return console.log(err);}
console.log(results.affectedRows); // 如果不报错,无论是否已创建 results.affectedRows=1
})
2.2 创建表
// 创建数据表 student (不存在时才创建)
let tb_sql = `CREATE TABLE IF NOT EXISTS students (
Sid INT(8) NOT NULL AUTO_INCREMENT,
Sname VARCHAR(10) NOT NULL,
Sage INT(11) DEFAULT NULL,
Ssex VARCHAR(10) DEFAULT NULL,
PRIMARY KEY (Sid)
) ENGINE=INNODB DEFAULT CHARSET=utf8;`
// 上边在创建数据库连接对象时,连接的database是ex_test,这里给切换到新建的nodejs_mysql_db数据库
conn.config.database = "nodejs_mysql_db";
conn.query(tb_sql,function (err,results){
if(err){
return console.log(err);}
console.log(results);
})
2.3 新增数据
// 方式1:每个?占位符 代表1个列属性,使用数组方式传值,数组长度与占位符个数一致,数组的每个元素将依次传给?占位符
// Arrays are turned into list, e.g. ['a', 'b'] turns into 'a', 'b'
let sql_insert1 = "INSERT INTO students (Sname,Sage,Ssex) VALUES (?,?,?)";
let student1 = ["张敏","20","女"];
// console.log(mysql.format(sql_insert1,student1)); // 可以使用 mysql.format() 将sql语句转化为标准sql
let qr1 = conn.query(sql_insert1,student1,function (