BeetlSQL,简单和强大数据库访问工具

同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应用。

  • SQL 以更简洁的方式,Markdown方式集中管理,同时方便程序开发和数据库SQL调试
  • 数据模型支持Pojo,也支持Map/List这种无模型的模型
  • SQL 模板基于Beetl实现,更容易写和调试,以及扩展
  • 无需注解,自动生成大量内置SQL,轻易完成增删改查功能
  • 支持跨数据库平台,开发者所需工作减少到最小
  • 具备Interceptor功能,可以调试,性能诊断SQL,以及扩展其他功能
  • 内置支持主从数据库,通过扩展,可以支持更复杂的分库分表逻辑

代码例子

List<User>  list = SqlManager.getSQLScript("selectUser").select(paras,User.class);
User user = SqlManager.getSql(User.class,SELECT_BY_ID).unque(id);

SQL例子

selectUser
===
        select * from user where 1=1
        @if(user.age==1){
        and age = #user.age#
        @}

selectAll
===
        select * from user
        @use("selectWhere");

selectWhere
===
        where  age = #age#

Markdown方式管理

BeetlSQL集中管理SQL语句,SQL 可以按照业务逻辑放到一个文件里,文件可以按照模块逻辑放到一个目录下。文件格式抛弃了XML格式,采用了Markdown,原因是

  • XML格式过于复杂,书写不方便
  • XML 格式有保留符号,写SQL的时候也不方便,如常用的< 符号 必须转义

目前SQL文件格式如下

文件一些说明,放在头部可有可无,如果有说明,可以是任意文字
        SQL标示
        ===
        SQL语句 

        SQL标示2
        ===
        SQL语句 2

所有SQL文件建议放到一个db目录,db目录有多个子目录,表示数据库类型,比如db下有common,这是公共SQL语句 还有mysql,oralce。当程序获取SQL语句得时候,先会根据数据库找特定数据库下的sql语句,如果未找到,会寻找common下的。如下代码

SqlScript sql = SqlManager.getSql("sys.user.update");

SqlManager 会根据当前使用的数据库,先找db/mysql/sys/user.md 文件,确认是否有update语句,如果没有,则会寻找db/common/sys/user.md

丰富的数据模型支持

BeetlSql 适合各种类型的引用,对于大中小型应用,模型通常是Pojo,这样易于维护和与三方系统交互,对于特小型项目,往往不需要严格的模型,表示业务实体通常是Map/List 组合。SQL语句的输入可以是Pojo或者Map,SQL语句执行结果也可以映射到Pojo和Map。

SqlScript sql = SqlManager.getSql("user.update");
        int result = sql.update(user);

        SqlScript sql = SqlManager.getSql("user.select");
        List<User> list = sql.select(user,User.class);

        SqlScript sql = SqlManager.getSql("user.select");
        Map paras = new HashMap();
        paras.put("age",11);
        User user = sql.single(paras,User.class);
        //or
        Map user = sql.single(paras,Map.class);

SQL 模板基于Beetl实现,更容易写和调试,以及扩展

SQL语句可以动态生成,基于Beetl语言,这是因为

  • beetl执行效率业界出名的高效 ,因此对于基于模板的动态sql语句,采用beetl非常合适
  • beetl 语法简单易用,可以通过半猜半式的方式实现,杜绝myBatis这样难懂难记得语法。BeetlSql学习曲线几乎没有
  • 利用beetl可以定制定界符号,完全可以将sql模板定界符好定义为数据库sql注释符号,这样容易在数据库中测试,如下也是sql模板(定义定界符为"--" 和 "null",null是回车意思);
    selectByCond
        ===
        select * form user where 1=1
        --if(age!=null)
        age=#age#
        --}

  • beetl 错误提示非常友好,减少写SQL脚本编写维护时间
  • beetl 能容易与本地类交互(直接访问Java类),能执行一些具体的业务逻辑 ,也可以直接在sql模板中写入模型常量,即使sql重构,也会提前解析报错
  • beetl语句易于扩展,提供各种函数,比如分表逻辑函数,跨数据库的公共函数等

无需注解,自动生成大量内置SQL,轻易完成增删改查功能

