• Nodejs -- 数据库基本概念的介绍及在Express中操作数据库


    1. 数据库的基本概念

    1.1 什么是数据库

    数据库(database)是用来组织、存储和管理数据的仓库。

    当今世界是一个充满着数据的互联网世界,充斥着大量的数据

    数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。

    为了方便管理互联网世界中的数据,就有了数据库管理系统的概念(简称:数据库)。用户可以对数据库中的数据进行新增、查询、更新、删除等操作。

    1.2 常见的数据库及分类

    市面上的数据库有很多种,最常见的数据库有如下几个:

    • MySQL数据库(目前使用最广泛、流行度最高的开源免费数据库;Community+Enterprise)
    • Oracle数据库(收费)
    • SQL Server数据库(收费)
    • Mongodb数据库(Community+Enterprise)

    其中,MySQL、Oracle、.SQL Server属于传统型数据库(又叫做:关系型数据库SQL数据库),这三者的设计理念相同,用法比较类似。

    而Mongodb属于新型数据库(又叫做:非关系型数据库或NoSQL数据库),它在一定程度上弥补了传统型数据库的缺陷。

    1.3 传统型数据库的数据组织结构

    数据的组织结构:指的就是数据以什么样的结构进行存储。

    传统型数据库的数据组织结构,与Excel中数据的组织结构比较类似。因此,我们可以对比着Excel来了解和学习传统型数据库的数据组织结构。

    1.3.1 Excel的数据组织结构

    每个Excel中,数据的组织结构分别为工作簿、工作表、数据行、列这4大部分组成。

    • 整个Excel叫做工作簿
    • users和books是工作表
    • users工作表中有3行数据
    • 每行数据由6列信息组成
    • 每列信息都有对应的数据类型

    image-20221129141033637

    1.3.2 传统型数据库的数据组织结构

    在传统型数据库中,数据的组织结构分为**数据库(database)、数据表(table))、数据行(row)、字段((field)**这4大部分组成。

    • 数据库类似于Excel的工作簿
    • 数据表类似于Excel的工作表
    • 数据行类似于Excel的每一行数据
    • 字段类似于Excel的列
    • 每个字段都有对应的数据类型

    1.3.3 实际开发中库、表、行、字段的关系

    • 在实际项目开发中,一般情况下,每个项目都对应独立的数据库。
    • 不同的数据,要存储到数据库的不同表中,例如:用户数据存储到usrs表中,图书数据存储到books表中。
    • 每个表中具体存储哪些信息,由字段来决定,例如:我们可以为users表设计id、username、password这3个字段。
    • 表中的行,代表每一条具体的数据,

    2. 在Express中操作MySQL

    2.1 在项目中操作数据库的步骤

    • 安装操作MySQL数据库的第三方模块(ysql)
    • 通过mysql模块连接到MySQL数据库
    • 通过mysql模块执行SQL语句

    image-20221129141557393

    2.2 安装与配置mysql模块

    2.2.1 安装ysql模块

    mysql模块是托管于npm上的第三方模块。它提供了在Node,js项目中连接和操作MySQL数据库的能力。

    想要在项目中使用它,需要先运行如下命令,将mysql安装为项目的依赖包:

    npm i mysql # 对于mysql5.x
    npm i mysql2 # 对于mysql8.x
    
    • 1
    • 2

    2.2.2 配置mysql模块

    // 导入mysql模块
    const mysql = require('mysql')
    
    // 建立与 MySQL数据库的连接
    const db = mysql.createPool({
        host: '127.0.0.1',
        user: 'root',
        password: 'root',
        database: 'nodejs-study' // 指定操作的数据库
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.2.3 测试mysql模块能否正常工作

    调用db.query()函数,指定要执行的SQL语句,通过回调函数拿到执行的结果:

    // 检测mysql模块能否正常工作
    db.query('SELECT 1', (err, results) => {
        if (err) return console.log(err.message)
    
        // 如果能打印出来 [ { '1': 1 } ] 说明没有问题
        console.log(results)
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.3 使用mysql模块操作MySQL数据库

    2.3.1 查询数据

    查询users表中的所有数据

    db.query('SELECT * FROM users', (err, results) => {
        if (err) return console.log(err.message)
    	// 打印结果
        console.log(results)
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果执行的是 select 查询语句,则执行的结果是数组

    image-20221129142920099

    2.3.2 插入数据

    插入新的用户信息

    通过affectedRows判断是否插入数据成功,如果是多行的话建议使用result.affectRows != 0

    const userInfo = {
        username: "sunliu",
        age: 19,
        gender: "男"
    }
    const sqlStr = 'INSERT INTO users VALUES (?, ?, ?)'
    
    db.query(sqlStr, [userInfo.username, userInfo.age, userInfo.gender], (err, result) => {
        if (err) return console.log(err.message)
        // 插入数据成功
        if (result.affectedRows === 1) {
            console.log("插入数据成功")
        }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.3.3 插入数据的便捷方式

    向表中新增数据时,如果数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速插入数据

    const userInfo = {
        name: "sunliu",
        age: 19,
        gender: "男"
    }
    const sqlStr = 'INSERT INTO users SET ?'
    
    db.query(sqlStr, userInfo, (err, result) => {
        if (err) return console.log(err.message)
        // 插入数据成功
        if (result.affectedRows === 1) {
            console.log("插入数据成功")
        }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    数据库表结构:

    image-20221129183324849

    2.3.4 更新数据

    可以通过如下方式,更新表中的数据:

    const userInfo = {
        name: "sunliu",
        age: 50,
        gender: "男"
    }
    const sqlStr = 'UPDATE users SET age=? WHERE name=?'
    
    db.query(sqlStr, [userInfo.age, userInfo.name], (err, result) => {
        if (err) return console.log(err.message)
        if (result.affectedRows === 1) {
            console.log("修改数据成功")
        }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.3.5 更新数据的便捷方式

    更新表数据时,如果数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速更新表数据:

    const userInfo = {
        name: "sunliu",
        age: 50,
        gender: "男"
    }
    const sqlStr = 'UPDATE users SET ? WHERE name=?'
    
    db.query(sqlStr, [userInfo, userInfo.name], (err, result) => {
        if (err) return console.log(err.message)
        if (result.affectedRows === 1) {
            console.log("修改数据成功")
        }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.3.6 删除数据

    在删除数据时,推荐根据d这样的唯一标识,来删除对应的数据。示例如下:

    const sql = 'delete from users where id=?'
    db.query(sql, id, (err, results) => {
        if (err) return console.log(err.message)
        if (result.affectedRows === 1) {
            console.log("删除数据成功")
        }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.3.7 标记删除

    • 使用DELETE语句,会把真正的把数据从表中删除掉。为了保险起见,推荐使用标记删除的形式,来模拟删除的动作
    • 所谓的标记删除,就是在表中设置类似于status这样的状态字段,来标记当前这条数据是否被删除
    • 当用户执行了删除的动作时,我们并没有执行DELETE语句把数据删除掉,而是执行了UPDATE语句,将这条数据对应的status字段标记为删除即可。
    db.query('update users set status=1 where id=?', 7, (err, results) => {
        if (err) return console.log(err.message)
        if (result.affectedRows === 1) {
            console.log("删除数据成功")
        }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    PHP 语法...的用法
    Django国际化与本地化指南
    [附源码]Java计算机毕业设计SSM动漫周边e商城
    嵌入式Linux应用开发-基础知识-第十九章驱动程序基石③
    基于JavaWeb(SSM框架)的网上书店的设计与实现
    颠覆与创新:探寻Facebook未来的发展路径
    初识多线程
    分布式消息队列(MQ)的应用场景
    【安装教程】vscode安装教程(超详细)
    WM 报错不含领货点存储类型的存储类型需要部分搁板管理
  • 原文地址:https://blog.csdn.net/qq_46311811/article/details/128104961