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

文章结构

  • mysql 连接数据库mysql的驱动说明
    • mysql连接的配置信息
    • 封装mysql的语句执行方法
    • query的两种查询
    • 获取受影响的行数
    • 获取更改的行数
    • 多语句查询
    • 事务
    • Exception Safety 类型重铸
  • 具体操作演示
    • 后端路由文件
    • 数据库配置文件
    • 封装mysql查询函数
    • 启动项目
    • 查看数据库
    • 浏览器/postman调用

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(
                        JSON.parse(JSON.stringify(results)),
                        JSON.parse(JSON.stringify(fields))
                    )
                    //停止链接数据库,必须在查询语句后,要不然一调用这个方法,就直接停止链接,数据操作就会失败
                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 类型。
mysql javascript
TINYINT Number
SMALLINT Number
INT Number
MEDIUMINT Number
YEAR Number
FLOAT Number
DOUBLE Number
TIMESTAMP Date
DATE Date
DATETIME Date
TINYBLOB Buffer
MEDIUMBLOB Buffer
LONGBLOB Buffer
BLOB Buffer
BINARY Buffer
VARBINARY Buffer
BIT (last byte will be filled with 0 bits as necessary) Buffer
char String
varchar String
tinytext String
mediumtext String
longtext String
text String
enum String
set String
decimal String
bigint String
time String
geometry String

具体操作演示

使用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("

123

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

打通前后端——node连接mysql数据库_第1张图片

数据库配置文件

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

打通前后端——node连接mysql数据库_第2张图片

封装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
                    }
                })
            })
        })
    },
}

打通前后端——node连接mysql数据库_第3张图片

启动项目

打通前后端——node连接mysql数据库_第4张图片
打通前后端——node连接mysql数据库_第5张图片

查看数据库

打通前后端——node连接mysql数据库_第6张图片

浏览器/postman调用

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

在这里插入图片描述
打通前后端——node连接mysql数据库_第7张图片
打通前后端——node连接mysql数据库_第8张图片

你可能感兴趣的:(node,前端,node.js,mysql)