Node.js SQL数据库操作 (上)(操作MySQL数据库及 数据库连接池)
文章目录
- Node.js MySQL驱动
- 操作 MySQL 数据库
- 连接 MySQL 数据库
- 增删改查操作
- 防止 SQL 注入攻击
- 数据库连接池操作
Node.js MySQL驱动
Node.js的原生MySQL驱动库名为mysql
MySQL2项目是原生MySQL驱动项目的升级版本,兼容mysql并支持其主要特性,提供新的特性:
- 更快更好的性能
- 预处理语句
- 对编码和排序规则的扩展支持
- Promise包装器
- SSL与认证开关
- 自定义流
安装MySQL2 驱动(库名称为mysql2 ):
npm install mysql2
操作 MySQL 数据库
连接 MySQL 数据库
1、显式建立连接示例:
const mysql = require('mysql2');
//创建到数据库的连接
const connection = mysql.createConnection({host: 'localhost',user: 'root',password : 'abc123',database: 'testmydb'
});
connection.connect(function(err) {if (err) {console.error('连接错误: ' + err.stack);return;}console.log('连接ID:' + connection.threadId);
});
2、隐式建立连接示例:
var mysql = require('mysql2');
var connection = mysql.createConnection(...);//此处省略连接选项代码
connection.query('SELECT * FROM `bookinfo`',function(err, results) {console.log(results); // 结果包括由MySQL服务器返回的行
});
设置连接选项:
属性 | 描述 |
---|---|
host | 连接的数据库地址,默认为localhost |
port | 连接地址对应的端口,默认3306 |
user | 用于连接的MySQL用户名 |
password | 用户的密码 |
database | 所需连接的数据库的名称(可选项) |
charset | 连接的编码形式(默认为utf8_general_ci),决定整理排序规则 |
timezone | MySQL服务器上配置的时区(默认local) |
dateStrings | 将强制日期类型(TIMESTAMP、DATETIME或DATE)作为字符串返回 |
connectTimeout | 设置连接时,返回失败前的未响应等待时间 |
终止连接:
connection.end(function(err) { // 连接终止 }) ;
connection.destroy();
增删改查操作
1、查询记录:
第1种形式:.query(sqlString, callback)
const mysql = require('mysql2');
//建立连接
const connection = mysql.createConnection({host: 'localhost',user: 'root',password : 'abc123',database: 'testmydb'
});
connection.connect();
//执行查询操作
connection.query('SELECT * FROM `bookinfo` WHERE `press` = "人民邮电出版社"', function
(err, results, fields) {if (err) throw err;console.log('-------查询记录----------');console.log('查询结果:',results); console.log('查询结果字段:',fields);
});
connection.end(); //终止连接
第2种形式:.query(sqlString, values, callback)
connection.query('SELECT * FROM `bookinfo` WHERE `press` = ?', ['人民邮电出版社'],
function (err, results, fields) {});
第3种形式:.query(options, callback)
connection.query({'SELECT * FROM `bookinfo` WHERE `press` = ?',timeout: 40000, // 40秒values: ['人民邮电出版社']}, function (error, results, fields) {});
第2、3种结合:
connection.query({'SELECT * FROM `bookinfo` WHERE `press` = ?',timeout: 40000, // 40s},['人民邮电出版社'],function (err, results, fields) {);
只有单个占位符的查询:
connection.query('SELECT * FROM `bookinfo` WHERE `press` = ?', '人民邮电出版社',function (err, results, fields) {});
2、增加记录:
//此处省略建立连接代码
//定义增加记录的SQL语句和参数
var addSql = ' INSERT INTO `bookinfo`(`isbn`, `name`, `author`, `press`, `price`, `pubdate`) VALUES(?,?,?,?,?,?)';
var addSql_Params = ['9787115488435', '人工智能(第2版)','史蒂芬•卢奇','人民邮电出版社',108.00,'2018-09-01'];
//通过查询命令执行增加操作
connection.query(addSql,addSql_Params,function (err, results) {if (err) throw err;console.log('-------插入记录----------');console.log('插入记录的ID:',results.insertId);console.log('插入结果:',results);
});
connection.end();
3、修改记录:
//此处省略建立连接代码
//定义修改记录的SQL语句和参数
var updateSql = 'UPDATE bookinfo SET author = ?,price = ? WHERE id = ?';
var updateSql_Params = ['[日]结城浩',87.5,9];
//通过查询命令执行修改操作
connection.query(updateSql,updateSql_Params,function (err, result) {if (err) throw err;console.log('-------修改记录----------');console.log('修改所影响的行数:',result.affectedRows); console.log('修改所改变的行数:',result.changedRows);
});
connection.end();
4、删除记录:
//此处省略建立连接代码
//定义删除记录的SQL语句
var delSql = 'DELETE FROM bookinfo WHERE id = 11';
//通过查询命令执行删除操作
connection.query(delSql,function (err, result) {if (err) throw err;console.log('-------删除记录----------');console.log('删除的行数:',result.affectedRows);
});
connection.end();
防止 SQL 注入攻击
1、转义可以通过 mysql.escape( )、connection.escape( ) 或 pool.escape( ) 方法来实现。
var userId = 'some user provided value';
var sql = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);
connection.query(sql, function(err, results) {// ...
});
2、可以将符号?
作为查询字符串中的 占位符 以替代要转义的值。
connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) {// ...
});
流式查询:
var query = connection.query('SELECT * FROM posts');
query.on('error', function(err) {//处理错误,这之后会触发 'end' 事件}).on('fields', function(fields) {// 处理字段数据}).on('result', function(row) {connection.pause();//如果处理过程涉及到I/O操作,暂停连接会很有用processRow(row, function() {connection.resume();});}).on('end', function() {//所有行都已经接收完毕});
使用预处理语句:
connection.execute('SELECT * FROM 'table' WHERE 'name' = ? AND 'age' > ?',['Rick C-137', 53],function(err, results, fields) {console.log(results); }
);
数据库连接池操作
在开发web应用程序时,连接池 是一个很重要的概念。建立一个数据库连接所消耗的性能成本是很高的。在服务器应用程序中,如果为每一个接收到的客户端请求都建立一个或多个数据库连接,将严重降低应用程序性能。
在服务器应用程序中通常需要为多个数据库连接创建并维护一个连接池,当连接不再需要时,这些连接可以缓存在连接池中,当接收到下一个客户端请求时,从连接池中取出连接并重新利用,而不需要再重新建立连接
数据库对象和数据库连接池的使用方法对比:
1.创建数据库连接对象:
//导入mysql模块
const mysql = require('mysql2');//创建数据库连接对象
const connection = mysql.createConnection({host : 'localhost',port : 3306,user : 'root',password : '123',database : 'school'
})
2.将数据保存到数据库的方法:
function save(params) {connection.query('insert into student set?',{s_id:params.id,s_name:params.name,s_birthday:params.birthday,s_gender:params.gender},(err,result) => {if (err){console.log(err);return;}console.log('插入数据成功');console.log(result);//断开数据库连接connection.end();})
}
1.创建数据库连接池:
//导入mysql模块
const mysql = require('mysql2');
//创建数据库连接池
const pool=mysql.createPool({connectionLimit:20,host : 'localhost',port : 3306,user : 'root',password : '123',database : 'school',multipleStatements:true //是否允许一个query中有多个MySQL语句 (默认:false)}
);
2.将数据保存到数据库连接池方法:
function save(params) {pool.getConnection((err, connection) => {if (err) {console.log('连接数据库失败', err);return;}connection.query('insert into student set?', {s_id: params.id,s_name: params.name,s_birthday: params.birthday,s_gender: params.gender}, (err, result) => {if (err) {console.log(err);return;}console.log('插入数据成功');//释放数据库连接对象connection.release();})})
}
学习文章: Node.js SQL数据库操作 (下)(ORM框架、Sequelize模块及案例展示)
Node.js SQL数据库操作 (上)(操作MySQL数据库及 数据库连接池)相关推荐
- oracle 连接池sql跟踪,实现SQLServer、MySQL和oracle数据库连接池
1. org.apache.tomcat.dbcp.dbcp.SQLNestedException:Cannot load JDBC driver class 'com.mysql.jdbc.Driv ...
- Mysql数据库(三)——mysql数据库高级操作
Mysql数据库(三)--mysql数据库高级操作 一.指定主键的另一种方式 二.克隆/复制一个表 1.方法一 2.方法二 三.清空表,删除表内数据 1.方法一 2.方法二 3.方法三 4.三个删除方 ...
- spring aop 自定义注解配合swagger注解保存操作日志到mysql数据库含(源码)
spring aop 自定义注解保存操作日志到mysql数据库 一.思路 二.自定义注解 三.编写操作日志 四.编写操作日志切面\增强 五.使用 六.`注意` 一.思路 利用spring aop 对方 ...
- 墨者靶场-SQL手工注入漏洞测试(MySQL数据库-字符型)
0x00 前言 我们都知道,SQL注入分数字型和字符型,我们上次讲的是最基本的数字型SQL注入,这次我们就来讲最基本的字符型SQL注入.同样,如果是明白原理和方法的话,看懂这篇文章并不难,但是如果不清 ...
- windows 备份mysql_windows上备份mysql数据库
方案一:采用mysql自带的工具mysqldump. 脚本文件backup.bat如下: set "YMD=%date:~,4%%date:~5,2%%date:~8,2%" c ...
- 物联网平台搭建的全过程介绍(十)阿里云服务器ESC上安装MySQL数据库
目录 一.MySQL数据库简介 二.MySQL数据库安装 步骤1.运行以下命令更新YUM源 步骤2.运行以下命令安装MySQL 步骤3.运行以下命令查看MySQL版本号 三.MySQL数据库配置 步骤 ...
- Sql server 数据转到 Mysql 数据库
Sql server 数据转到 Mysql 数据库http://www.bieryun.com/3355.html 在网上找了一些方案,目前一个可行的较好的方案,虽然不够完美但也十分好用: 用到的用具 ...
- 墨者学院01 SQL手工注入漏洞测试(MySQL数据库)
问题描述 鉴于我已经两周没能成功运行攻防世界的靶场环境...于是昨天又搜了一些网站,感觉墨者学院的题目还可以~ SQL手工注入虽然是一个已经被安全博主讲烂的主题,但是我之前很少有从头到尾实践手工注入的 ...
- aws rds mysql 连接_python – 连接到amazon rds上的mysql数据库
我在 Windows 7机器上使用python的 MySQLdb模块,并尝试连接到Amazon RDS(SQL Server Express)上的远程数据库.这是我用来建立连接的简单连接方案,但它永远 ...
最新文章
- C语言自学《八》---- C语言知识总结
- When Cyber Security Meets Machine Learning 机器学习 安全分析 对于安全领域的总结很有用 看未来演进方向...
- 关于计算机的英语作文300,关于大学英语作文300字7篇
- DWZ关闭navTab后刷新指定的navTab
- erp系统方案书_解决方案 |快普M8为系统集成企业定制的ERP系统
- Teams App如何选择用户
- css3优惠卷上方锯齿_css3怎么实现锯齿边框?
- 【C++】随机函数的使用
- 二维高斯滤波器(gauss filter)的实现
- Dive into BERT:语言模型与知识
- java多线程-CountDownLatch
- log4cplus c++开源日志系统
- IoC框架(依赖注入 DI)
- mysql查询结果插入另外一张表
- SQL Server 2016 完全卸载(安装)全教程
- 科技文献检索(十三)——特种文献的检索与利用
- 入门力扣自学笔记96 C++ (题目编号749)
- 如何用计算机画地形地貌图,基本地形图计算软件(图号计算器)V2.1 最新版
- JAVAWEB-NOTE02
- 关于特殊后缀名如vue vm less等文件在DW中高亮显示并且代码提示的解决方案
热门文章
- 《趣学算法(第2版)》读书笔记 Part 1 :如何高效学习算法
- java语言的诞生日是_【logofree】JAVA语言诞生日百度LOGO在线制作
- Android 玻璃破碎效果
- problem: 记一次聊天框的表情包弹框不显示的找问题过程
- jetty maven plugs 中的配置:
- 电脑修改服务器时间,Windows 时间服务工具和设置
- DjangoQQ登录之定义QQ登录工具QQLoginTool(QQLoginTool介绍、QQLoginTool安装、QQLoginTool使用说明)
- 用txt阅读器按目录分章节阅读小说
- git切换到旧版本_Git版本切换
- 城市智能停车系统解决方案介绍