NodeJs操作MySQL类

此类封装了几个常用的方法:插入,更新,删除,查询,开启事务,事务提交,事务回滚等操作。有一这个类,操作MYSQL就方便多了。

批处理,存储过程等方法还没有添加,因为觉得目前写的那里还没有用到批处理的,所以就没有在这里加上,等以后要是用到了要进行批处理的时候,再加上。

以前用C#在操作数据库的时候,也都有类似的操作类:MSSQLHelper,OracleHelper,MySQLHelper等这些,现在只是用NodeJs写了一个操作MySql,想操作其它数据库,按照这样的思路也应该可以写出来吧。

具体怎么用在以后再讲了,如果心急的话,可以到我的 github(https://github.com/xiaotuni/angular-map-http2)里下载项目,运行起来就可以了。

const mysql = require('mysql');

/**
* 操作类型,插入,更新,删除,查询
*/
const OperatorType = {
Insert: 0,
Update: 1,
Delete: 2,
QueryList: 3,
QueryOne: 4,
} /**
* 数据操作类
* QueryOne、Query、InsertSQL、DeleteSQL、UpdateSQL、BeginTransaction、Rollback、Commit
*
* @class MySqlHelper
*/
class MySqlHelper { constructor() {
this.__CreatePool();
} /**
* 创建一个资源池
*
* @memberof MySqlHelper
*/
__CreatePool() {
this.pool = mysql.createPool({
connectionLimit: 10,
host: 'localhost', // 数据库连接
user: 'liaohb', // 数据库名用户名
password: 'xiaotuni', // 密码
database: 'nodejs' // 表空间
});
} /**
* 资源池信息
*
* @param {any} error 出错事件出得函数
* @returns
* @memberof MySqlHelper
*/
poolInfo(error) {
if (!this.pool) {
this.__CreatePool();
}
if (!this.pool) {
error && error({ code: 500, msg: '数据库连接失败' });
return null;
}
return this.pool;
}
/**
* 插入操作
*
* @param {any} sql 插入语句
* @param {any} success 成功后调用的方法
* @param {any} error 失败后调用的方法
* @memberof MySqlHelper
*/
Query(sql, success, error) {
this.__ExecuteSQL(sql, success, error, OperatorType.QueryList);
}
/**
* 查询操作,获取一条语句
*
* @param {any} sql 插入语句
* @param {any} success 成功后调用的方法
* @param {any} error 失败后调用的方法
* @memberof MySqlHelper
*/
QueryOne(sql, success, error) {
this.__ExecuteSQL(sql, success, error, OperatorType.QueryOne);
}
/**
* 更新操作
*
* @param {any} Sql 修改语句
* @param {any} Success 成功后调用的方法
* @param {any} Error 失败后调用的方法
* @memberof MySqlHelper
*/
UpdateSQL(Sql, Success, Error) {
this.__ExecuteSQL(Sql, Success, Error, OperatorType.Update);
} /**
* 插入操作
*
* @param {any} Sql 插入语句
* @param {any} Success 成功后调用的方法
* @param {any} Error 失败后调用的方法
* @memberof MySqlHelper
*/
InsertSQL(Sql, Success, Error) {
this.__ExecuteSQL(Sql, Success, Error, OperatorType.Insert);
} /**
* 删除操作
*
* @param {any} Sql 删除语句
* @param {any} Success 成功后调用的方法
* @param {any} Error 失败后调用的方法
* @memberof MySqlHelper
*/
DeleteSQL(Sql, Success, Error) {
this.__ExecuteSQL(Sql, Success, Error, OperatorType.Delete);
} /**
* 执行SQL语句
*
* @param {any} Sql SQL语句
* @param {any} Success 成功后调用的方法
* @param {any} Error 失败后调用的方法
* @param {any} Type 类型[查询,更新,删除,修改等]
* @returns
* @memberof MySqlHelper
*/
__ExecuteSQL(Sql, Success, Error, Type) {
const __self = this;
const __ProcessResult = (__sql, result, fields, Type) => {
const _type = Type || OperatorType.QueryOne;
let __result = result;
switch (Type) {
case OperatorType.Insert:
const { insertId } = result;
__result = { insertId };
break;
case OperatorType.Delete:
break;
case OperatorType.Update:
break;
case OperatorType.QueryList:
break;
case OperatorType.QueryOne:
__result = result && result.length > 0 ? result[0] : null;
break;
}
return __result;
};
const { IsBeginTrConn, BeginTrConn } = this;
if (!!IsBeginTrConn) {
console.log('事务线程ID:', BeginTrConn.threadId);
// 事务处理
BeginTrConn.query(Sql, (err, result, fields) => {
if (err) {
__self.Rollback(err);
Error && Error(err);
return;
}
const __result = __ProcessResult(Sql, result, fields, Type);
Success && Success({ fields, result: __result });
});
} else {
const poolInfo = this.poolInfo(Error);
if (!poolInfo) {
return;
}
const __query = poolInfo.query(Sql, (err, result, fields) => {
if (err) {
Error && Error(err);
return;
}
const __result = __ProcessResult(__query.sql, result, fields, Type);
Success && Success({ fields, result: __result });
});
}
} /**
* 开启事务
*
* @param {any} Success 成功后调用的方法
* @param {any} Error 失败后调用的方法
* @returns
* @memberof MySqlHelper
*/
BeginTransaction(Success, Error) {
const poolInfo = this.poolInfo(Error);
if (!poolInfo) {
return;
}
const __self = this;
poolInfo.getConnection((err, conn) => {
if (err) {
Error && Error(err);
}
conn.beginTransaction((btErr) => {
if (btErr) {
Error && Error(btErr);
}
console.log('开始事务处理...');
__self.BeginTrConn = conn;
__self.IsBeginTrConn = true;
Success && Success();
});
});
} /**
* 事务回滚
*
* @param {any} ErrorInfo 回滚出错信息
* @returns
* @memberof MySqlHelper
*/
Rollback(ErrorInfo) {
const { IsBeginTrConn, BeginTrConn } = this;
const __self = this;
if (!IsBeginTrConn) {
return;
}
if (!BeginTrConn) {
return;
} console.log('Rollback->事务线程ID:', BeginTrConn.threadId);
BeginTrConn.rollback(() => {
console.log('事务回滚,回滚原因:', ErrorInfo);
delete __self.IsBeginTrConn;
delete __self.BeginTrConn;
});
} /**
* 提交事件
*
* @param {any} Success 成功后调用的方法
* @param {any} Error 失败后调用的方法
* @returns
* @memberof MySqlHelper
*/
Commit(Success, Error) {
const { IsBeginTrConn, BeginTrConn } = this;
const __self = this;
if (!IsBeginTrConn) {
return;
}
if (!BeginTrConn) {
return;
}
BeginTrConn.commit((err) => {
if (err) {
console.log('事务提交失败,执行回滚操作...');
__self.Rollback(err);
Error && Error(err);
return;
}
console.log('事务提交成功...');
console.log('Commit->事务提交成功...事务ID:', BeginTrConn.threadId);
delete __self.IsBeginTrConn;
delete __self.BeginTrConn;
Success && Success();
});
} /**
* 关闭连接池
*
* @param {any} Success
* @param {any} Error
* @returns
* @memberof MySqlHelper
*/
ClosePool(Success, Error) {
const __self = this;
const poolInfo = this.poolInfo(Error);
if (!poolInfo) {
return;
}
poolInfo.end((err) => {
if (err) {
Error && Error(err);
return;
}
Success && Success(); if (__self.__pool) {
delete this.pool;
delete this.__pool;
}
});
}
} module.exports = MySqlHelper;

Angular4+NodeJs+MySQL 入门-02 MySql操作类的更多相关文章

  1. Angular4+NodeJs+MySQL 入门-04 接口调用类

    上一篇文章说一下,后台接口的创建,这篇说一下如果调用接口. 创建一个目录helpers 此目录下有三个文件分别是 ApiClient.ts.clientMiddleware.ts.Core.ts,前面 ...

  2. MySQL学习02(操作数据库)

    操作数据库 结构化查询语句分类 名称 解释 命令 DDL(数据库定义语言) 定义和管理数据对象,例如数据库和数据表 create.drop.alter DML(数据操作语言) 用于操作数据库对象中所包 ...

  3. python操作三大主流数据库(2)python操作mysql②python对mysql进行简单的增删改查

    python操作mysql②python对mysql进行简单的增删改查 1.设计mysql的数据库和表 id:新闻的唯一标示 title:新闻的标题 content:新闻的内容 created_at: ...

  4. Python MySQL 入门

    章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...

  5. Angular4+NodeJs+MySQL 入门-03 后台接口定义

    这篇里是如何定义接口,我们一般访问接口如:post请求调用http://127.0.0.1:11000/webapi/userinfo/user 这个接口,成功返回用户信息,如果失败要返回失败原因等. ...

  6. php : mysql数据库操作类演示

    设计目标: 1,该类一实例化,就可以自动连接上mysql数据库: 2,该类可以单独去设定要使用的连接编码(set names XXX) 3,该类可以单独去设定要使用的数据库(use XXX): 4,可 ...

  7. ecshop的Mysql操作类

    摘要,这是直接摘抄的ecshop的mysql操作类:不过他这里的缓存是用的文件缓存,我们如果想直接使用,可以替换成memcache的或者redis的! <?php /** * ECSHOP MY ...

  8. php MySQL数据库操作类源代码

    php MySQL数据库操作类源代码: <?php class MySQL{ private $host; //服务器地址 private $name; //登录账号 private $pwd; ...

  9. 设计模式 - 单例模式mysql数据库操作类

    待续... index.php 调用方法: <?php header('Content-Type:text/html; charset=utf8'); require 'instance.php ...

随机推荐

  1. NAO机器人

    NAO机器人是Aldebaran Robotics公司研制的一款人工智能机器人.它拥有着讨人喜欢的外形,并具备有一定程度的人工智能和约一定程度的情感智商并能够和人亲切的互动. 教学研究类/NAO机器人 ...

  2. Spring注解:Enable相关注解

    @EnableXXX:可以用于取代xml配置中的一些配置,被该注解所标注的类,其中被@Bean标注的方法,一般就用于返回和EnableXXX的XXX相关的Bean,Bean中一般有XXX相关的注解 同 ...

  3. 钩子(hook)编程

    一.钩子介绍 1.1钩子的实现机制 钩子英文名叫Hook,是一种截获windows系统中某应用程序或者所有进程的消息的一种技术.下图是windows应用程序传递消息的过程: 如在键盘中按下一键,操作系 ...

  4. NSProcessInfo系统进程信息

    前言 NSProcessInfo 类中包含一些方法,允许你设置或检索正在运行的应用程序(即进程)的各种类型的信息. 1.获取系统进程信息 // 创建系统进程信息对象 NSProcessInfo *pr ...

  5. 特殊用途语言特性(默认实参/内联函数/constexpr函数/assert预处理宏/NDEBUG预处理变量)

    默认实参: 某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参.调用含有默认实参的函数时,可以包含该实参,也可以省略该实参. 需要特别 ...

  6. luoguP2387 [NOI2014]魔法森林

    https://www.luogu.org/problemnew/show/P2387 考虑先将所有边按 a 值排序,依次加入每一条边,如果这条边的两个端点 ( l, r ) 之间的简单路径中 b 的 ...

  7. bzoj2564: 集合的面积(闵可夫斯基和 凸包)

    题面 传送门 题解 花了一个下午的时间调出了一个稍微能看的板子--没办法网上的板子和咱的不太兼容-- 首先有一个叫做闵可夫斯基和的东西,就是给你两个点集\(A,B\),要你求一个点集\(C=\{x+y ...

  8. Vue-think脚手架

    准备重构的项目,原来的后台是thinkPHP写的,刚刚摸VUE,不知道里面数据调用原理,想先安装vuethink学习一下. 结果安装半天,npm run dev的时候报错,尝试了很多方法,各种重装,看 ...

  9. there is already 'RtController' bean method 项目报错

    今天开发项目时候发现项目报错启动的时候,也没有具体指的是哪一行报错,其实很简单的知道,首先看下报错信息: there is already 'RtController' bean method pub ...

  10. Markdown 语法快速入门手册

    Markdown 是一种轻量级标记语言,能将文本换成有效的XHTML(或者HTML)文档,它的目标是实现易读易写,成为一种适用于网络的书写语言. Markdown 语法简洁明了,易于掌握,所以用它来写 ...