后端搭起大体的框架后,接着涉及到的就是如何将数据持久化的问题,也就是对数据库进行 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全栈开发之数据访问篇相关推荐

  1. koa+mysql+vue+socket.io全栈开发之web api篇

    原文地址:koa+mysql+vue+socket.io全栈开发之web api篇 目标是建立一个 web QQ的项目,使用的技术栈如下: 后端是基于koa2 的 web api 服务层,提供curd ...

  2. 黑加仑妞 使用vue+flask做全栈开发的全过程(实现前后端分离)

    黑加仑妞 使用vue+flask做全栈开发的全过程(实现前后端分离) 花了几天的时间终于在本地把前后端跑通了,以一篇博客记录我这几天的心酸... 1.安装nodejs(自带npm,可能会出现版本错误, ...

  3. vue java 插件开发_实习模块vue+java小型全栈开发(三)

    实习模块vue+java小型全栈开发(三) --dx 背景 首先,先给自己一个答案:这篇博客我定义为(三),因为之前的两个模块页面,内容都是一样的,但是被改了几次需求,就一直拖着没有上传. 今天是真正 ...

  4. .Net+MySQL组合开发(二) 数据访问篇

    一.建立数据库.表.添加数据 这里我们使用图形化操作的SQL Manager 2005 Lite for MySQL来建立数据,它的操作界面非常类似OFFICE软件,使用方便.很容量上手.下面开始建立 ...

  5. koa2 mysql_koa2+vue+mysql 全栈开发记录

    koa2+vue2+mysql 全栈开发记录 基于想要自己制作一个个人项目为由,于是有了这么一个开发记录(梳理开发过程也是一个知识巩固的过程) koa2+vue2+mysql 个人的一个通用DEMO( ...

  6. (Node+Vue+微信公众号开发)企业级产品全栈开发速成周末班

    (Node+Vue+微信公众号开发)企业级产品全栈开发速成周末班 从零到壹全栈部落 产品:个人独立博客,21点见 Vue + Node + MongoDB支持服务端渲染的博客系统(5天) 开发环境技术 ...

  7. 《Spring Boot+Vue全栈开发实战》读书笔记

    写在前面 嗯,回家处理一些事,所以离职了,之前的公司用开源技术封装了一套自己的低代码平台,所以之前学的spring Boot之类的东西都忘了很多,蹭回家的闲暇时间复习下. 笔记整体以 Spring B ...

  8. ehcache springboot_阿里内部进阶学习SpringBoot+Vue全栈开发实战文档

    前言 Spring 作为一个轻量级的容器,在JavaEE开发中得到了广泛的应用,但是Spring 的配置烦琐臃肿,在和各种第三方框架进行整合时代码量都非常大,并且整合的代码大多是重复的,为了使开发者能 ...

  9. Spring Boot+Vue全栈开发实战——花了一个礼拜读懂了这本书

    很幸运能够阅读王松老师的<Spring Boot+Vue全栈开发实战>这本书!之前也看过Spring Boot与Vue的相关知识,自己也会使用了Spring Boot+Vue进行开发项目. ...

最新文章

  1. zabbix action 执行远程命令
  2. 100题_10 在排序数组中查找和为给定值的两个数字
  3. kotlin学习笔记——集合及集合操作符
  4. python腾讯语音合成
  5. 美国高级情报研究计划局(IARPA)发起公共安全问题预测机器学习挑战赛(总奖池10万美金)...
  6. Windows Mobile 6中禁用键盘或者是禁用某些按键(C#)
  7. vbs 读unicode 编码格式的文件
  8. window下安装mysql
  9. 一种基于加权处理的无线传感器网络平均跳距离估计算法(W-DVHop)
  10. 544. Top k Largest Numbers【medium】
  11. 内部人示范(野生项目笔记02)
  12. 计算机应用基础7次作业答案,北京中医药大学远程教育“计算机应用基础”第7次作业(14页)-原创力文档...
  13. arduino 红外遥控小车
  14. linux系统中pinctrl 和gpio子系统使用方法(教你点灯)
  15. Windows自带的计算器
  16. 如何用r语言分析数据
  17. 台湾东部海域发生有感地震 暂无灾情传出
  18. 第十九节:依次逐个点亮LED之后,再依次逐个熄灭LED的跑马灯程序。
  19. 鸿蒙音波萨顶顶,假唱被揭穿5位明星,筷子兄弟丢人到国外,萨顶顶竟然拿反话筒!...
  20. Spark 浅谈Spark中的各种join

热门文章

  1. Cisco路由配置命令
  2. [文摘20110527] 小故事 : 大有 和 天成 都是一辈子
  3. 几个交换问题的咨询?
  4. CCNP实验4-2:配置多区域和NBMA OSPF
  5. 洛谷2661 信息传递 三倍经验?
  6. spring data整合elasticsearch的applicationContext.xml文件模板
  7. 移动站适配rel=alternate PC页和H5页适配标注
  8. linux 删除和安装java
  9. layoutSubview调用条件
  10. VC++工作笔记0001---积累-vc中m_开头的意义