(1)安装操作 MySQL 数据库的第三方模块(mysql)
(2)通过 mysql 模块连接到 MySQL 数据库
(3)通过 mysql 模块执行 SQL 语句
Mysql 模块是托管于 npm
上的第三方模块。它提供了在 Node.js 项目中连接和操作 MySQL 数据库的能力。
想要在项目中使用它,需要先运行如下命令,将 mysql 安装为项目的依赖包:
npm install mysql
如下:
如下图,我的MySQL 数据库中有如下数据:
在使用 mysql 模块操作 MySQL 数据库之前,必须先对 mysql 模块进行必要的配置,主要的配置步骤如下:
//导入模块 const mysql = require('mysql') //建立与mysql数据库的联系 const db = mysql.createPool({ host:'127.0.0.1', //数据库的IP地址 user:'root', //登录数据库的账号 password:'******',//登录数据库的密码 database:'bear2' //指定要操作哪个数据库 })
调用 db.query()
函数,指定要执行的 SQL 语句,通过回调函数拿到执行的结果:
//测试mysql能否正常工作 db.query('SELECT 1',(err,results)=>{ if(err) return console.log(err.message) //能够成功的执行SQL语句 console.log(results) })
测试结果为:
查询 student
表中所有的数据:
db.query('SELECT * FROM STUDENT',(err,results)=>{ //查询失败 if(err) return console.log(err.message) //查询成功 console.log(results) })
结果为:
查询成功,且得到的结果是一个数组。
向 student
表中新增数据, 其中 cname
为 '小延'
,age
为 16
。示例代码如下:
//要插入到student表中的数据对象 const student = {cname:'小延',age:16} //待执行的SQL语句,其中英文的?表示占位符 const sqlStr = 'INSERT INTO student(cname,age)VALUES(?,?)' //使用数组的形式,依次为占位符指定具体的值 db.query(sqlStr,[student.cname,student.age],(err,results)=>{ if(err) return console.log(err.message) //失败 if(results.affectedRows === 1){ console.log('插入成功') //成功 } })
结果为:
打开数据库,查看数据,即:
数据插入成功。
向表中新增数据时,如果数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速插入数据:
//要插入到student表中的数据对象 const student = {cid:9,cname:'小杨',age:18,class_id:1002} //待执行的SQL语句,其中英文的?表示占位符 const sqlStr = 'INSERT INTO student SET ?' //直接将数据对象当做占位符的值 db.query(sqlStr,student,(err,results)=>{ if(err) return console.log(err.message) //失败 if(results.affectedRows === 1) console.log('插入数据成功!') })
结果为:
打开数据库,查看数据,即:
数据插入成功。
可以通过如下方式,更新表中的数据:
//要更新的数据对象 const student = {cid: 8, cname: '小欣', age: 18, class_id: 1002} //要执行的SQL语句 const sqlStr = 'UPDATE student SET cname=?,age=?,class_id=? WHERE cid=?' //调用db.query()执行SQL语句的同时,使用数组依次为占位符指定具体的值 db.query(sqlStr,[student.cname,student.age,student.class_id],(err,results)=>{ if(err) return console.log(err.message) //失败 if(results.affectedRows === 1) { console.log('更新数据成功!') } })
结果为:
打开数据库,查看数据,即:
数据更新成功。
更新表数据时,如果数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速更新表数据:
const student = {cid:1,cname:'小钰',age:17,class_id:1003} //要执行的SQL语句 const sqlStr = 'UPDATE student SET ? WHERE cid=?' 调用db.query()执行SQL语句的同时,使用数组依次为占位符指定具体的值 db.query(sqlStr,[student,student.cid],(err,results)=>{ if(err) return console.log(err.message) //失败 if(results.affectedRows === 1){ console.log('数据更新成功!') //成功 } })
结果为:
打开数据库,查看数据,即:
数据更新成功。
在删除数据时,最好根据 cid
这样的唯一标识,来删除对应的数据。示例如下:
//要执行的SQL语句 const sqlStr = 'DELETE FROM student WHERE cid=?' //调用db.query()执行sql语句的同时,为占位符指定确定的值 db.query(sqlStr,3,(err,results)=>{ if(err) return console.log(err.message) if(results.affectedRows === 1){ // 失败 console.log('删除数据成功!') //成功 } })
结果为:
打开数据库,查看数据,即:
删除数据成功。
需要注意的是:如果SQL语句有多个占位符,则必须为每个占位符指定具体的值,如果SQL语句只有一个占位符,则可以省略数组。
使用 DELETE
语句,会把真正的把数据从表中删除掉。为了保险起见,推荐使用标记删除的形式,来模拟删除的动作。
所谓的标记删除,就是在表中设置类似于 class_id
这样的状态字段,来标记当前这条数据是否被删除。
当用户执行了删除的动作时,我们并没有执行 DELETE
语句把数据删除掉,而是执行了 UPDATE
语句,将这条数据对应的class_id
字段标记为删除即可。
//标记删除:使用UPDATE语句代替DELETE语句;只更新数据的状态,并没有真正删除。 db.query('UPDATE student SET class_id=? WHERE cid=?',[1000,6],(err,results)=>{ if(err) return console.log(err.message) if(results.affectedRows === 1){ // 失败 console.log('标记删除成功!') //成功 } })
结果为:
打开数据库,查看数据,即:
标记删除成功。