后端代码要实现对数据的存储、管理和维护,离不开工具数据库。
MySQL是市场上应用最广泛的开源免费数据库,非常建议学习。对于MySQL数据库介绍可以参考:安装教程,使用教程。本文的重点在express中远程使用数据库,用代码实现对MySQL中远程数据的增删改查。
若想在Node.js中操纵数据库MySQL,需要借助MySQL提供的官方包:mysql
① 安装第三方包mysql
npm install mysql
② 代码框架
// 1 引入mysql模块
const mysql = require('mysql');
// 2 配置连接信息
const connection = mysql.createConnection({
host: '127.0.0.1', // IP地址
user: 'root', // 用户名 默认root
password: 'admin123', // 自己在MySQL中设置的密码
database: 'my_db_01', // 数据库名字(不是表名)
})
// 3 建立连接
connection.connect( (err) => {
// 连接失败
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
// 连接成功
console.log('connected as id ' + connection.threadId);
});
// 4 增删改查
connection.query('SELECT 1 + 1 AS solution', (error, results, fields) => {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
// 5 断开连接
connection.end();
③ 增删改查
利用函数connection .query()
函数,第一个值为sql语句,可以采用?
占位,第二个值为数组(若只有一个,也可不写成数组),分别填充占位,第三个为回调函数。
const sqlStr = 'select ? from users where id = ?'
connection .query( sqlStr, [v1, v2], (err, results) => {} )
数据库my_db_01
中表users
的结构如下:id为主键,数字类型,唯一标识用户,在表中设置自增;status代表数据状态:0:未注销,1:注销,默认为0
查找语句SELECT somedata FROM tablename
// 查询users表中的数据
connection.query('SELECT * FROME users', (err, results) => {
if (error) {
console.log(error);
return;
}
console.log(results);
})
返回结果:数组
[
RowDataPacket { id: 1, username: 'new_name', password: '12345', status: 0 },
RowDataPacket { id: 2, username: 'ls', password: 'abc123', status: 0 },
RowDataPacket { id: 3, username: 'xh', password: '65321', status: 1 },
RowDataPacket { id: 4, username: 'kc', password: 'hwiquod', status: 1 }
]
不同写法:
INSERT INTO tablename(列名…) VALUES(列值)
INSERT INTO tablename SET 列1 = 值1, 列2 = 值2,…
const user = {username: 'ss', password: '123456'};
// 构造sql字符串
const sqlStr = 'INSERT INTO users SET?';
// 操作数据库
connection.query(sqlStr, user, (error, results) => {
if (error) {
console.log(error);
return;
}
if (results.affectedRows === 1) {
console.log('新增数据成功');
console.log(results);
}
})
返回的results:对象
OkPacket {
fieldCount: 0,
affectedRows: 1, // 被影响的列数目
insertId: 5,
serverStatus: 2,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0
}
UPDATE tablename SET 列1=值1 WHERE id = 1
const sqlStr = 'UPDATE users SET status = ? WHERE id = ?';
// 将id=2的用户状态设置为1
connection.query(sqlStr, [1, 2], (error, results) => {
if (error) {
console.log(error);
return;
}
if (results.affectedRows === 1) {
console.log('删除数据成功');
console.log(results);
}
返回results:对象
OkPacket {
fieldCount: 0,
affectedRows: 1,
insertId: 0,
serverStatus: 2,
warningCount: 0,
message: '(Rows matched: 1 Changed: 0 Warnings: 0',
protocol41: true,
changedRows: 0
}
DELETE FROM tablename WHERE ...
const sqlStr = 'DELETE FROM users WHERE id = ?';
// 删除id=1的用户数据
connection.query(delsql, 1, (err, results) => {
if(err) return console.log(err);
if(results.affectedRows === 1 ){
console.log('删除数据成功');
console.log(results);
}
})
返回results:对象
OkPacket {
fieldCount: 0,
affectedRows: 1,
insertId: 0,
serverStatus: 2,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0
}
① 一般不删除,删除了用户再想恢复怎么办。所以一般增加一个status字段,来标识用户状态,达到“虚假删除”的目的
② 一定要写where子语句,特别是在更新和删除表时,不写默认对所有行进行操作,会造成严重的后果。