node连接MySQL数据库的3种方式总结

 更新时间:2022年08月08日 09:26:01   作者:RingCode  
现在前端基本上都会用一些NodeJs,想必也想自己写一些API或者个人博客的后台系统,这些就离不开连接数据库的问题,下面这篇文章主要给大家介绍了关于node连接MySQL数据库的3种方式,需要的朋友可以参考下

以下我们将说明node连接数据库的三种方式,并进行利弊说明,以挑选出最适合项目的连接方式。

1.使用mysql包的提供的接口进行连接

例如:

connection.query('SELECT * FROM users WHERE id = ?', ['123'], function(err, rows) {
    if (err) {
        // error
    } else {
        for (let row in rows) {
            processRow(row);
        }
    }
});

这种方法较为底层,且每次操作数据库都需要新建数据库连接,若数据库操作需求多,对服务器消耗较大,因此,可以使用第二种连接方式。

2.建立数据库连接池

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。

通俗的理解就是: 数据库连接池是程序启动时建立足够数量的数据库连接对象,并将这些连接对象组成一个池,由程序动态的对池中的连接对象进行申请、使用和释放。

优点

1.避免应用程序频繁的连接、断开数据库

2.提供数据库连接对象的使用频率。

创建方式

1.创建连接池

mysql.createPool(config) 
    host:数据库服务器的地址
    port: 端口号
    user:连接数据库的用户名
    password:连接数据库的密码
    database:数据库名
    connectionLimit:用于指定连接池中最大的链接数,默认属性值为10.
    multipleStatements :是否允许执行多条sql语句,默认值为false

2.从连接池获取一个连接

连接池名.getConnection(function(err,connection){
    执行的代码
})
 
//参数err:错误对象。连接失败后的错误信息
//参数connection:连接对象。若连接失败,它就是undefined

3.释放连接对象(将连接对象放回连接池): connection.release()

4.从连接池中移除连接对象: connection.destory()

5.关闭该连接池: 连接池名.end();

3.数据库访问中的ORM——sequelize模块 ORM

考虑到数据库表是一个二维表,包含多行多列,每一行可以用一个JavaScript对象表示。这就是传说中的ORM技术:Object-Relational Mapping(对象关系映射),把关系数据库的表结构映射到对象上。

ORM的特点:

  • 可以提高开发的效率
  • 不用直接写SQL语句 sequelize

基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环境中,易于使用,支持多SQL方言(dialect)。它当前支持MySQL、MariaDB、SQLite、PostgreSQL、Sql Server 数据库。

sequelize的特点:

强大的模型定义,支持虚拟类型。
支持完善的数据验证,减轻前后端的验证压力。
Sequelize的查询非常全面和灵活。

sequelize的使用

  • 安装sequelize:npm install sequelize 必须先安装mysql的驱动模块(npm install mysql)
  • 连接数据库:创建sequelize的对象
//导入mysql模块
const mysql = require('mysql2');
//导入sequelize模块
const Sequelize = require('sequelize');
//创建sequelize对象,参数分别为:数据库名称,数据库类型,密码,配置
var MySequelize = new Sequelize('spj','root','929TJ813',{
    host:'localhost',
    port:3306,
    dialect:'mysql',   //数据库类型
    pool:{  //数据库连接池
        max:20,  //最大连接对象的个数
        min:5,  //最小连接对象的个数
        idle:1000  //最长等待时间,单位为毫秒
    }
})
module.exports = MySequelize ;   //导出创建的sequelize对象

创建数据模型:数据模型是一个类,对应的是数据库中一张表

const Sequelize =require('sequelize')
const MySequesize = require('../config/dbconfig');  //导入创建的sequelize对象
//创建StudentModel模型,该模型对应的表名是student
var StudentModel = MySequesize.define('users',{
    sid:{
        type:Sequelize.INTEGER,  //表示属性的数据类型
        field:'s_id',   //属性对应的列名,若不定义field则表中的列名(sid)就是属性名
        primaryKey:true,  //表示主键
        autoIncrement:true  //表示主键自增
    },
    sname:{
        type:Sequelize.STRING(50),
        field: 's_name',
        allowNull:false,   //表示当前列是否允许为空,false表示该列不能为空
        //unique:true    //表示该列的值必须唯一
    },
    sgender:{
        type:Sequelize.STRING(4),
        field:'s_gender',
        allowNull: false
    },
    sbirthday:{
        type:Sequelize.DATE,
        field:'s_birthday',
        allowNull:false
    },
    saddress:{
        type:Sequelize.STRING(100),
        field:'s_address',
        allowNull:false
    },
    sage:{
        type:Sequelize.INTEGER,
        field:'s_age',
        allowNull:false
    }
},{
    freezeTableName:true, //true表示使用给定的表名,false表示模型名后加s作为表名
    timestamps:false  //true表示给模型加上时间戳属性(createAt、updateAt),false表示不带时间戳属性
})
//同步数据库,force的值为false,表若存在则先删除后创建,force的值为true表示表若存在则不创建
var users = StudentModel.sync({force:false});
 
module.exports = StudentModel;   //导出模型

使用sequelize实现增删改查 。

const StudentModel = require('../../db/model/StudentModel');
const Sequelize = require('sequelize')
//插入数据
StudentModel.create({
    sname:'关羽',
    sgender:'男',
    sbirthday:'1998-12-28',
    saddress:'陕西宝鸡'
}).then(result=>{
    console.log("插入成功!",result);
}).catch(err=>{
    console.log("插入失败!",err);
})
 
