npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ebatis

v1.2.10

Published

Ebatis is a relational database data access framework For Node.js. It's like mybatis. The biggest feature of ebatis is to support dynamic SQL, transaction control, simple configuration and easy to handle.

Downloads

73

Readme

ebatis

Ebatis is a relational database data access framework For Node.js.

The biggest feature of ebatis is to support dynamic SQL, transaction control, simple configuration and easy to handle.

Note:

  1. ebatis requires Node.js to support es6/7 syntax, and if the version is too low, it is recommended to upgrade the node version;

  2. currently only support the Mysql database.

切换为中文

table of contents

Hello World
Configuration
Api
- Api Ebatis
- Api SqlChain
- Api SqlChainFactory
- Api Mapper
Dynamic Sql
Example

How to use

Install module:

npm install ebatis

# or

npm install -g ebatis

Use it:

let Ebatis = require('ebatis');
let ebatis = Ebatis();

# set root path
ebatis.setRootPath(__dirname);

# load configuration info
ebatis.loadConfig(ebatis_config);

Simple Configuration:

config by js
exports = module.exports = {
    datasource : {
        _name : 'default',                 // datasource name, default 'default'
        _type : 'mysql',                   // datasource type, requires
        _mode : 'pool',                    // datasource mode, [connection | pool], requires
        host : '127.0.0.1',            // other parameter refence mysql configuration
        user : 'root',
        password : '**********',
        database : 'test'
    },
    sql : {                                               
        mapper : `./*.xml`                 // dynamic sql xml
    },
    sqlchain : {
        transaction : true,                // open transaction
        timeout : -1                       // timeout time, default 30000ms, if timeout > 0, Invalid timeout action.
    }
};
config by json
{
    "datasource" : {
        "_name" : "default",                
        "_type" : "mysql",
        "_mode" : "pool",
        "host" : "127.0.0.1",
        "user" : "root",
        "password" : "**********",
        "database" : "test"
    },
    "sql" : {                                               
        "mapper" : "./*.xml"
    },
    "sqlchain" : {
        "transaction" : true, 
        "timeout" : -1
    }
}
config by yaml
datasource : 
  _name : default           
  _type : mysql  
  _mode : pool
  host : 127.0.0.1,
  user : root,
  password : **********
  database : test

sql :                                               
  mapper : ./*.xml

sqlchain :
  transaction : true, 
  timeout : -1

Example

1. 编写Ebatis配置文件

ebatis_config.yml

datasource :                                # 数据源配置信息
  _name : default                           # 数据源名称
  _type : mysql                             # 数据源类型 (暂时只支持mysql)
  _mode : pool                              # 数据源模式  connection | pool | cluster, default connection
  host : 127.0.0.1                      # 数据源ip地址
  user : root
  password : **********
  database : test
  connectionLimit : 50

sql :                                       # sql配置信息
  mapper : ./sql/*.xml                      # mapper文件位置,已rootpath为基准

  # or
  mapper :
    - ./sql/*.xml 
    - ./sql/*.xml 

sqlchain :                                  # sqlchain配置信息
  transaction : true                        # 开启事务
  timeout : 3000                            # 设置超时时间,到期后没有执行完毕,自动回滚
  printsql : false                          # 是否打印执行sql的信息

2. 编写Mapper文件

sql/user.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqls
        PUBLIC "-//ebatis.muzin.cn//DTD Config 3.0//EN"
        "http://mithub.oss-cn-beijing.aliyuncs.com/ebatis/ebatis-sqls.dtd">

<sqls namespace="user" >

    <sql id="table_name">t_user</sql>

    <sql id="field_all_names">*</sql>

    <!-- get all user  -->
    <select id="getAllUsers" >
        SELECT
            <include ref="field_all_names"/>
        FROM
            <include ref="table_name"/>
    </select>

    <select id="getUsers" param="user">
        SELECT
            <include ref="field_all_names"/>
        FROM
            <include ref="table_name"/>
        <where>
            <if test="!~[null, ''].indexOf( user.id )">
                id &lt;= ${ user.id }
            </if>
        </where>
    </select>

    <!-- insert user -->
    <insert id="addUser" param="user">
        INSERT INTO t_user
        <for suffix="(" separate=", " prefix=")" var="item of Object.keys(user) ">
            #{ item }
        </for>
        <for suffix=" VALUES(" separate=", " prefix=")" var="item of Object.values(user) ">
            ${ item }
        </for>
    </insert>

    <!-- get users by type-->
    <select id="getUsersByType" param="user, type">
        SELECT
        *
        FROM
        t_user
        <where>
            <choose>
                <when test="type == 1">
                    <if test="user.name != null">
                        type = 1
                    </if>
                </when>
                <when test="type == 2">
                    type = 2
                </when>
                <when test="type == 3">
                    type = 3
                </when>
                <otherwise>
                    type = 0
                </otherwise>
            </choose>
        </where>
    </select>

    <!-- add users -->
    <insert id="addUsers" param="users">
        INSERT INTO t_user
        <for suffix="(" separate=", " prefix=")" var="item of Object.keys(users[0])">
            #{ item }
        </for>
        VALUES
        <for separate=", " var="user of users">
            <for suffix="(" separate=", " prefix=")" var="item of Object.values(user)">
                ${ item }
            </for>
        </for>
    </insert>

    <!-- update user info -->
    <update id="updateUser" param="user">
        update
            <include ref="table_name" />
        <set>
            <if test="user.name != null and user.name != ''">
                name = ${ user.name }
            </if>
            <if test="user.age != null and user.age != ''">
                age = ${ user.age }
            </if>
        </set>
        <where>
            id = ${ user.id }
            <if test="user.name != null">
                name = ${ user.name }
            </if>
        </where>

    </update>

    <!-- delete user -->
    <delete id="deleteUser" param="id">
        DELETE FROM
            <include ref="table_name" />
        WHERE
            id = ${ id }
    </delete>

</sqls>
2.1 生成Mapper对应的js接口文件

在程序启动后会在xml所在的目录生成对应的js接口文件,直接引入js接口文件,即可调用动态sql。

如下:

/**
 * Ebatis generator mapper, it's not editable.
 */
