全部 android asp.net C/C++ cshap IOS Java javascript nodejs perl php python ruby web容器 其他 前端 数据库 第三方平台 混合式APP 网络 系统 默认分类

nodejs进阶(6)—连接MySQL数据库

0 67

1. 建库连库

连接MySQL数据库需要安装支持

npm install mysql

我们需要提前安装按mysql sever端

建一个数据库mydb1

mysql> CREATE DATABASE mydb1;
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mydb1             |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

然后建一张表user如下

create table user(  
id int not null primary key auto_increment,  
name VARCHAR(100) not null,  
pwd VARCHAR(100) not null,
create_date TIMESTAMP NULL DEFAULT now()
)ENGINE=InnoDB DEFAULT CHARSET=utf8;  
CREATE UNIQUE INDEX t_quiz_IDX_0 on user(name);

接下来我们利用nodejs连接mysql数据库

 1 var mysql  = require('mysql');  //调用MySQL模块
 2 //创建一个connection  
 3 var connection = mysql.createConnection({      
 4     host: 'localhost',       //主机  
 5     user: 'root',               //MySQL认证用户名  
 6     password: 'root',        //MySQL认证用户密码  
 7     database: 'mydb1',  
 8     port: '3306'                   //端口号  
 9 });
10 //创建一个connection  
11 connection.connect(function(err){  
12     if(err){         
13         console.log('[query] - :'+err);  
14         return;  
15     }  
16     console.log('[connection connect]  succeed!');  
17 }); 
18 //----插入
19 var userAddSql = 'insert into user (name,pwd) values(?,?)';
20 var param = ['fff','123'];
21 connection.query(userAddSql,param,function(err,rs){
22     if(err){
23         console.log('insert err:',err.message);
24         return;
25     }
26         console.log('insert success');
27 });
28 //执行查询  
29 connection.query('SELECT * from user where id=?',[2], function(err, rs) {  
30     if (err) {  
31         console.log('[query] - :'+err);  
32         return;  
33     } 
34     for(var i=0;i<rs.length;i++){
35         console.log('The solution is: ', rs[i].uname); 
36     }
37 });   
38 
39 //关闭connection  
40 connection.end(function(err){  
41     if(err){ 
42         console.log(err.toString());
43         return;  
44     }  
45     console.log('[connection end] succeed!');  
46 }); 

但是实际每次创建连接都需要一定的开销,执行效率就会有影响。下面介绍一种连接池连mysql的方法:node-mysql

2. 连接池配置使用

node-mysql是目前最火的node下的mysql驱动,是mysqlpool的一个模块。

下面的代码是提供一个连接池,getPool函数返回createPool创建的数据库连接池对象。

 1 var mysql  = require('mysql');  //调用MySQL模块 
 2 function OptPool(){ 
 3     this.flag=true; //是否连接过 
 4     this.pool = mysql.createPool({     
 5         host: 'localhost',       //主机 
 6         user: 'root',               //MySQL认证用户名 
 7         password: 'root',        //MySQL认证用户密码 
 8         database: 'test', 
 9         port: '3306'                   //端口号 
10     }); 
11  
12     this.getPool=function(){ 
         return this.pool; 
21     } 
22 }; 
23 module.exports = OptPool; 

下面的代码展示如何使用这个连接池,插入和查询的使用。需要注意的是conn.release(); //释放一个连接放回连接池 需要再操作结束后再执行,否则后面的数据库操作会报错。

 1 var OptPool = require('./models/OptPool'); 
 2  
 3 var optPool = new OptPool(); 
 4 var pool = optPool.getPool(); 
 5 
 6 //执行SQL语句 
 7 //从连接池中获取一个连接
 8 pool.getConnection(function(err,conn){ 
 9     //----插入 
10     var userAddSql = 'insert into user (uname,pwd) values(?,?)'; 
11     var param = ['eee','eee'];
12     conn.query(userAddSql,param,function(err,rs){
13         if(err){ 
14             console.log('insert err:',err.message); 
15             return; 
16         } 
17         console.log('insert success'); 
18         //conn.release(); //放回连接池
19     })
20     //查询 
21     conn.query('SELECT * from user', function(err, rs) { 
22         if (err) { 
23             console.log('[query] - :'+err); 
24             return; 
25         }   
26         for(var i=0;i<rs.length;i++){
27             console.log(rs[i].uname); 
28         }
29         conn.release(); //放回连接池
30     });
31 }); 

