利用dao传值给mysql_koa+mysql+vue+socket.io全栈开发之数据访问篇
后端搭起大体的框架后,接着涉及到的就是如何将数据持久化的问题,也就是对数据库进行 CURD 操作。
关于数据库方案, mongodb 和 mysql 都使用过,但我选用的是 mysql,原因:
目前为止 mysql 与 mongodb 性能相差不大,尤其是 mysql 8.0 版本,速度非常快,查询数据是 mysql 更快,写数据方面 mongodb 则更胜一筹;
mysql 建立 关联数据要更方便些,比如: 一对多,多对多的关系;
mysql 作为关系型数据库,数据一致性方面更好,尤其是事务用起来更顺手;
本人对 sql 操作比较得心应手,毕竟大部分项目用得都是 mysql,而 mongodb 在正式些的项目上用的就少了,而且目前关系型数据库也在进化, postgrep 和 mysql 都已经支持 json了。
node-mysql
node-mysql 是用 sql 语句对 mysql 进行操作的库, 并没有使用 Sequelize 这种 orm。因为我对 sql 熟悉,原生开发效率高。
连接池
连接数据库我选用 连接池的方式,这种方式能高效的利用数据库连接
//dbPool.js
const mysql = require('mysql');
const dbconfig = require('../config/db');
const log = require('../common/logger');
let pool = null;
/**
* get the connection pool of database
* 获取数据库连接池
*/
exports.getPool = function () {
if (!pool) {
log.info("creating pool");
pool = mysql.createPool(dbconfig);
}
return pool;
}
数据库配置文件
emoji 格式要用 utf8mb4 格式存储,所以这里连接字符集选用 utf8mb4,当然客户端和数据结果集 一样也要设置为 utf8mb4。
module.exports={
host: "localhost",
port: "3306",
user: "root",
password: "jeff",
database: "chatdb",
charset : 'utf8mb4',//utf8mb4才能保存emoji
multipleStatements: true,// 可同时查询多条语句, 但不能参数化传值
connectionLimit: 100 //连接数量
};
Dao的编写
基本的代码编写方式如下,每个方法基本都是这么一种流程,获取数据库连接,执行 sql 语句,返回结果,处理异常。
exports.queryInfo = function (params, callback){
pool.query('select ...', params, function (error, result, fields) {
if (error) {
log(error);
callback(false);
}
else callback(result)
});
}
exportDao
这造成了一大堆重复的样板代码,我们需要封装它,用 JavaScript 高阶函数特性 很容易就能实现,同时加上 Promise,调用时就能方便地用 async await 了,还有日志记录功能也加上。
const pool = require("./dbPool").getPool();
const log = require('../common/logger');
/**
* export named query function
*/
const exportDao = opts => Object.keys(opts).reduce((next, key) => {
next[key] = (...args) => new Promise((resolve, reject) => {
if (opts[key]) args.unshift(opts[key]);
log.info('====== execute sql ======')
log.info(args);
pool.query(...args, (err, result, fields) => {// fields is useless
if (err) reject(err)
else resolve(result);
});
});
return next;
}, {});
userDao文件为例,使用 exportDao 直接就能把里面的 key-value 对象输出为 以key 为方法名的dao方法,挂载到 module.exports 下。
const { exportDao } = require('./common');
//直接就exports里面的key值对应的方法
module.exports = exportDao({
sql: null,// 有些时候需要直接写sql
count: 'select count(*) as count from user where ?',
getUser: 'select * from user where ?',
insert: 'insert into user set ?',
update: 'update user set ? where id = ?',
delete: 'delete from user where ?'
});
/* 最终输出格式
module.exports = {
sql:() => {},
count:() => {},
...
}*/
transaction
还有事务 transaction 的功能需要用到,来看一下 node-mysql 官方的例子,层层回调
利用dao传值给mysql_koa+mysql+vue+socket.io全栈开发之数据访问篇相关推荐
- koa+mysql+vue+socket.io全栈开发之web api篇
原文地址:koa+mysql+vue+socket.io全栈开发之web api篇 目标是建立一个 web QQ的项目,使用的技术栈如下: 后端是基于koa2 的 web api 服务层,提供curd ...
- 黑加仑妞 使用vue+flask做全栈开发的全过程(实现前后端分离)
黑加仑妞 使用vue+flask做全栈开发的全过程(实现前后端分离) 花了几天的时间终于在本地把前后端跑通了,以一篇博客记录我这几天的心酸... 1.安装nodejs(自带npm,可能会出现版本错误, ...
- vue java 插件开发_实习模块vue+java小型全栈开发(三)
实习模块vue+java小型全栈开发(三) --dx 背景 首先,先给自己一个答案:这篇博客我定义为(三),因为之前的两个模块页面,内容都是一样的,但是被改了几次需求,就一直拖着没有上传. 今天是真正 ...
- .Net+MySQL组合开发(二) 数据访问篇
一.建立数据库.表.添加数据 这里我们使用图形化操作的SQL Manager 2005 Lite for MySQL来建立数据,它的操作界面非常类似OFFICE软件,使用方便.很容量上手.下面开始建立 ...
- koa2 mysql_koa2+vue+mysql 全栈开发记录
koa2+vue2+mysql 全栈开发记录 基于想要自己制作一个个人项目为由,于是有了这么一个开发记录(梳理开发过程也是一个知识巩固的过程) koa2+vue2+mysql 个人的一个通用DEMO( ...
- (Node+Vue+微信公众号开发)企业级产品全栈开发速成周末班
(Node+Vue+微信公众号开发)企业级产品全栈开发速成周末班 从零到壹全栈部落 产品:个人独立博客,21点见 Vue + Node + MongoDB支持服务端渲染的博客系统(5天) 开发环境技术 ...
- 《Spring Boot+Vue全栈开发实战》读书笔记
写在前面 嗯,回家处理一些事,所以离职了,之前的公司用开源技术封装了一套自己的低代码平台,所以之前学的spring Boot之类的东西都忘了很多,蹭回家的闲暇时间复习下. 笔记整体以 Spring B ...
- ehcache springboot_阿里内部进阶学习SpringBoot+Vue全栈开发实战文档
前言 Spring 作为一个轻量级的容器,在JavaEE开发中得到了广泛的应用,但是Spring 的配置烦琐臃肿,在和各种第三方框架进行整合时代码量都非常大,并且整合的代码大多是重复的,为了使开发者能 ...
- Spring Boot+Vue全栈开发实战——花了一个礼拜读懂了这本书
很幸运能够阅读王松老师的<Spring Boot+Vue全栈开发实战>这本书!之前也看过Spring Boot与Vue的相关知识,自己也会使用了Spring Boot+Vue进行开发项目. ...
最新文章
- zabbix action 执行远程命令
- 100题_10 在排序数组中查找和为给定值的两个数字
- kotlin学习笔记——集合及集合操作符
- python腾讯语音合成
- 美国高级情报研究计划局(IARPA)发起公共安全问题预测机器学习挑战赛(总奖池10万美金)...
- Windows Mobile 6中禁用键盘或者是禁用某些按键(C#)
- vbs 读unicode 编码格式的文件
- window下安装mysql
- 一种基于加权处理的无线传感器网络平均跳距离估计算法(W-DVHop)
- 544. Top k Largest Numbers【medium】
- 内部人示范(野生项目笔记02)
- 计算机应用基础7次作业答案,北京中医药大学远程教育“计算机应用基础”第7次作业(14页)-原创力文档...
- arduino 红外遥控小车
- linux系统中pinctrl 和gpio子系统使用方法(教你点灯)
- Windows自带的计算器
- 如何用r语言分析数据
- 台湾东部海域发生有感地震 暂无灾情传出
- 第十九节:依次逐个点亮LED之后,再依次逐个熄灭LED的跑马灯程序。
- 鸿蒙音波萨顶顶,假唱被揭穿5位明星,筷子兄弟丢人到国外,萨顶顶竟然拿反话筒!...
- Spark 浅谈Spark中的各种join