项目简介
为nodejs访问mysql数据库提供强大流畅的api的工具类库,目标是希望访问数据库逻辑都能使用一行代码完成,让访问数据库变得更加简单优雅。
使用说明
1. 初始化配置
初始化如下
const DbClient = ; const db = host : '127.0.0.1' user : 'root' password : 'secret' database : 'my_db';
不同框架的使用示例:
2. 构造查询
- 2.1 查询单个值
// 查询单个值,比如下面例子返回的是数字51,满足条件的数据条数const result = await db ;
- 2.2 查询单条数据
// 查询单条数据,返回的是 result = {id:12, name: '测试页面', ....}const result = await db // id = 12 ;
- 2.3 查询多条数据
// 查询多条数据 返回的是 ressult = [{...}, {...}];const result = await db // name like '%测试页面%' ;
- 2.4 服务端分页查询
// 查询多条数据(服务端分页) 返回的是 ressult = {total: 100, rows:[{...}, {...}]};const result = await db // id < 100 ; //每页 20 条,取第 3 页
- 2.5 多表关联查询
// 多表关联查询const result = await db ;
- 2.6 查询除了支持各种多表join外,当然还支持groupby orderby having等复杂查询操作
const result = await db // date < now() // creator = 'huisheng.lhs" ; //默认每页20条,取第2页
- 2.7 转为sql自己处理
const result = await db ; ;
3. 构造插入
const task = action: "testA" description: "desc1" state: "123" result: "result1"; // 插入一条数据const result = await db ; // 也支持直接写字段,支持增加字段const result = await db ; // 插入多条数据const tasks = task1 taks2 task3 ;const result = await db ; // 支持增加或覆盖字段const result = await db // 循环赋值给每一行数据 ;
4. 构造更新
const task = action: "testA" description: "desc1" state: "123" result: "updateResult"; //更新数据const result = await db ; //更新数据,支持增加字段const result = await db ; // 字面量使用 db.literals.now 等价于 db.literal("now()")const result = await db ;
5. 构造删除
//删除id为1的数据const result = await db ;
6. 自定义SQL
// 执行自定义SQLconst result = await db ;
6. 事务控制
const trans = await db; try // 数据库操作 // await trans.insert(...) // await trans.update(...) await trans; catch e await trans;
7. 复杂条件查询设计
7.1 查询条件所有参数说明
// 查询条件所有参数const result = await db // 支持的所有参数 //支持对象参数 ; // 复杂查询条件const result = await db // id > 100 //name like '%test%' // tech='tech_value' 当 tech 为空时,不做为查询条件 ;
- field 字段名
- value 传入值
- operator 操作符,默认equal4
- ignore 是否加为条件,返回false时则忽略该条件
- join 连接符号(and or),默认为and
7.2 操作逻辑定义operator
该参数很好理解,默认值为equal,支持传字符串或传入函数,传入字符串则会匹配到已定义的逻辑,
const result = await db ; // id < 100 // group_code = "dacu" ;
大家能理解operator是为拼接查询条件使用的逻辑封装,复杂条件的拓展能力都可以靠自定义的operator来完成。其函数的形式如下:
const customOperator = { if condition return sql: '?? = ?' arg: field value ; else return sql: '?? > ?' arg: field value ; }; // 可直接使用也可注册到全局const config = db;config;
7.3 是否加为条件ignore
这个需要解释下,当满足xx条件时则忽略该查询条件,ignore设计的初衷是为了简化代码,比如以下代码是很常见的,界面上有输入值则查询,没有输入值时不做为查询条件:
const query = db ; ; if name query; if query const result = await query;
上面的代码使用ignore时则可简化为:
const result = await db //使用内置 ifHave,如果name为非空值时才加为条件 //使用内置 ifNumber ;
支持传字符串或传入函数,传入字符串则会匹配到已定义的逻辑,其函数的形式如下:
const customIgnore = { if ... return false; return true;}; //也可以注册到全局使用const config = db;config;
7.4 查询条件优先级支持
// where a = 1 and (b = 1 or c < 1) and d = 1const result = await db ;
7.5 真实场景中的复杂查询示例
// 复杂查询,真实场景示例,项目中拓展了keyword、setinset等operator及ignoreconst result = await appdb // 关键字模糊查询 // 关键字在这些字段中模糊查询 // 关键字中输入了数字时当作id查询 // 精确查询 // TAB类型 我的页面own、我的收藏fav、所有页面all // 分页查询 ;
8. 自定义配置
const config = db; // 自定义operatorconfig; // 自定义ignoreconfig; // 监听事件 执行前config; // 监听事件 执行后config; // 监听事件 执行出错config;
9. 内置的operator及ignore
-
- eq (equal)
- ne (not equal)
- in (in)
- gt (greater than)
- ge (greater than or equal)
- lt (less than)
- le (less than or equal)
- isnull (is null)
- isnotnull (is not null)
- like (like)
- startwith (start with)
- endwith (end with)
- between (between)
- findinset (find_in_set(value, field))
- insetfind (find_in_set(field, value))
- sql (custom sql)
- keywords (keywords query)
-
- ifHave (如果有值则加为条件)
- ifNumber (如果是数值则加为条件)