let userMapper = {

	/**
	 * @returns {MapperInterface}
	 */
	getAllUsers : function getAllUsers () { 
		return { };
	},

	/**
	 * @returns {MapperInterface}
	 */
	getUsers : function getUsers (user) { 
		return { };
	},

	/**
	 * @returns {MapperInterface}
	 */
	addUser : function addUser (user) { 
		return { };
	},

	/**
	 * @returns {MapperInterface}
	 */
	getUsersByType : function getUsersByType (user, type) { 
		return { };
	},

	/**
	 * @returns {MapperInterface}
	 */
	addUsers : function addUsers (users) { 
		return { };
	},

	/**
	 * @returns {MapperInterface}
	 */
	updateUser : function updateUser (user) { 
		return { };
	},

	/**
	 * @returns {MapperInterface}
	 */
	deleteUser : function deleteUser (id) { 
		return { };
	},
};

exports = module.exports = userMapper;

3. 编写逻辑代码

Callback式逻辑代码


var Ebatis          = require('ebatis');
var SqlChainFactory = Ebatis.SqlChainFactory;


var ebatis = Ebatis();

// set root path
ebatis.setRootPath(__dirname);

//ebatis.loadConfig(ebatis_config);
ebatis.loadConfigFile('./ebatis_config.yml');

// 开启开发模式,自动生成Mapper的js接口文件
ebatis.dev(true);

process.on('uncaughtException',function(e){
    console.log(e.stack);
});

// 当ebatis完成时,调用
ebatis.finish(function(){
    
    // 导入Mapper的js接口文件
    var UserMapper      = require('./sql/user');
    
    console.log('finish');
    console.time('use time');
    
    var sqlChain = SqlChainFactory.createSqlChain();
    // 获取user命名空间下getUsers的Mapper
    var getUsers = sqlChain.getMapper('user.getUsers');
    // or
    var getUsers = ebatis.getMapper('user.getUsers');

    console.time('one');

    // 单独执行的动态sql没有事务
    getUsers.param.promise({id : 20}).then((list)=>{
        console.log('list');
        console.log(list);
    });

    console.time('g sql');
    let s = getUsers.toFunction()({id:20});
    console.timeEnd('g sql');
    
    sqlChain
        .exec(UserMapper.getUsers({id : 100}))
        .exec('select * from t_user where id = 2')
        .exec(s, function(err,result){
            console.log('getAllUsers');

            setTimeout(function(){
                sqlChain
                    .exec(s, function(err,result){
                        console.log('getAllUsers1');

                    })
                    .end(function(err, scope){
                        console.log('end');
                        console.log(scope);
                        console.timeEnd('use time');
                    });
                    // 如果不设置结束后的回调,尽量调用SqlChain的close函数
                    // 不建议等待SqlChain超时,会影响数据不能及时提交
            },3000);

        });

    /*(async function(){
        try {
            let scope = ebatis.getScope();
            let getUsers = ebatis.getMapper('user.getUsers');
            let a = await getUsers.param.promise({id : 100});
            console.log(a);
        }catch(e){
            console.log(e);
        }
    })();*/
});

[async/await/Promise式逻辑代码

var Ebatis          = require('ebatis');
var SqlChainFactory = Ebatis.SqlChainFactory;


var ebatis = Ebatis();

// set root path
ebatis.setRootPath(__dirname);

//ebatis.loadConfig(ebatis_config);
ebatis.loadConfigFile('./ebatis_config.yml');

// 开启开发模式,自动生成Mapper的js接口文件
ebatis.dev(true);

process.on('uncaughtException',function(e){
    console.log(e.stack);
});

(async function(){
    
    // 当ebatis完成时,调用
    await ebatis.finish.promise();
    
    // 导入Mapper的js接口文件
    var UserMapper      = require('./sql/user');
    
    console.log('finish');
    console.time('use time');
    
    var sqlChain = SqlChainFactory.createSqlChain();
    // 获取user命名空间下getUsers的Mapper
    var getUsers = sqlChain.getMapper('user.getUsers');
    // or
    var getUsers = ebatis.getMapper('user.getUsers');

    console.time('one');

    // 单独执行的动态sql没有事务
    getUsers.param.promise({id : 20}).then((list)=>{
        console.log('list');
        console.log(list);
    });

    await sqlChain.exec.promise('select * from t_user where id = 2');
    var users = await sqlChain.exec.promise(UserMapper.getUsers({id : 100}));
    console.log(users);
    console.log('getAllUsers');

    /*(async function(){
        try {
            let scope = ebatis.getScope();
            let getUsers = ebatis.getMapper('user.getUsers');
            let a = await getUsers.param.promise({id : 100});
            console.log(a);
        }catch(e){
            console.log(e);
        }
    })();*/
    
})();