下面介绍一个复杂一点的增删查改的数据库操作,因相互之间有依赖,所以代码可读性就变得特别差。这样就引出了我们接下来要介绍饿流程控制的内容《nodejs进阶(7)—async异步流程控制》

 1 var OptPool = require('./models/OptPool'); 
 2  
 3 var optPool = new OptPool(); 
 4 var pool = optPool.getPool(); 
 5 
 6 var insertSQL = 'insert into table1(name,pwd) values("conan","123"),("fens.me","456")';
 7 var selectSQL = 'select * from table1 limit 10';
 8 var deleteSQL = 'delete from table1';
 9 var updateSQL = 'update table1 set name="conan update"  where name="conan"';
10 
11 pool.getConnection(function(err,conn){ 
12 //delete
13     conn.query(deleteSQL, function (err0, res0) {
14         if (err0) console.log(err0);
15         console.log("DELETE Return ==> ");
16         console.log(res0);
17 
18         //insert
19         conn.query(insertSQL, function (err1, res1) {
20             if (err1) console.log(err1);
21             console.log("INSERT Return ==> ");
22             console.log(res1);
23 
24             //query
25             conn.query(selectSQL, function (err2, rows) {
26                 if (err2) console.log(err2);
27 
28                 console.log("SELECT ==> ");
29                 for (var i in rows) {
30                     console.log(rows[i]);
31                 }
32 
33                 //update
34                 conn.query(updateSQL, function (err3, res3) {
35                     if (err3) console.log(err3);
36                     console.log("UPDATE Return ==> ");
37                     console.log(res3);
38 
39                     //query
40                     conn.query(selectSQL, function (err4, rows2) {
41                         if (err4) console.log(err4);
42 
43                         console.log("SELECT ==> ");
44                         for (var i in rows2) {
45                             console.log(rows2[i]);
46                         }
47                     });
48                 });
49             });
50         });
51     });
52 })

热忱回答0

  • 加入年费大会员(20每年)
  • 热门标签

    猜你喜欢

    1. node.js—express+ejs、express+swig、
    2. nodejs进阶4-读取图片到页面
    3. 在node中使用 ES6
    4. nodejs第二天之Buffer类
    5. nodejs6下使用koa2
    6. Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)
    7. nodeJs中npm详解
    8. nodejs实现一个简单的爬虫
    9. nodejs进阶(7)—async异步流程控制
    10. textContent、innerHTML、innerText、outerText、outerHTML、nodeValue使用场景和区别

    衣食父母

    最近热帖

    1. 不带插件 ,自己写js,实现批量上传文件及进度显示 5
    2. 连载《一个程序猿的生命周期》-《发展篇》 - 10.欠薪的高薪和稳定的相对低薪,你会选择哪个? 6
    3. android网页分享到朋友圈问题求助? 6
    4. vue实现标签云效果 6
    5. 如何在前端模版引擎开发中避免使用eval函数 6
    6. 从String类型字符串的比较到StringBuffer和StringBuilder 6
    7. php利用gd实现图片的边框 6
    8. 谈谈java中遍历Map的几种方法 7
    9. angular之$watch、$watchGroup、$watchCollection 7
    10. ASP.NET MVC5(五):身份验证、授权 7

    随机文章

    1. grunt不是内部或外部命令错误处理
    2. Yii2框架RESTful API - 格式化响应,授权认证和速率限制
    3. 《明解c语言》已看完,练习代码此奉上
    4. iOS 之 退出app(项目)的几种方法
    5. 菜鸟互啄:WINFORM如何实现无聚焦框的Button按钮