文章结构
mysql 连接数据库mysql的驱动说明
mysql的兼容升级npm包mysql2,mysql2兼容mysql的api语法。使用起来没有太大的
差别,但是mysql2在性能上面提升很大
我们从文档中提取一点重点
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 类型。
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来快速搭建一个项目
后端路由文件
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功能更丰富。