UDN-企业互联网技术人气社区

板块导航

浏览  : 1009
回复  : 2

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

[复制链接]
王许柔的头像 楼主
发表于 2017-2-6 10:39:56 | 显示全部楼层 |阅读模式
本帖最后由 王许柔 于 2017-2-6 10:42 编辑

  接上篇

  1. 建库连库

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

  npm install mysql

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

  建一个数据库mydb1
  1. mysql> CREATE DATABASE mydb1;
  2. mysql> SHOW DATABASES;
  3. +--------------------+
  4. | Database           |
  5. +--------------------+
  6. | information_schema |
  7. | mysql              |
  8. | mydb1             |
  9. | performance_schema |
  10. +--------------------+
  11. 4 rows in set (0.00 sec)
复制代码

  然后建一张表user如下
  1. create table user(  
  2. id int not null primary key auto_increment,  
  3. name VARCHAR(100) not null,  
  4. pwd VARCHAR(100) not null,
  5. create_date TIMESTAMP NULL DEFAULT now()
  6. )ENGINE=InnoDB DEFAULT CHARSET=utf8;  
  7. 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. //关闭connection  
  39. connection.end(function(err){  
  40.     if(err){
  41.         console.log(err.toString());
  42.         return;  
  43.     }  
  44.     console.log('[connection end] succeed!');  
  45. });
复制代码

  但是实际每次创建连接都需要一定的开销,执行效率就会有影响。下面介绍一种连接池连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.     this.getPool=function(){
  12.          return this.pool;
  13.     }
  14. };
  15. module.exports = OptPool;
复制代码

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

  2. var optPool = new OptPool();
  3. var pool = optPool.getPool();

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

  下面介绍一个复杂一点的增删查改的数据库操作,因相互之间有依赖,所以代码可读性就变得特别差。
  1. var OptPool = require('./models/OptPool');

  2. var optPool = new OptPool();
  3. var pool = optPool.getPool();

  4. var insertSQL = 'insert into table1(name,pwd) values("conan","123"),("fens.me","456")';
  5. var selectSQL = 'select * from table1 limit 10';
  6. var deleteSQL = 'delete from table1';
  7. var updateSQL = 'update table1 set name="conan update"  where name="conan"';

  8. pool.getConnection(function(err,conn){
  9. //delete
  10.     conn.query(deleteSQL, function (err0, res0) {
  11.         if (err0) console.log(err0);
  12.         console.log("DELETE Return ==> ");
  13.         console.log(res0);

  14.         //insert
  15.         conn.query(insertSQL, function (err1, res1) {
  16.             if (err1) console.log(err1);
  17.             console.log("INSERT Return ==> ");
  18.             console.log(res1);

  19.             //query
  20.             conn.query(selectSQL, function (err2, rows) {
  21.                 if (err2) console.log(err2);

  22.                 console.log("SELECT ==> ");
  23.                 for (var i in rows) {
  24.                     console.log(rows[i]);
  25.                 }

  26.                 //update
  27.                 conn.query(updateSQL, function (err3, res3) {
  28.                     if (err3) console.log(err3);
  29.                     console.log("UPDATE Return ==> ");
  30.                     console.log(res3);

  31.                     //query
  32.                     conn.query(selectSQL, function (err4, rows2) {
  33.                         if (err4) console.log(err4);

  34.                         console.log("SELECT ==> ");
  35.                         for (var i in rows2) {
  36.                             console.log(rows2[i]);
  37.                         }
  38.                     });
  39.                 });
  40.             });
  41.         });
  42.     });
  43. })
复制代码

  运行结果
1.png

  下篇

相关帖子

发表于 2017-2-6 10:40:44 | 显示全部楼层
LZ敢整点更有创意的不?兄弟们等着围观捏~
使用道具 举报

回复

发表于 2017-2-6 10:40:44 | 显示全部楼层
其实js如果遇到web安全类的项目,那就又要做牺牲了,无法读写文件,访问受限。。。哎。。。
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部