请注意,本文编写于 820 天前,最后修改于 820 天前,其中某些信息可能已经过时。
在项目中操作MySQL数据库
- 安装操作MySQL数据库的第三方模块(mysql)
- 通过mysql模块连接到MySQL数据库
- 通过mysql模块执行SQL语句
安装mysql模块
mysql模块时托管于npm的第三方模块,通过终端输入下面的命令安装
npm i mysql
配置mysql模块
在使用mysql模块操作数据库之前,必须先进行必要的配置:
// 导入mysql模块
const mysql = require('mysql')
// 建立与MySQL数据库的连接
const db = mysql.createPool({
host:'127.0.0.1',
user:'root',
password:'123',
database:'test'
})
测试mysql模块是否能正常工作
调用db.query()函数,指定要执行的SQL语句,通过回调函数拿到执行的结果:
db.query('SELECT 1', (err, results) => {
if (err) return console.log(err.message)
// 只要能打印出[ RowDataPacket { '1': 1 } ]的结果,就说明连接正常
console.log(results)
})
利用mysql模块进行增删改查
查询数据
// 查询users表中所有的用户数据
const sqlStr = 'SELECT * FROM users'
db.query(sqlStr, (err, results) => {
// 查询失败
if (err) return console.log(err.message)
// 查询成功
console.log(results)
})
插入数据
向users表中新增数据,其中username为sb,password为sb123,示例代码如下
// 要插入到users表中的数据对象
const user = { username:'sb', password:'sb123' }
// 待执行的SQL语句,其中英文的?代表占位符
// 占位符的作用:防止SQL注入、方便复用等
const sqlStr = 'SELECT * FROM users'
// 使用数组的形式,依次为?占位符指定具体的值
db.query(sqlStr, [user.username, user.password], (err, results) => {
// 查询失败
if (err) return console.log(err.message)
// 查询成功
// 如果执行的是insert into插入语句,则result是一个对象
// 可以通过affectRows属性,来判断是否插入数据成功
if (results.affectedRows === 1) {
console.log('插入成功!')
}
})
插入数据的便捷方式
向表中新增数据时,如果数据对象的每个属性和数据表字段一一对应,则可以通过如下方式快速插入数据:
// 要插入到users表中的数据对象
const user = { username:'sb2', password:'sb123' }
// 待执行的SQL语句,其中?代表占位符
const sqlStr = 'INSERT INTO users SET ?'
// 执行SQL语句
db.query(sqlStr, user, (err, results) => {
if (err) return console.log(err.message)
if (results.affectedRows === 1){
console.log('插入数据成功')
}
})
更新数据
// 要更新的数据对象
const user = { id:1, username:'sb3', password:'sb123' }
// 待执行的SQL语句,其中?代表占位符
const sqlStr = 'UPDATE users SET username=?, password=? WHERE id=?'
// 执行SQL语句
db.query(sqlStr, [user.username, user.password, user.id], (err, results) => {
if (err) return console.log(err.message)
// 执行了update语句之后,执行的结果也是一个对象,可以通过affectedRows判断是否成功
if (results.affectedRows === 1){
console.log('插入数据成功')
}
})
更新数据的便捷方式
// 要更新的数据对象
const user = { id:1, username:'sb3', password:'sb123' }
// 待执行的SQL语句,其中?代表占位符
const sqlStr = 'UPDATE users SET ? WHERE id=?'
// 执行SQL语句
db.query(sqlStr, [user, user.id], (err, results) => {
if (err) return console.log(err.message)
if (results.affectedRows === 1){
console.log('插入数据成功')
}
})
删除数据
在删除数据时,推荐根据id这种唯一的标识来删除
// 待执行的SQL语句,其中?代表占位符
const sqlStr = 'DELETE FROM users WHERE id=?'
// 执行SQL语句
// 如果SQL语句中有多个占位符,则需要使用数组为每个占位符指定具体的值
// 如果SQL语句中只有一个占位符,则可以省略数组
db.query(sqlStr, 7, (err, results) => {
if (err) return console.log(err.message)
if (results.affectedRows === 1){
console.log('插入数据成功')
}
})
标记删除(伪删除)
使用DELETE语句,会真正的把数据从表中删除掉,为了保险起见,推荐使用标记删除的形式,来模拟删除的动作
所谓的标记删除,就是在表中设置类似与status这样的状态字段,来标记当前这条数据是否被删除(伪删除)
当用户执行了删除的动作时,我们并没有执行DELETE语句把数据删除掉,而是执行了UPDATE语句,将这条数据对应的status字段标记为删除即可
const sqlStr = 'UPDATE users SET status=? WHERE id=?'
db.query(sqlStr, [1, 6], (err, results) => {
if (err) return console.log(err.message)
if (results.affectedRows === 1){
console.log('标记删除数据成功')
}
})