BeetlSql虽然不是一个O/R Mapping 工具,但能根据默认约定,生成大量常用SQl而几乎不需要注解(对于oralce,需要注解SeqId(name="seqName")),BeetlSql 根据输入的class,自动能生成如下sql

  • select_by_id : 根据主键查询
  • select_by_template: 将实例变量作为模板查询,如果其变量的属性为空,则不计入查询条件
  • update_by_id: 根据主键更新
  • update_by_template:根据模板更新
  • delete_by_id: 根据主键查询
  • delete_by_template:根据模板查询
  • insert: 自动插入,如果没有主键Annotaion,则会寻找数据库找到主键,并认为是自增主键。总共有如下三种主键Annotation
    SeqId 用于oralce
        AutoId,用于自增。这是主键默认设置
        AssignId,代码指定主键

支持跨数据库平台,开发者所需工作减少到最小

如前所述,BeetlSql 可以通过sql文件的管理和搜索来支持跨数据库开发,如前所述,先搜索特定数据库,然后再查找common。另外BeetlSql也提供了一些夸数据库解决方案

  • DbStyle 描述了数据库特性,注入insert语句,翻页语句都通过其子类完成,用户无需操心
  • 提供一些默认的函数扩展,代替各个数据库的函数,如时间和时间操作函数date等

具备Interceptor功能,可以调试,性能诊断SQL,以及扩展其他功能

BeetlSql可以在执行sql前后执行一系列的Intercetor,从而有机会执行各种扩展和监控,这比已知的通过数据库连接池做Interceptor更加容易。如下Interceptor都是有可能的

  • 监控sql执行较长时间语句,打印并收集(已完成)
  • 对每一条sql语句执行后输出其sql和参数,也可以根据条件只输出特定sql集合的sql。便于用户调试(已完成)
  • 对sql预计解析,汇总sql执行情况(未完成,需要集成第三方sql分析工具)
  • 数据库分表分库逻辑

内置支持主从数据库,通过扩展,可以支持更复杂的分库分表逻辑

BeetlSql管理数据源,如果只提供一个数据源,则认为读写均操作此数据源,如果提供多个,则默认第一个为写库,其他为读库。用户在开发代码的时候,无需关心操作的是哪个数据库,因为调用sqlScrip 的 select相关api的时候,总是去读取从库,add/update/delete 的时候,总是读取主库。

sqlScript.insert(user) // 操作主库,如果只配置了一个数据源,则无所谓主从
    sqlScript.selectById(id,User.class) //读取从库

当然,也可以根据自己具体逻辑来确定如果选择主从库,只需要扩展BeetlSql,这一切对开发者是透明的

开发者也可以通过在Sql 模板里完成分表逻辑而对使用者透明,如下sql语句

insert into
    #text("log"+date())#
    values () ...

    注:text函数直接输出表达式到sql语句,而不是输出?。

log表示按照一定规则分表,table可以根据输入的时间去确定是哪个表

select * from
    #text("log"+log.date)#
    where 

    注:text函数直接输出表达式到sql语句,而不是输出?。

同样,根据输入条件决定去哪个表,或者查询所有表

@ var tables = getLogTables();
    @ for(table in tables){
    select * from #text(table)#
    @       if(!tableLP.isLast) print("union");
    @}
    where name = #name#

BeetlSQL 仍然还在开发过程中,因为业余时间有限,原本计划的1个月开发完毕,已经耽误了数周了,但相信8月底或者9月初就会有一个版本出来,希望beetl粉丝继续支持

时间: 2024-10-08 08:11:34

BeetlSQL,简单和强大数据库访问工具的相关文章

数据库访问工具 DBUtl(公孙二狗)

数据库访问工具 DBUtil DBUtil 用于简化数据库的访问,只要准备好配置文件,调用 DBUtil 的静态函数就能直接得到查询数据库的结果. 本文主要内容有: 数据库访问的思考 DBUtil 实例 DBUtil 的 API DBUtil 的实现 把 SQL 语句放到文件里 ORMapping 1. 数据库访问的思考 以查询数据库中 id 为 1 的 user 为例,思考访问数据库存在的问题以及优化. 常用的访问数据库为以下几步: 设置数据库驱动和连接名 设置数据库所在电脑的 IP,数据库名

