Node使用MySQL

Posted 小小白学计算机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node使用MySQL相关的知识,希望对你有一定的参考价值。

一、认识mysql2

如何可以在Node的代码中执行SQL语句来,这里我们可以借助于两个库:

  1. mysql:最早的Node连接MySQL的数据库驱动;
  2. mysql2:在mysql的基础之上,进行了很多的优化、改进;目前相对来说,我更偏向于使用mysql2,mysql2兼容mysql的API,并且提供了一些附加功能
  • 更快/更好的性能;
  • Prepared Statement(预编译语句):

提高性能:将创建的语句模块发送给MySQL,然后MySQL编译(解析、优化、转换)语句模块,并且存储它但是不执行,之后我们在真正执行时会给?提供实际的参数才会执行;就算多次执行,也只会编译一次,所以性能是更高的;

防止SQL注入:之后传入的值不会像模块引擎那样就编译,那么一些SQL注入的内容不会被执行;or 1 = 1不会被执行;

  • 支持Promise,所以我们可以使用async和await语法

所以后续的学习中会选择mysql2在node中操作数据。

二、使用mysql2

  1. 安装mysql2
  2. mysql2的使用过程如下:
    第一步:创建连接(通过createConnection),并且获取连接对象;

第二步:执行SQL语句即可(通过query);

const mysql = require('mysql2')

// 1. 创建数据库连接
const connection = mysql.createConnection({
    host: 'localhost',
    port: 3306,
    database: 'coderhub',
    user: 'root',
    password: 'root'
})

// 2. 执行sql语句
const statement = `select * from products where price > 9000`
connection.query(statement, (err, results, fields) => {
    // console.log(err)
    console.log(results)
    // console.log(fields)
    // connection.end()
    connection.destroy()
})

三、Prepared Statement

Prepared Statement(预编译语句):

  1. 提高性能:将创建的语句模块发送给MySQL,然后MySQL编译(解析、优化、转换)语句模块,并且存储
    它但是不执行,之后我们在真正执行时会给?提供实际的参数才会执行;就算多次执行,也只会编译一次,所
    以性能是更高的;
  2. 防止SQL注入:之后传入的值不会像模块引擎那样就编译,那么一些SQL注入的内容不会被执行;or 1 = 1不
    会被执行;


强调:如果再次执行该语句,它将会从LRU(Least Recently Used) Cache中获取获取,省略了编译statement的时间来提高性能。

四、Connection Pools

前面我们是创建了一个连接(connection),但是如果我们有多个请求的话,该连接很有可能正在被占用,那么我们是否需要每次一个请求都去创建一个新的连接呢?

  1. 事实上,mysql2给我们提供了连接池(connection pools);
  2. 连接池可以在需要的时候自动创建连接,并且创建的连接不会被销毁,会放到连接池中,后续可以继续使用;
  3. 我们可以在创建连接池的时候设置LIMIT,也就是最大创建个数;


五、Promise方式

目前在javascript开发中我们更习惯Promise和await、async的方式,mysql2同样是支持的:

六、认识ORM

对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计的方案:

  • 从效果上来讲,它提供了一个可在编程语言中,使用 虚拟对象数据库 的效果;
  • 比如在Java开发中经常使用的ORM包括:Hibernate、MyBatis;

Node当中的ORM我们通常使用的是 sequelize;

  • Sequelize是用于Postgres,MySQL,MariaDB,SQLite和Microsoft SQL Server的基于Node.js 的 ORM;
  • 它支持非常多的功能;

如果我们希望将Sequelize和MySQL一起使用,那么我们需要先安装两个东西:

  • mysql2:sequelize在操作mysql时使用的是mysql2;
  • sequelize:使用它来让对象映射到表中;

npm install sequelize mysql2

七、Sequelize的使用

Sequelize的连接数据库:

  1. 第一步:创建一个Sequelize的对象,并且指定数据库、用户名、密码、数据库类型、主机地址等;
  2. 第二步:测试连接是否成功;

八、Sequelize映射关系表




const { Sequelize, DataTypes, Model, Op } = require('sequelize')
const sequelize = new Sequelize('coderhub', 'root', 'root', {
    host: 'localhost',
    dialect: 'mysql'
})
class Product extends Model {}
Product.init({
    id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
    },
    title: {
        type: DataTypes.STRING,
        allowNotNull: false
    },
    price: DataTypes.DOUBLE,
    score: DataTypes.DOUBLE
}, {
    tableName: 'products',
    createdAt: false,
    updatedAt: false,
    sequelize
})
async function queryProducts() {
    // 1. 查询数据库中products表中的所以内容
    /*const result = await Product.findAll({
        where: {
            price: {
                [Op.gte]: 9000
            }
        }
    })
    console.log(result)*/

    // 2. 插入数据
    /*const result = await Product.create({
        title: '三星zep',
        price: 99999,
        score: 10
    })
    console.log(result)*/

    const result = await Product.update({
        price: 3333
    }, {
        where: {
            id: 1
        }
    })
    console.log(result)
}
queryProducts()

九、Sequelize 一对多关系


十、Sequelize多对多关系



以上是关于Node使用MySQL的主要内容,如果未能解决你的问题,请参考以下文章

vscode代码片段建议bug

使用 json rereiver php mysql 在片段中填充列表视图

部分代码片段

Apollo Codegen 没有找到生成代码的操作或片段

澄清 node.js + promises 片段

node 片段