打通前后端——node连接mysql数据库

mysql 连接数据库mysql的驱动说明

mysql的兼容升级npm包mysql2,mysql2兼容mysql的api语法。使用起来没有太大的
差别,但是mysql2在性能上面提升很大

mysql npm地址与文档地址

我们从文档中提取一点重点

mysql连接的配置信息

// db.config.js
// 创建mysql连接
module.exports = {
    host: 'localhost', // 服务器地址
    user: '******', // mysql用户名称
    password: '******', // mysql用户密码
    port: '3306', // 端口
    database: 'todolist', // 数据库名称
}

封装mysql的语句执行方法

// db.js 
const mysql = require('mysql2');
const dbConfig = require('./db.config');

module.exports = {
    query: function(sql, params, callback) {
        //每次使用的时候需要创建链接,数据操作完成之后要关闭连接
        const connection = mysql.createConnection(dbConfig)
        connection.connect(function(err) {
            if (err) {
                throw err
            }
            //开始数据操作
            connection.query(sql, params, function(err, results, fields) {
                if (err) {
                    throw err
                }
                //将查询出来的数据返回给回调函数
                callback &&
                    callback(
                        results ? JSON.parse(JSON.stringify(results)) : null,
                        fields ? JSON.parse(JSON.stringify(fields)) : null
                    )
                    //停止链接数据库,必须在查询语句后,要不然一调用这个方法,就直接停止链接,数据操作就会失败
                connection.end(function(err) {
                    if (err) {
                        console.log('关闭数据库连接失败!')
                        throw err
                    }
                })
            })
        })
    },
}
router.get('/userList', (req, res, next) => {
    // sql查询user表
    db.query('select * from list', [], function(results, fields) {
        // 以json的形式返回
        res.json({ results })
    })
})

query的两种查询

connection.query('SELECT * FROM `books` WHERE `author` = "David"', function (error, results, fields) {
  // error will be an Error if one occurred during the query
  // results will contain the results of the query
  // fields will contain information about the returned results fields (if any)
});
connection.query('SELECT * FROM `books` WHERE `author` = ?', ['David'], function (error, results, fields) {
  // error will be an Error if one occurred during the query
  // results will contain the results of the query
  // fields will contain information about the returned results fields (if any)
});

获取受影响的行数

// 您可以从插入、更新或删除语句中获取受影响的行数。
connection.query('DELETE FROM posts WHERE title = "wrong"', function (error, results, fields) {
  if (error) throw error;
  console.log('deleted ' + results.affectedRows + ' rows');
})

获取更改的行数

您可以从更新语句中获取更改的行数。“changedRows”与“affectedRows”的不同之处在于它不计算值未更改的更新行。
connection.query('UPDATE posts SET ...', function (error, results, fields) {
  if (error) throw error;
  console.log('changed ' + results.changedRows + ' rows');
})

多语句查询

// 句查询会被SQL注入,如果确定想使用可以开启
var connection = mysql.createConnection({multipleStatements: true});

事务

// 开启一个简单的事务
connection.beginTransaction(function(err) {
  if (err) { throw err; }
  connection.query('INSERT INTO posts SET title=?', title, function (error, results, fields) {
    if (error) {
      return connection.rollback(function() {
        throw error;
      });
    }
 
    var log = 'Post ' + results.insertId + ' added';
 
    connection.query('INSERT INTO log SET data=?', log, function (error, results, fields) {
      if (error) {
        return connection.rollback(function() {
          throw error;
        });
      }
      connection.commit(function(err) {
        if (err) {
          return connection.rollback(function() {
            throw err;
          });
        }
        console.log('success!');
      });
    });
  });
});

Exception Safety 类型重铸

为方便起见,默认情况下,此驱动程序会将 mysql 类型转换为原生 JavaScript 类型。
mysqljavascript
TINYINTNumber
SMALLINTNumber
INTNumber
MEDIUMINTNumber
YEARNumber
FLOATNumber
DOUBLENumber
TIMESTAMPDate
DATEDate
DATETIMEDate
TINYBLOBBuffer
MEDIUMBLOBBuffer
LONGBLOBBuffer
BLOBBuffer
BINARYBuffer
VARBINARYBuffer
BIT (last byte will be filled with 0 bits as necessary)Buffer
charString
varcharString
tinytextString
mediumtextString
longtextString
textString
enumString
setString
decimalString
bigintString
timeString
geometryString

具体操作演示

使用express-generator来快速搭建一个项目

简单了解一下express-generator

后端路由文件

var express = require('express');
var router = express.Router();
const db = require('../conf/db');

/* GET home page. */
router.get('/', function(req, res, next) {
    res.send("<h1>123</h1>")
});

router.get('/userList', (req, res, next) => {
    // sql查询user表
    db.query('select * from list', [], function(results, fields) {
        // 以json的形式返回
        res.json({ results })
    })
})
module.exports = router;

在这里插入图片描述

数据库配置文件

// db.config.js
// 创建mysql连接
module.exports = {
    host: 'localhost', // 服务器地址
    user: '******', // mysql用户名称
    password: '******', // mysql用户密码
    port: '3306', // 端口
    database: 'todolist', // 数据库名称
}

在这里插入图片描述

封装mysql查询函数

// db.js 
const mysql = require('mysql2');
const dbConfig = require('./db.config');

module.exports = {
    query: function(sql, params, callback) {
        //每次使用的时候需要创建链接,数据操作完成之后要关闭连接
        const connection = mysql.createConnection(dbConfig)
        connection.connect(function(err) {
            if (err) {
                throw err
            }
            //开始数据操作
            connection.query(sql, params, function(err, results, fields) {
                if (err) {
                    throw err
                }
                //将查询出来的数据返回给回调函数
                callback &&
                    callback(
                        JSON.parse(JSON.stringify(results)),
                        JSON.parse(JSON.stringify(fields))
                    )
                    //停止链接数据库,必须在查询语句后,要不然一调用这个方法,就直接停止链接,数据操作就会失败
                connection.end(function(err) {
                    if (err) {
                        console.log('关闭数据库连接失败!')
                        throw err
                    }
                })
            })
        })
    },
}

在这里插入图片描述

启动项目

在这里插入图片描述
在这里插入图片描述

查看数据库

在这里插入图片描述

浏览器/postman调用

因为是get请求,其实可以直接在浏览器中调用,但是postman功能更丰富。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 23
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LiuJie_Boom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值