SpringBoot数据库访问工具(JdbcTemplate、MyBatis、JPA、Hibernate)

SpringBoot数据库访问 关系型数据库访问(RDBMS) 采用JdbcTemplate.MyBatis.JPA.Hibernate等技术. 一.JdbcTemplate工具 1.在pom.xml添加boot-starter-jdbc定义<dependencies> 数据库驱动 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifac

配置简单功能强大的excel工具类搞定excel导入导出工具类(一)

对于J2EE项目导入导出Excel是最普通和实用功能,本工具类使用步骤简单,功能强大,只需要对实体类进行简单的注解就能实现导入导出功能,导入导出操作的都是实体对象. 请看一下这个类都有哪些功能:????? 1.实体属性配置了注解就能导出到excel中,每个属性都对应一列.????? 2.列名称可以通过注解配置.????? 3.导出到哪一列可以通过注解配置.????? 4.鼠标移动到该列时提示信息可以通过注解配置.????? 5.用注解设置只能下拉选择不能随意填写功能.???? ? 6.用注解设置

DataAccess通用数据库访问类,简单易用,功能强悍

以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展datarow转实体类,也可以搭配dapper.net实现更强大的功能. /// <summary> /// 通用数据库访问类,支持多种数据库,无直接依赖某个数据库组件 /// 作者:左文俊 /// 日期:2016-6-3 /// </summary> public class DataAc

C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看

数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键关系 2.创建新的C#项目,创建 数据库连接类 与 数据库操作方法 a.引用数据库 using System.Data.SqlClient;    b.创建数据库连接类:先进行编写连接字符串,在实例化连接类 c.创建数据库操作方法(此处不是实例化类)    d.打开数据库 → 执行操作 → 关闭数据

[开源].NET数据库访问框架Chloe.ORM

前言 13年毕业之际,进入第一家公司实习,接触了 EntityFramework,当时就觉得这东西太牛了,访问数据库都可以做得这么轻松.优雅!毕竟那时还年轻,没见过世面.工作之前为了拿个实习机会混个工作证明,匆匆忙忙学了两个月的 C#,就这样,稀里糊涂的做了程序员,从此走上了一条不归路.那会也只知道 SqlHelper,DataTable.ORM?太高档上,没听说过.虽然在第一家公司只呆了两个月,但让我认识了 EntityFramework,从此也走上了 ORM 的不归路...纯纯的实体,增改删

数据访问工具 DAF 中 ResourceIDService 服务的接口 设计与实现

http://www.paper.edu.cn- 1 -数据访问工具 DAF 中 ResourceIDService 服务的接口设计与实现服务的接口设计与实现陶昕,高锦标华东交通大学信息工程学院,南昌(330013)E-mail:[email protected]摘 要:ResourceID 是 64 位整型数据,是用来定位能量系统中唯一性资源的标识,ResourceIDService 服务是 Data Access Facility 规范简称为 DAF 中的一个重要服务接口,提供了 Resou

强大的代码生成工具MyGeneration

MyGeneration是一个功能很强大的代码生成工具.通过编写包含各种类型脚本(C#,VB.Net,JScript,VBScript)的模板,通过数据库的表内容,生成你需要的各种代码.你可以用它来生成ORM的实体类,存储过程,SQL语句等等.我甚至用它来生成Asp.Net的页面(呵呵,我很懒). MyGeneration提供了强大的在线模版库,你可以通过访问其网站或者使用Template Browser中的在线模版功能按钮寻找你需要的模版.当然你也可以根据需要自己写模板. 我的NHiberna

SOCI、LiteSQL、POCO数据库访问类库对比

最近在做视频的开发,其中视频的设备接入管理服务器.流媒体管理服务器.中心服务器都涉及到了数据库的操作,同时需要兼容大多数版本的数据库,包括mysql.sqlite.oracle.公司原来使用的是ado来进行数据库的开发的, 但是考虑到目前需要兼容linux,目前使用Poco框架封装的数据库模块进行开发. 根据项目情况我对soci.litesql.poco这三个框架进行了简单的学习来确定选择那个框架. 1.soci soci是c++数据库访问类库,目前支持MySQL.Oracle.PostgreS