• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >JavaScript > 从零学习node.js之mysql数据库的操作(五)

从零学习node.js之mysql数据库的操作(五)

作者:Wenzi 字体:[增加 减小] 来源:互联网 时间:2017-05-11

Wenzi通过本文主要向大家介绍了从零学习node.js之mysql数据库的操作(五)等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

准备工作

在使用node操作mysql数据库时,需要先下载mysql模块:

npm install mysql --save-dev
</div>

在引入mysql模块后,就可以进行数据库的连接和其他的操作了。

// test.js
var mysql = require('mysql');
</div>

一、连接数据库

首先保证本地已经安装数据库,并已正常启动,然后开始进行连接:

// test.js
var mysql = require('mysql');

// 创建连接
var conn = mysql.createConnection({
 host : '127.0.0.1',
 user : 'root',
 password : '123',
 database : 'test'
});

// 创建连接后不论是否成功都会调用
conn.connect(function(err){
 if(err) throw err;
 console.log('connect success!');
});

// 其他的数据库操作,位置预留

// 关闭连接时调用
conn.end(function(err){
 if(err) throw err;
 console.log('connect end');
})
</div>

执行node test.js后,就会输出:

$ node test.js
connect success!
connect end
</div>

连接成功,然后连接关闭。这就说明程序可以正常连接数据库了,然后就开始进行增删改查的操作。

二、CURD

比如我们有这样的一个user表,里面有4个字段,其中uid是自增字段:

uid username password email
1 meizi meizi 123@qq.com
2 test test 456@qq.com

我们就对这个表进行增删改查的操作。

mysql中有个query方法可以用来执行任意正确的sql语句,然后在回调函数里给出执行sql语句后的结果。query方法是异步执行的,若并列书写多个query方法的话,是不能按照书写顺序依次阻塞式执行的。

2.1 查询

使用最普遍最多的就是查询操作了。

conn.query('SELECT * FROM `user`', function(err, result, fields){
 if(err) throw err;
 console.log(result);
});
console.log( 'select ended!' );
</div>

输出的结果:

select ended! // 先输出

[
 RowDataPacket {   
 uid: 1,   
 username: 'meizi',  
 password: 'meizi
 email: '123@qq.com'
 }, 
 RowDataPacket {   
 uid: 2,   
 username: 'test',  
 password: 'test
 email: '456@qq.com'
 }
]
</div>

可以看到,结果集是一个数组,数组中的每条数据都是一个RowDataPacket对象,在使用时,可以像json对象一样获取数据,也可以使用JSON.stringify把result转换为json字符串,但是,result并不是JSON数据。而且,即使结果集中只有一条数据,也是以数组的形式返回的。

console.log(result[0].username); // meizi 
</div>

输出即为字符串类型的数据。

2.2 添加

向数据库中添加数据使用的是INSERT,INSERT语句有两种形式都可以使用:

第1种,先列好要插入的数据对应的字段,然后跟上数据(如果要给所有的字段都插入数据,可以省略字段不写,但是数据的书写顺序要跟数据表里的字段一一对应):

INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
</div>

第2种,可以像update操作一样书写,将field与value对应的更紧密:

INSERT INTO table_name SET field1=value1, field2=value2, ... fieldN=valueN;
</div>

我更加喜欢第2种方式,这种方式更能看出操作了哪些字段,看出字段和数据的对应关系。在node中插入数据:

conn.query("INSERT INTO `user` SET `username`='qwerty', `password`='741', `email`='qwerty@qq.com'", function(err, result){
 if(err) throw err;
 console.log(result);
});
</div>

插入数据后返回的结果是:

OkPacket {    
 fieldCount: 0,  
 affectedRows: 1,
 insertId: 4, // 数据插入成功时,对应的主键id
 serverStatus: 2,  
 warningCount: 0,  
 message: '',   
 protocol41: true,  
 changedRows: 0
 }
