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

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

npm install mysql --save-dev

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

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

一、连接数据库

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

// 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'); })

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

$ node test.js connect success! connect end

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

二、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!' );

输出的结果:

select ended! // 先输出 [ RowDataPacket { uid: 1, username: 'meizi', password: 'meizi email: '123@qq.com' }, RowDataPacket { uid: 2, username: 'test', password: 'test email: '456@qq.com' } ]

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

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

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

2.2 添加

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

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

INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );

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

INSERT INTO table_name SET field1=value1, field2=value2, ... fieldN=valueN;

我更加喜欢第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); });

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

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

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); });

输出的结果:

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

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

成功修改数据: affectedRows:1, changedRows:1

要修改的数据与原数据相同: affectedRows:1, changedRows:0

未找到需要修改的数据: 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); });

输出的结果:

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

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

三、连接池

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzfgf.html