//查询数据
StudentModel.findAll({
    raw:true   //查询出来只有需要的数据,没有别的内容
}).then(data=>{
    console.log(data);
})
 
//删除记录
StudentModel.destroy({
    where:{
        sid:2
    }
}).then(result=>{
    console.log("删除成功!",result)
}).catch(err=>{
    console.log("删除失败!",err);
})
 
//更新记录
StudentModel.findOne({
    where:{
        sid:3
    }
}).then(users=>{
    users.update({
        sname:'张飞',
        sgender:'男'
    }).then(result=>{
        console.log("更新成功!",result)
    }).catch(err=>{
        console.log("更新失败!",err);
    })
}).catch(error=>{
    console.log("查无此人!",error);
})
 
//查询部分字段
StudentModel.findAll({
    attributes:['sname','saddress'],
    raw:true
}).then(result=>{
    console.log(result);
}).catch(err=>{
    console.log(err);
})
 
//聚合函数
StudentModel.findAll({
    attributes:[[Sequelize.fn('COUNT',Sequelize.col('s_id')),"记录总数"]],  //col里面必须放的是列名
    raw:true
}).then(result=>{
    console.log(result)
})

使用sequelize实现模糊查询等内容。

const StudentModel = require('../../db/model/StudentModel');
const Op = require('sequelize').Op;   //引入sequelize模块的Op操作符
 
//模糊查询
StudentModel.findAll({
    where:{
        sname:{
            [Op.like]:'张%'
        }
    },
    raw:true
}).then(result=>{
    console.log(result);
})
 
//between:查询年龄在12到18之间的人的信息
StudentModel.findAll({
    where:{
        sage:{
            [Op.between]:[12,18]
        }
    },
    raw:true
}).then(result=>{
    console.log(result);
})
 
//in:查询地址是'陕西西安‘和'陕西商洛‘的记录
StudentModel.findAll({
    where:{
        saddress:{
            [Op.in]:['陕西西安','陕西商洛']
        }
    },
    order:[
      ['sage','desc']   //查询结果按照sage的降序排列
    ],
    raw:true
}).then(result=>{
    console.log(result);
})
 
//and和or:查询性别为'男‘,并且地址是‘陕西宝鸡'的记录
StudentModel.findAll({
    where:{
        [Op.and]:[   //把and改为or即为或时间
            {
                sgender:{
                    [Op.eq]:'男'
                }
            },
            {
                saddress:{
                    [Op.eq]:'陕西宝鸡'
                }
            }
        ]
    },
    raw:true
}).then(result=>{
    console.log(result);
})
 
//limit和offset:分页查询
StudentModel.findAll({
    limit:3,   //查询的记录数
    offset:1,  //从索引值为几的记录开始查询(查询的起始位置),所有数据的索引值从0开始
    raw:true
}).then(result=>{
    console.log(result);
})

参考链接:https://www.jb51.net/article/258390.htm

总结

到此这篇关于node连接MySQL数据库的3种方式的文章就介绍到这了,更多相关node连接MySQL内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解nodejs微信公众号开发——6.自定义菜单

    详解nodejs微信公众号开发——6.自定义菜单

    这篇文章主要介绍了详解nodejs微信公众号开发——6.自定义菜单,自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。
    2017-04-04
  • Node.js+Express+Mysql 实现增删改查

    Node.js+Express+Mysql 实现增删改查

    这篇文章主要介绍了Node.js+Express+Mysql 实现增删改查,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 详解离线安装npm包的几种方法

    详解离线安装npm包的几种方法

    这篇文章主要介绍了详解离线安装npm包的几种方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Node.js系列之发起get/post请求(2)

    Node.js系列之发起get/post请求(2)

    这篇文章主要为大家详细介绍了Node.js系列之发起get/post请求,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • node.js入门教程

    node.js入门教程

    这篇文章主要介绍了node.js入门教程,讲解了node.js在linux和windows下的安装,模块的概念,NPM的使用等等,是一篇不错的nodejs入门文章,需要的朋友可以参考下
    2014-06-06
  • 浅析node应用的timing-attack安全漏洞

    浅析node应用的timing-attack安全漏洞

    本篇文章给大家通过原理的原因分析了node应用的timing-attack安全漏洞问题,有兴趣的朋友阅读参考下。
    2018-02-02
  • nodejs对项目下所有空文件夹创建gitkeep的方法

    nodejs对项目下所有空文件夹创建gitkeep的方法

    这篇文章主要介绍了nodejs对项目下所有空文件夹创建gitkeep的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 使用Node.js实现RESTful API的示例

    使用Node.js实现RESTful API的示例

    Node.js可以用很少代码简单地实现一个Web服务,并且它有一个非常活跃的社区,通过Node出色的包管理机制(NPM)可以非常容易获得各种扩展支持。 对简单的应用场景Node.js实现REST是一个非常合适的选择。 本文介绍如何用Node.js实现REST服务。
    2017-08-08
  • koa2 数据api中间件设计模型的实现方法

    koa2 数据api中间件设计模型的实现方法

    这篇文章主要介绍了koa2 数据api中间件设计模型的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 浅谈node中的exports与module.exports的关系

    浅谈node中的exports与module.exports的关系

    本篇文章主要介绍了浅谈node中的exports与module.exports的关系,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08

最新评论