nodebatis
v2.4.2
Published
a sql style orm for nodejs
Downloads
60
Readme
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 语言教程
SQL yaml 文档的约定的规则很简单。
- 开头需要写
namespace: xxx
,xxx
为自己定义的命名空间。 - 定义 SQL 语句
key: sql
,namespace.key
就是定义的 SQL 语句的唯一索引。 - SQL 语句中的参数。
:paramName
,paramName
为执行 SQL 语句时传递的参数名。::ddl
,ddl
为 DDL 语句,不会对参数进行过滤。{{namespace.key}}
, SQL 语句继承,会获取到namespace.key
的 SQL 语句填充到此处。
- 条件判断。
if:
test: expression
sql: statements
当 expression 为 true 是,对应的 sql 会添加到 sql 语句中。 expression 就是一个 JS 语句, 可以通过 :paramName
传递参数。
- 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
})