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. C# socket请求的名称有效 但是找不到请求的类型的数据

    程序以前在xp下运行一直良好,但将安装在win7下面却出现"请求的名称有效 但是找不到请求的类型的数据"错误,程序底层通信是基于socket,时间久了就会出现系统黑屏死机,但并不知 ...

  2. 看了这篇Dubbo RPC面试题,让天下没有难面的面试题!

      前言: RPC非常重要,很多人面试的时候都挂在了这个地方!你要是还不懂RPC是什么?他的基本原理是什么?你一定要把下边的内容记起来!好好研究一下!特别是文中给出的一张关于RPC的基本流程图,重点中 ...

  3. HSSFWorkbook导出表格使用

    HSSFWorkbook                      excel的文档对象 HSSFSheet                         excel的表单 HSSFRow      ...

  4. 【转】C#日期时间格式化

    源地址:https://www.cnblogs.com/polk6/p/5465088.html

  5. 简述ref与out区别

    1.相同点:两者都是按地址(引用)传递的,使用后都将改变原来参数的数值. 2.区别:ref可以把参数的数值传递进函数,但是out是要把参数清空(声明时不必显示初始化),就是说你无法把一个数值从out传 ...

  6. [jvm]垃圾回收与内存分配策略

    一.垃圾回收算法 概述 JVM中,当创建的对象不再被使用的时候,此时我们认为他是无用的“垃圾”:在现代主流的商用jvm中,都是通过可达性分析来判断对象是否存活的.这个算法的基本思想是通过一系列“GCR ...

  7. SDUT OJ 顺序表应用3:元素位置互换之移位算法

    顺序表应用3:元素位置互换之移位算法 Time Limit: 1000 ms Memory Limit: 570 KiB Submit Statistic Discuss Problem Descri ...

  8. 洛谷 P1546 最短网络 Agri-Net(最小生成树)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P1546 首先不难看出这道题的思想是用了最小生成树,但是这道题有难点: 1.读题读不明白 2.不会读入 ...

  9. RNA-seq分析htseq-count的使用

    HTSeq作为一款可以处理高通量数据的python包,由Simon Anders, Paul Theodor Pyl, Wolfgang Huber等人携手推出HTSeq — A Python fra ...

  10. C++_函数1-编程的基本模块函数

    以下是<C++ Primer Plus>中第七章的内容: 使用C++函数的3个步骤: 提供函数定义 提供函数原型 调用函数 7.1.1 定义函数 函数分成两类:没有返回值的函数.有返回值的 ...