上一篇说到用node-ORM框架来操作数据库,可以减少我们去写sql语句。今天用node-mysql2来对数据库进行操作。这个可能要求我们会一些基础的增删改查的sql语句。有兴趣的可以去看看mysql的一些简单语句。
安装mysql2
npm i mysql2 -S 或
cnpm i mysql2 -S 或
yarn add mysql2
因为demo中还是要用到node跨域,所以我直接在之前讲node跨域的代码上做修改。
node-mysql2连接数据库提供了两种连接方式:GitHub:https://github.com/sidorares/node-mysql2
第一种通过createConnection来创建连接,今天我们主要说第二种通过创建连接池的方式。
主要是因为使用连接池特别灵活,大大提高了我们的效率。
连接池通过重用以前的连接,使它们处于打开状态而不是关闭状态,从而减少了连接到MySQL服务器的时间。
由于避免了建立新连接带来的所有开销,因此可以提高查询的延迟。
简单的说一下第一种方法的步骤,大家可自行尝试:
//1.引入mysql2
const mysql = require("mysql");
//2创建到数据库服务器连接
var conn = mysql.createConnection({
host:"127.0.0.1",
user:"root",
password:"密码",
database:"数据库名称",
port:3306
});
//3创建SQL语句并且发送SQL语句
var sql = "";//操作数据库的增删改查语句
conn.query(sql,[],//如果查询数据库有变量的话放到数组中,没有变量可省略这个参数
(err,result)=>{
if(err){
console.log(err);
}else{
console.log(result);
}
})
//4关闭连接
conn.end();
第一种方法基本就遵循上面四步,下面说一下第二种方法,同样用demo举例
这次用的Mac系统,装了mysql数据库,并且已经提前创建了数据库和表数据,用两个demo来说明对数据库的操作,查询数据和添加数据,接下来看代码。
目录结构:
1.png
server.js
const express = require("express");
const bodyParser = require("body-parser");
const mysql2 = require("mysql2")
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}))
const allowCrossDomain = function(req, res, next){
res.header('Access-Control-Allow-Origin', '*');//自定义中间件,设置跨域需要的响应头。
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');//允许任何方法
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type,X-Session-Token'); //允许任何类型
next()
}
app.use(allowCrossDomain);
const pool = mysql2.createPool({//创建连接池
host: 'localhost',
user: 'root',
password: "数据库密码",
database: 'jindu_loan',//数据库名称
connectionLimit: 10//连接池大小
})
app.get("/",(req, res)=>{
pool.getConnection((err, conn)=> {
const sql = "select * from jd_user";//查询jd_user表中的用户
conn.query(sql, async(err, result)=>{
if (err) throw err;
await res.json(result);
conn.release();//数据查询成功后归还连接
})
})
})
app.listen(3000,() => console.log("server on http://localhost:3000"))
1.png
查询到了用户数据,图片中展示了部分用户。
查询没问题了,接下来我们要往jd_user表中添加一个用户接着修改server.js,
先查询一下js_user表中有多少个字段
2.png
查询数据库发现共有9个字段。
const express = require("express");
const bodyParser = require("body-parser");
const mysql2 = require("mysql2")
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}))
const allowCrossDomain = function(req, res, next){
res.header('Access-Control-Allow-Origin', '*');//自定义中间件,设置跨域需要的响应头。
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');//允许任何方法
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type,X-Session-Token'); //允许任何类型
next()
}
app.use(allowCrossDomain);
const pool = mysql2.createPool({
host: 'localhost',
user: 'root',
password: "123456",
database: 'jindu_loan',
connectionLimit: 10
})
app.get("/",(req, res)=>{
pool.getConnection((err, conn)=> {
if (err) throw err;
const sql = "select * from jd_user";
conn.query(sql, async(err, result)=>{
if (err) throw err;
await res.json(result);
conn.release();
})
})
})
app.post("/reg",(req, res)=>{
const {account, pwd, real_name} = req.body;//获取用户提交的数据
if(account && pwd && real_name){
pool.getConnection((err, conn)=>{
if(err) throw err;
const sql = "insert into jd_user values(null,?,?,?,now(),null,null,now(),null)";//写追加数据的sql变量可用"?"占位,追加的字段数量要与刚才查询的字段数量一致,否则会报错
conn.query(sql,[account, pwd, real_name],async(error,result)=>{//数组中放我们传入的变量会自动替换"?"
if(error) throw error;
await res.json({code: 200, msg: "添加成功"})
conn.release();
})
})
}
})
app.listen(3000,() => console.log("server on http://localhost:3000"))
再去index.html中写个post提交的方法:
Document用户名:
密码:
真实姓名:
提交
$("button").click(function(){
const body = {};
body.account = $(".userName").val();
body.pwd = $(".userPwd").val();
body.real_name = $(".real_name").val();
$.ajax({
url: "http://localhost:3000/reg",
type: "post",
dataType: "json",
data: body,
success: function(data){}
})
})
npm run start启动项目,打开index.html输入提交的值
3.png
4.png
我们刚才的数据提交成功了。