1.查询数据

你可以按以下方式,通过连接对象 db.query() 方法来发起查询:

  1. // const db = mysql.createPool({...options})
  2. // 查询 user表中的所有数据
  3. db.query('select * from user', (err, results) => {
  4. // 查询失败
  5. if (err) return console.log(err);
  6. // 查询成功
  7. // 注意:如果执行的是 select 查询语句,则返回结果是一个数组
  8. console.log(results);
  9. })

注意:如果执行的是 select 查询语句,则返回结果是一个数组

2.插入数据

你可以在构造插入语句时使用问号? 作为占位符(和其他编程语言一样)。然后你可以在 db.query() 方法的第二个参数中,以数组的方式依次替换占位符,只能是数组变量。
然后,如果插入成功,你可以通过results对象的affectedRows属性,来判断是否执行成功。

  1. // 01 定义要插入到user表中的数据对象
  2. const user = { username: 'xiaoming', id: 2 }
  3. // 02 定义待执行的 SQL 语句, 其中 ? 表示占位符 (和java一样)
  4. const sqlStr = 'insert into use (username, id) values (?, ?)'
  5. // 03 使用数组的形式,在query方法的第二个参数,依次为 ? 占位符指定具体的值
  6. db.query(sqlStr, [user.username, user.id], (err, results) => {
  7. // 执行失败
  8. if(err) return console.log(err.message);
  9. // 执行成功
  10. // 注意:如果执行的是 insert 插入语句,则 results是一个对象 可以通过affectedRows属性判断是否插入成功。
  11. //可以用resulte中的影响行数(affectedRows)属性来判断是否插入成功
  12. // console.log(results);
  13. if(results.affectedRows === 1) console.log('插入成功');
  14. })

注意:如果执行的是 insert 插入语句,则 results是一个对象,可以通过affectedRows属性判断是否插入成功。

插入数据的便捷(对象)方法

如果一行数据的属性很多,那么在构造sql语句的时候就要写很多占位符了,这是很麻烦的,所以有了便捷方法:
image.png
其中 set 表示用一个集合来插入数据,前提是集合中的每个属性都与数据表中的列名一一对应(除了非空和必须),可空的属性可以不写。才可用快捷方式。而且不用数组方式,直接JS对象方式。

  1. // 插入数据的便捷方式
  2. const userInfo = { username: 'xiaohong', id: 4 }
  3. // 02 定义待执行的 SQL 语句, 其中 set 表示用一个集合作为插入数据,在JS中就是对象
  4. const sqlStr = 'insert into user set ?'
  5. // 03 使用对象的形式,在query方法的第二个参数,为 ? 占位符指定具体的对象
  6. db.query(sqlStr, userInfo, (err, results) => {
  7. // 执行失败
  8. if (err) return console.log(err.message);
  9. // 执行成功
  10. if (results.affectedRows === 1) console.log('插入成功');
  11. })

3.更新数据

可以通过如下方式,更新数据,也是使用query方法。在第二个参数提供数组数据。

  1. // 01 定义要更新的数据对象
  2. const user = { id: 2, username: 'chongchong', password: '123' }
  3. // 02 定义待执行的 SQL 语句, 其中 ? 表示占位符 (和java一样)
  4. const sqlStr = 'update user set username = ?, password = ? where id = ?'
  5. // 03 使用数组的形式,在query方法的第二个参数,依次为 ? 占位符指定具体的值
  6. db.query(sqlStr, [user.username, user.password, user.id], (err, results) => {
  7. // 执行失败
  8. if(err) return console.log(err.message);
  9. // 执行成功
  10. // 注意:如果执行的是 update 更新语句,则 results 是一个对象
  11. if(results.affectedRows === 1) console.log(`成功更新${results.affectedRows}条数据`);
  12. })

注意:如果执行的是 update 更新语句,则 results也是一个对象 可以通过affectedRows属性判断是否插入成功。

更新数据的便捷方式

