nodejs笔记(3)--mysql

本文介绍了如何使用Node.js连接MySQL数据库并执行基本的CRUD操作。通过实例演示了连接建立、SQL查询执行、连接关闭的过程,并进一步展示了增删改查的具体实现。此外,还讨论了连接池的使用、连接池集群技术、用户切换、SQL注入防范及事务处理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

node与Mysql


安装mysql模块

npm install mysql

按照官方案例做个demo:

var mysql = require("mysql");

//建立一个连接
var connection = mysql.createConnection({
    host : '192.168.28.205',
    user : 'root',
    password: '123456',
    port:'3306',
    database:'test'
});

//建立连接
connection.connect(
    function(err){
        if(err){
            console.log(err);
            return;
        }

        console.log("connection success")
    }

)

//执行一条sql
connection.query('select 1+1 as anwser',function(err,rows,fields){
    if(err)throw err;
    console.log('The anwser is: ', rows[0].anwser);
})


//关闭连接
connection.end(
    function(err){
        if(err){
            console.log(err);
            return;
        }

        console.log("connection end")
    }
)

输出 
connection success
2
connection end

继续深入,增删改查:

var mysql = require("mysql");

//建立一个连接
var connection = mysql.createConnection({
    host : '192.168.28.205',
    user : 'root',
    password: '123456',
    port:'3306',
    database:'test'
});
//建立连接
connection.connect()
//执行一条sql
/*connection.query('select 1+1 as anwser',function(err,rows,fields){
    if(err)throw err;
    console.log('The anwser is: ', rows[0].anwser);
})*/

//增删改查
var sqlState1 = "insert into node_test(name,id,job) values(?,?,?)";
var sqlState2 = "update node_test set name=? , job = ? where id = ?";
var sqlState3 = "select *from  node_test where id = ?";
var sqlState4 = "delete from node_test where id = ?";
var param1 = ["bonita","0","student"];
var param2 = ["tom","engineer","0"];
var param3 = "0";
connection.query(sqlState1,param1,function(err,result){
    if(err) throw err;
    console.log(result);
});


//关闭连接
connection.end()

结束数据库连接end()和destroy()

end()接受一个回调函数,并且会在query结束之后才触发,如果query出错,仍然会终止链接,错误会传递到回调函数中处理。

destroy()立即终止数据库连接,即使还有query没有完成,之后的回调函数也不会在触发

连接池:

var mysql = require("mysql");

//建立一个连接池
var pool = mysql.createPool({
    host:'192.168.28.205',
    port:'3306',
    user:'root',
    password:'123456',
    database:'test'
})
//管理连接池
function getPoolCon(sql) {
    pool.getConnection(function(err,connection){
        if(!connection || err){
            console.log(err);
            return;
        }
        connection.query(sql,function(err,result){
            if(err)throw err;
            console.log(result);
            connection.release();//释放连接
        });
        /*connection.query("select * from node_test",function(err,result){
            if(err)throw err;
            console.log(result);
            connection.release();
        });*/  //这里错误了,应该重新去连接池获取新的连接
    })
}

getPoolCon("select * from node_test")

重新建立连接:

var mysql = require("mysql");

//建立一个连接
var connection = mysql.createConnection({
    host : '192.168.28.205',
    user : 'root',
    password: '123456',
    port:'3306',
    database:'test'
});

function getConnect(){
    connection.connect(function(err){
        if(err){
            console.log("建立连接失败:",err);
            setTimeout(getConnect, 2000);
        }else{
            console.log("connect success")
        }
    });
    // 如果是连接断开,自动重新连接
    connection.on("error",function(err){
        if(err.code === 'PROTOCOL_CONNECTION_LOST'){
            getConnect();
        }else{
            throw err;
        }
    })
}

getConnect();

连接池集群技术:

连接池集群可以提供多个主机连接

//创建连接池集群
var poolCluster = mysql.createPoolCluster();
//添加配置 config是一个连接池配置
poolCluster.add(config);//使用自动名称添加配置
poolCluster.add('MASTER',masterConfig);//添加命名配置
poolCluster.add('SLAVE1',slave1config);
poolCluster.add('SLAVE2',slave2config);

//删除配置
poolCluster.remove('SLAVE1');//根据配置名字
poolCluster.remove('SLAVE*')//根据匹配到的

//获取连接 从所有的连接池里获得 默认选择器 
poolCluster.getConnectiuon(function(err,connection){});

//从 一个连接池里面获取连接
poolCluster.getConnectiuon('MASTER',function(err,connection){});
//从匹配到的连接池组里面获取连接 按照顺序
//如果SLAVE1出错 就从SLAVE2获得连接
poolCluster.getConnectiuon('SLAVE*','ORDER',function(err,connection){} );

//触发事件 当删除连接池时触发
poolCluster.on('remove',function(nodeId){
    console.log(nodeId);//被删除的连接池名字
});
//配置 选择器 从SLAVE1 SLAVE2 里面随机获得连接
var pool = poolCluster.of('SLAVE*','RANDOM');
pool.getConnectiuon(function(err,connection){});

//关闭连接池集群
poolCluster.end();

切换用户/改变连接状态:

参数  
    user: 新的用户 (默认为早前的一个).  
    password: 新用户的新密码 (默认为早前的一个).  
    charset: 新字符集 (默认为早前的一个).  
    database: 新数据库名称 (默认为早前的一个).  
connection.changeUser({user : 'john'}, function(err) {
          if (err) throw err;
});

为了避免SQL注入攻击,需要转义用户提交的数据。可以使用connection.escape() 或者 pool.escape()
或者使用占位符?

可以使用??作为标识符的占位符

var sql    = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);
    connection.query(sql, function(err, results) {
      // ...
});

var query = connection.query('SELECT ?? FROM ?? WHERE id = ?', [columns, 'users', userId], function(err, results) {
      // ...
    });

事务处理:

connection.beginTransaction(function(err) {
      if (err) { throw err; }
      connection.query('INSERT INTO posts SET title=?', title, function(err, result) {
        if (err) { 
          connection.rollback(function() {
            throw err;
          });
        }

        var log = 'Post ' + result.insertId + ' added';

        connection.query('INSERT INTO log SET data=?', log, function(err, result) {
          if (err) { 
            connection.rollback(function() {
              throw err;
            });
          }  
          connection.commit(function(err) {
            if (err) { 
              connection.rollback(function() {
                throw err;
              });
            }
            console.log('success!');
          });
        });
      });
    });
标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及预期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了一个基于灰狼优化算法(GWO)优化的卷积双向长短期记忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列预测项目。该项目旨在解决传统时序预测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准预测。项目不仅涵盖了数据预处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备一定编程基础,特别是对深度学习、时间序列预测及优化算法有一定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷预测、金融市场多资产价格预测、环境气象多参数预报、智能制造设备状态监测与预测维护、交通流量预测与智慧交通管理、医疗健康多指标预测等领域;②提升多变量多步时间序列预测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据预处理的重要性,合理设置模型参数与网络结构,控制多步预测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值