</div>

affectedRows表示数据表中受影响的行数,数据插入成功则为1,失败则为0;在主键自增的情况下,insertId是数据插入成功后对应的主键id,如果主键不自增,则insertId为0。

2.3 更新

使用update语句更新数据:

// 更新uid的密码
conn.query('UPDATE `user` SET `password`="123456" WHERE `uid`=4', function(err, result){
 if(err) throw err;
 console.log(result);
});
</div>

输出的结果:

OkPacket {
 fieldCount: 0,
 affectedRows: 1,
 insertId: 0,
 serverStatus: 2,
 warningCount: 0,
 message: '(Rows matched: 1 Changed: 1 Warnings: 0',
 protocol41: true,
 changedRows: 1
 }
</div>

可以看到输出结果的类型与插入数据时输出结果的类型是一样的。我们分析一下,执行sql语句后,有3种结果:

  1. 成功修改数据: affectedRows:1, changedRows:1
  2. 要修改的数据与原数据相同: affectedRows:1, changedRows:0
  3. 未找到需要修改的数据: affectedRows:0, changedRows:0

因此可以根据这两个字段输出相应的结果。

2.4 删除

使用delete语句删除语句:

conn.query('DELETE FROM `user` WHERE `uid`=4', function(err, result, fields){
 if(err) throw err;
 console.log(result);
});
</div>

输出的结果:

OkPacket {
 fieldCount: 0,
 affectedRows: 1,
 insertId: 0,
 serverStatus: 2,
 warningCount: 0,
 message: '',
 protocol41: true,
 changedRows: 0
 }
</div>

删除成功,则affectedRows为1,删除的数据不存在,则为0。

三、连接池

数据库连接是一种有限的,能够显著影响到整个应用程序的伸缩性和健壮性的资源,在多用户的网页应用程序中体现得尤为突出。

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

3.1 创建连接池

使用mysql.createPool()可创建连接池:

// test.js
var mysql = require('mysql');

var pool = mysql.createPool({
 host : '127.0.0.1',
 user : 'root',
 password : '123',
 database : 'test'
})

pool.query('SELECT * FROM `user`', function(err, result){
 if(err) throw err;

 console.log(result);

 pool.end(function(err){
  if(err) throw err;
  console.log('connection ended');
 })
});
</div>

getConnection()可以共享一个连接,或管理多个连接。

// test.js
var mysql = require('mysql');

var pool = mysql.createPool({
 host : '127.0.0.1',
 user : 'root',
 password : '123',
 database : 'test'
})

pool.getConnection(function(err, connection){
 if(err) throw err;

 connection.query('SELECT * FROM `user`', function(err, result){
  if(err) throw err;

  console.log(result);
 })
});
</div>

连接使

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-11JQuery 进入页面默认给已赋值的复选框打钩
  • 2017-05-11javascript表单正则应用
  • 2017-05-11jquery实现刷新随机变化样式特效(tag标签样式)
  • 2017-05-11js选项卡的制作方法
  • 2017-05-11微信小程序 地图map详解及简单实例
  • 2017-05-11vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
  • 2017-05-11详解Weex基于Vue2.0开发模板搭建
  • 2017-05-11easy ui datagrid 从编辑框中获取值的方法
  • 2017-05-11Node+Express+MongoDB实现登录注册功能实例
  • 2017-05-11基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Node.js与Sails redis组件的使用教程
    • js记录点击某个按钮的次数-刷新次数为初始状态的实例
    • 详谈jQuery中的一些正则匹配表达式
    • jQuery层级选择器实例代码
    • Bootstrap3下拉菜单的实现
    • jQuery中on方法使用注意事项详解
    • RequireJS 依赖关系的实例(推荐)
    • 原生JS实现《别踩白块》游戏(兼容IE)
    • AngularJS中的按需加载ocLazyLoad示例
    • JS简单判断函数是否存在的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有