得益于sql语句的功能性,更新也可以像插入一样,通过 SET 关键字来指定一个对象作为更新数据。

  1. // 更新数据的便捷方式
  2. const user = { id: 2, username: 'chongchong', password: '123456' }
  3. // 定义待执行的 SQL 语句, 通过set关键字 指定一个对象作为更新数据
  4. const sqlStr = 'update user set ? where id = ?'
  5. // 注意:由于还是有多个占位符,所以仍然要使用数组的形式,在第二个参数,依次为 ? 占位符指定具体数据
  6. db.query(sqlStr, [user, user.id], (err, results) => {
  7. // 执行失败
  8. if(err) return console.log(err.message);
  9. // 执行成功
  10. if(results.affectedRows === 1) console.log(`成功更新${results.affectedRows}条数据`);
  11. })

注意:只要sql语句中有多个占位符,就必须使用数组的形式来依次为 ? 占位符指定具体数据,sql语句中 set关键字 后的 ? 可以是一个对象。

4.删除数据

看来mysql模块的增删改查都是用query方法的,只是 sql 语句不同而已,和python一样呢。
在删除数据时,建议以主键作为唯一标识,来删除对应的数据:

  1. // 定义待执行的 SQL 语句
  2. const sqlStr = 'delete from user where id = ?'
  3. // 注意:只要有多个占位符,就必须使用数组形式提供参数,依次为 ? 占位符指定具体数据。
  4. // 如果只有一个占位符, 则可以无视数组
  5. db.query(sqlStr, 2, (err, results) => {
  6. // 执行失败
  7. if(err) return console.log(err.message);
  8. // 执行成功
  9. if(results.affectedRows === 1) console.log(`成功删除${results.affectedRows}条数据`);
  10. console.log(results);
  11. })

注意:注意:只要有多个占位符,就必须使用数组形式提供参数,依次为 ? 占位符指定具体数据。
如果只有一个占位符, 则可以无视数组。

5.标记删除(伪删除/软删除/回收站机制)

使用 delete 语句,会把数据真正的从数据库中删掉,这实际上是不安全的,用户的误操作可能会摧毁整个数据库。为了保险起见,推荐使用标记删除的形式,来模拟删除的操作
所谓标记删除,其实就是一个伪删除操作,现在通常都是加 is_activestatus 这样的状态字段进行判断,来标记当前这条数据是否被视为删除,比如为0表示删除。类似文件系统的回收站机制。是可恢复的。
当用户执行删除操作时,我们使用 update 语句来代替delete,将这条数据的 is_active 或 status 标记为删除即可。在真正需要从数据库中移除数据时再使用 delete 。

  1. // 标记删除(伪删除/回收站机制)
  2. // 将 delete改为 update,只修改删除标记,来将该数据视为被删除的状态,类似回收站机制,是可恢复也可彻底删除的
  3. // 本例中 is_active 标记为0是视为删除
  4. const sqlStr = 'update user set is_active = ? where id = ?'
  5. db.query(sqlStr, [0, 1], (err, results) => {
  6. // 执行失败
  7. if (err) return console.log(err.message);
  8. // 执行成功
  9. if (results.affectedRows === 1) console.log(`成功删除${results.affectedRows}条数据`);
  10. })

查询数据表删除前后的状态:

  1. //删除前 删除标记为1
  2. mysql> select * from user;
  3. +----+----------+----------+-----------+
  4. | id | username | password | is_active |
  5. +----+----------+----------+-----------+
  6. | 1 | xiaohong | 123 | 1 |
  7. +----+----------+----------+-----------+
  8. 1 row in set (0.00 sec)
  9. //删除后 删除标记为0
  10. mysql> select * from user;
  11. +----+----------+----------+-----------+
  12. | id | username | password | is_active |
  13. +----+----------+----------+-----------+
  14. | 1 | xiaohong | 123 | 0 |
  15. +----+----------+----------+-----------+
  16. 1 row in set (0.00 sec)