nodebatis
Version:
a sql style orm for nodejs
308 lines (218 loc) • 7.92 kB
Markdown
# nodebatis [](https://www.npmjs.com/package/nodebatis) [](https://www.npmjs.com/package/nodebatis)
A sql style orm lib for nodejs(similar to mybatis on java)
Only support mysql, others are under development.
Only support node > v7.6.0. If you use node(< v7.6.0), you can use nodebatis(<= v2.2.1)(NOT RECOMMENDED).
# 适用场景
如果你觉得传统 ORM 框架笨笨的,恭喜你找到了答案。
在 NodeBatis 里,SQL 作为一等公民对待,直接写 SQL 是最灵活的方式。
# Getting Started
## Installation
```
npm install nodebatis --save
```
## 创建连接池
```
import NodeBatis from 'nodebatis'
import path from 'path'
const nodebatis = new NodeBatis(path.resolve(__dirname, '../yaml'), {
debug: true,
dialect: 'mysql',
host: '127.0.0.1',
port: 3306,
database: 'test',
user: 'root',
password: 'root'
})
```
## 定义 SQL 语句
test.yml
```
namespace: 'test'
findByAge:
- select name, age from test where
- age > :age
```
## 执行 SQL 语句
model.js
```
let findByAge = async () => {
let result = await nodebatis.execute('test.findByAge', {
age: 18
})
return result
}
findbyAge() //return [{name: 'name1', age: 20}]
```
# 如何编写 SQL 语句定义文件
定义 SQL 语句采用 yaml 语法。一个 SQL 语句定义文件就是一个 yaml 文档。
如果你还不熟悉 yaml,可以参考这篇教程:[YAML 语言教程](http://www.ruanyifeng.com/blog/2016/07/yaml.html)
SQL yaml 文档的约定的规则很简单。
1. 开头需要写 `namespace: xxx`, `xxx` 为自己定义的命名空间。
2. 定义 SQL 语句 `key: sql` , `namespace.key` 就是定义的 SQL 语句的唯一索引。
3. SQL 语句中的参数。
* `:paramName`, `paramName` 为执行 SQL 语句时传递的参数名。
* `::ddl`, `ddl` 为 DDL 语句,不会对参数进行过滤。
* `{{namespace.key}}`, SQL 语句继承,会获取到 `namespace.key` 的 SQL 语句填充到此处。
4. 条件判断。
```
if:
test: expression
sql: statements
```
当 expression 为 true 是,对应的 sql 会添加到 sql 语句中。 expression 就是一个 JS 语句, 可以通过 `:paramName` 传递参数。
5. for 循环
```
for:
array: array,
sql: statements
seperator: ','
```
* `array`, 要遍历的数组,数组内的数据必须是对象。
* `sql`, 每次遍历要填充的 sql,使用 :key 的形式引用 array 中的对象的数据。
* `seperator`, 每次遍历填充的 sql 之间的分隔符。
Demo:
demo.yml
```
//namespace: xxx
namespace: 'demo'
//key: sql
test: 'select * from demo'
// param
paramDemo:
- select * from demo
- where name = :paramName
- and age > 18
// ddl param
ddlDemo: create table ::tableName (id int primary key, name vachar(32))
//expression
expressionDemo:
- select * from demo where
- if:
test: :paramName == 'nodebatis' && :age > 18
sql: and sex = 'man'
//当传入的参数 paramName 为 nodebatis 并且 age 大于 18 时,生成的 SQL 语句为: select * from demo where sex = 'man'
// extends
attrs: id, name, age
extendsDemo: select {{ demo.attrs }} from demo // select id ,name, age from demo
// for
batchInsert:
- insert into test(name, age) values
- for:
array: data
sql: (:name, :age)
seperator: ','
```
# API
约定 `NodeBatis` 是类,`nodebatis` 是 `NodeBatis` 实例化的一个对象。
## NodeBatis(ymlDir, config)
使用 NodeBatis 时,要做的第一件事就是实例化 NodeBatis 对象
### ymlDir { String }
定义 SQL 的 yml 文件存放目录
### config { Object }
配置信息
#### config.debug { Boolean }
默认为 false,当为 true 时,会打印执行的 sql 语句
#### config.dialect { String }
支持的数据库方言,目前支持的配置有:mysql
#### config.host { String }
数据库地址
#### config.port { Int }
数据库端口地址
#### config.database { String }
要连接的数据库名称
#### config.user { String }
连接数据库的用户名
#### config.password { String }
连接数据库的用户密码
#### config.charset { String }
默认为:utf8,数据库连接的字符编码
#### config.camelCase { Boolean }
默认为:false ,为 true 时将结果集中下划线分割的属性名(比如:user_name),映射为小驼峰的形式(userName)
#### pool
连接池配置, 连接池的配置支持情况取决于数据库连接驱动的支持情况。
#### pool.minSize { Int }
连接池的最小连接数, 默认为 5
#### pool.maxSize { Int }
连接池的最大连接数, 默认为 20
#### pool.acquireIncrement { Int }
连接数不够时,一次创建连接的数量,默认为 5
## nodebatis.beginTransaction()
获取一个支持事务的链接
## nodebatis.getTransaction()
获取一个支持事务的 nodebatis 实例,其实就是一系列的语法糖。使用方法详见 test 目录。
* 返回一个数据库连接
## nodebatis.commit(connection)
提交事务
* connection 为要操作的数据库连接
## nodebatis.rollback(connection)
回滚事务
* connection 为要操作的数据库连接
## nodebatis.releaseConn(connection)
释放数据库连接
* connection 为要操作的数据库连接
## nodebatis.query(key, data[, connection])
执行 SQL 语句
* key 为要执行的 sql 语句的 key,即:namespace.xxx
* data 为传递的数据
* connection 为开启事务时,获取的支持事务的链接
* 返回对应数据库驱动执行 sql 语句后的结果集
## nodebatis.execute(key, data)
执行 SQL 语句 建议使用更语义化的 query 方法
## nodebatis.insert(tableName, data[, connection])
执行插入数据
* tablename 为要操作的表名
* data 为传递的数据对象,data 的 key 为对应表的字段,值为要插入的值
* connection 为开启事务时,获取的支持事务的链接
## nodebatis.del(tableName, id, idKey = "id"[, connection])
删除数据
* tablename 为要操作的表名
* id 为要删除的主键值
* idKey 为主键名称
* connection 为开启事务时,获取的支持事务的链接
## nodebatis.select(tableName, queryData [, connection])
根据 queryData 生成查询语句,只支持单表查询
* tablename 为要操作的表名
* queryData 为查询条件对象,支持如下形式: `{ name: 'test' }, { name: { $eq: 'test' } }`, `$eq 为 =`, 还支持如下条件:`$eq, $neq, $lt, $lte, $gt, $gte, $like, $in`
* connection 为开启事务时,获取的支持事务的链接
## nodebatis.selectByPage(tableName, queryData, start = 0, limit = 10, orderBy, sort [, connection])
根据 queryData 生成分页查询语句,只支持单表查询
* tablename 为要操作的表名
* queryData 为查询条件对象
## nodebatis.update(tableName, data, idKey = "id" | queryData [, connection])
更新数据
* tablename 为要操作的表名
* data 为传递的数据对象,data 的 key 为对应表的字段,值为要插入的值
* idKey 为主键名称 | queryData 为查询条件对象
* connection 为开启事务时,获取的支持事务的链接
## nodebatis.count(tableName, queryData [, connection])
根据 queryData 生成 count 语句,只支持单表
* tablename 为要操作的表名
* queryData 为查询条件对象
## NodeBatis.Types
支持的数据类型,用户验证返回的结果集是否符合定义的数据模型。
```
STRING
NUMBER
INT
FLOAT
DECIMAL
BOOLEAN
DATE
UUID
URL
IP
EMAIL
MONGOID
JSON
MATCHES //正则匹配,default is /\.*/
```
## nodebatis.define(key, model)
定义数据模型,用于校验对象属性的数据类型
* key 为对应的 sql 语句的 key,支持正则匹配
* model 为要定义的数据模型
```
nodebatis.define('namespace.xxx', {
name: NodeBatis.Types.STRING,
age: NodeBatis.Types.INT
})
```