文档章节

5分钟 BeetlSQL 快速入门

闲大赋
 闲大赋
发布于 2018/04/08 15:33
字数 1040
阅读 2119
收藏 12

企业应用面临的问题

  • 高效编写数据库访问代码
    • 内置CRUD,不需要写SQL
    • 支持OR/Mapping
    • 悲观锁,乐观锁,逻辑删除等辅助支持等
  • 即支持简单的CRUD,也支持数十行,上百行SQL编写
  • 跨数据库平台支持,Oracle,Postgres,Mysql,以及SQLServer,DB2,H2,SQLLite,包括翻页,排序,还有各个厂商特殊语法
  • 易于维护
    • 重构支持
    • 易于修改
    • DBA友好
  • 丰富的调试手段,详细日志输出
  • Interceptor支持:具备SQL执行监控,SQL重写
  • 支持POJO或者Map,或者混合模型

BeetlSQL 使用方式

  • 内置API调用完成
  • Query链式查询
  • MarkDown 维护复杂SQL
  • 支持POJO,也支持Map或者混合模型
  • 主从支持和Sharding-JDBC分表分库集成

内置API

void insert(T entity);
void insertBatch(List<T> list);
int updateById(T entity);
int updateTemplateById(T entity);
int deleteById(Object key);
T unique(Object key);
T single(Object key);
T lock(Object key);
List<T> all();
List<T> template(T entity);
<T> T templateOne(T entity);
List<T> execute(String sql,Object... args);
int executeUpdate(String sql,Object... args );
Query<T> createQuery();
LambdaQuery<T> createLambdaQuery();

Query 链式操作

 Query<User> query = sqlManager.query(User.class);
        long count = query.andEq("name", "new name")
                .orEq("id", 1637).limit(1, 10).count();

Java8

LambdaQuery<User> query = sqlManager.lambdaQuery(User.class);
        User user = query.andEq(User::getId, 1641).single();
        user = query.andEq(User::getId, 1642).single();

处理复杂SQL

select 
@pageTag(){
u.*,o.name org_name
@}
from core_user u left join core_org o on u.org_id=o.id where 1=1 and u.del_flag = 0 
@//数据权限,该sql语句功能点  
and #function("user.query")#
@if(!isEmpty(orgId)){
    and  u.org_id =#orgId#
@}
 @if(!isEmpty(orgId)){
    and  u.org_id =#orgId#
@}
@if(!isEmpty(code)){
    and  u.code like #"%"+code+"%"#
@}
@if(!isEmpty(name)){
    and  u.name like #"%"+name+"%"#
@}
@if(!isEmpty(state)){
    and  u.state = #state#
@}

超简单的Dao实现

@SqlResource("console.user")
public interface UserConsoleDao extends BaseMapper<CoreUser> {

    PageQuery<CoreUser> queryByCondtion(PageQuery<CoreUser> query);

    void batchDelUserByIds( List<Long> ids);

    void batchUpdateUserState(List<Long> ids, GeneralStateEnum state);
    
    List<CoreUserRole> queryUserRole( Long id,Long orgId,Long roleId);

}
  • console.user 指明了SQL文件的位置,方法名对应了SQL片段名称。
  • 继承BaseMapper可以获得内置的CRUD等若干现成方法

调试

内置DebugInterceptor,也支持扩展,用于安全监控,性能监控,改写SQL

┏━━━━━ Debug [user.selectUserAndDepartment] ━━━
┣ SQL:     select * from user where 1 = 1
┣ 参数:     []
┣ 位置:     org.beetl.sql.test.QuickTest.main(QuickTest.java:47)
┣ 时间:     23ms
┣ 结果:     [3]
┗━━━━━ Debug [user.selectUserAndDepartment] ━━━

完美定位到业务场景发生代码,消费时间,输入输出。

简单支持复杂关系映射查询

selectUserAndDepartment
===
    select * from user where user_id=#userId#
    @ orm.single({"departmentId":"id"},"Department");
    @ orm.many({"id":"userId"},"user.selectRole","Role");

user.selectRole
===

    select r.* from user_role ur left join role r on ur.role_id=r.id

    where ur.user_id=#userId#

一个用户关联一个部门,关联多个角色

跨数据平台

  • 内置操作都是跨数据库平台,依赖不同的XXDBStyle
  • 提供翻页内置操作,支持不同数据库
  • MarkDown 管理不同数据库平台的有差异的SQL
    • sql/user.md,
    • sql/oracle/user.md
    • sql/mysql/user.md

一句话总结其他Dao工具问题

每个Dao工具都有特定使用范围和历史背景,没有最好的工具,只有适合自己的工具

  • JPA: 缺少管理复杂SQL能力,OR/Mapping 太强大容易用错。
  • Spring Data: 主要目的是SQL和NOSQL统一api,应用场景较为简单。其他缺点同JPA
  • MyBatis: 缺少内置功能,XML管理SQL不方便,出错调试难度大(没有自己的语法体系),OR/Mapping 功能弱
  • MyBatis-Plus: 国内基于Mybatis封装功能,具备内置功能和Lock,逻辑删除等方便的功能。缺点同BeetlSQL一样,都是国内个人维护。
  • JOOQ:应用场景较为简单,类似BeetlSQL Query功能,实际使用起来比较复杂
  • EBean:功能同JPA,比Hiberante弱,比JPA强。缺点同JPA
  • Spring-JDBCTemplate: 几乎没有提供企业应用需要的任何功能,还需要二次封装才能使用

总结BeetlSQL

  • 混合JPA,MyBatis,JOOQ功能
  • 创立Markdown管理复杂SQL

学习曲线

  • Hibernate 1个月入门,半年精通
  • JPA 一周入门,3个月年精通
  • MyBatis 一周入门,一个月精通
  • BeetlSQL 3天入门,2周精通

© 著作权归作者所有

共有 人打赏支持
闲大赋

闲大赋

粉丝 1176
博文 95
码字总数 88056
作品 10
西城
架构师
私信 提问
加载中

评论(1)

马丁的早晨
马丁的早晨
消灭零回复
hibernate,mybatis,beetlsql 全面比较

这是我的一个综合评分,总共分为12个单项,每个单项最高5分,最低0分。注意,评价只包含这些软件提供的标准功能,不包含第三方提供的功能,如代码生成等。 开发效率 hibernate 能获取数据库m...

闲大赋
2016/02/19
0
22
Beetl Starter 1.1.32 发布,增强定制接口

这次发布增强了Starter定制Beetl和BeetlSQL的接口 提供BeetlSqlCustomize类定制BeetlSQL 提供BeetlTemplateCustomize类定制Beetl POM beetl-framework-starter 是 SpringBoot 与 Beetl 和 Be......

闲大赋
2018/01/24
506
2
BeetlSQL 2.10.29 发布,Java Dao 工具

BeetlSQL 2.10.29 发布,更新如下: #IKPBA mapper 接口 支持default method,采用了liuzou1991 对mapper的优化,liuzhou也是提供BeetlSQL的Mapper功能作者之一 #IKPBB 代码生成优化,采用八...

闲大赋
2018/06/27
735
2
BeetlSQL 2.10.34 发布,Java Dao 工具

BeetlSQL 2.10.34 发布,改进内容包括: #IMVHW execute查询添加pageQUery #IMVGL join函数 的bug ,原来不支持int[] Maven Starter BeetlSql 和 JPA,MyBatis 性能比较 BeetlSql 和 JPA,M...

闲大赋
2018/09/20
1K
5
BeetlSQL 实现 ORMapping查询

我在 hibernate,mybatis,beetlsql 全面比较 中说明了BeetlSQL 在开发效率,维护性,跨数据库等各指标全面比hibernate 占优,但在ORM 方面不如Hibernate,这么多年来,hibernate已经成为Java的...

闲大赋
2016/08/21
0
11

没有更多内容

加载失败,请刷新页面

加载更多

CSS 选择器参考手册

CSS 选择器参考手册 选择器 描述 [attribute] 用于选取带有指定属性的元素。 [attribute=value] 用于选取带有指定属性和值的元素。 [attribute~=value] 用于选取属性值中包含指定词汇的元素。...

Jack088
今天
1
0
数据库篇一

数据库篇 第1章 数据库介绍 1.1 数据库概述  什么是数据库(DB:DataBase) 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据...

stars永恒
今天
2
0
Intellij IDEA中设置了jsp页面,但是在访问页面时却提示404

在Intellij IDEA中设置了spring boot的jsp页面,但是在访问时,却出现404,Not Found,经过查找资料后解决,步骤如下: 在Run/Debug Configurations面板中设置该程序的Working Directory选项...

uknow8692
昨天
3
0
day24:文档第五行增内容|每月1号压缩/etc/目录|过滤文本重复次数多的10个单词|人员分组|

1、在文本文档1.txt里第五行下面增加如下内容;两个方法; # This is a test file.# Test insert line into this file. 分析:给文档后增加内容,可以用sed 来搞定;也可以用while do done...

芬野de博客
昨天
3
0
深入理解JVM—JVM内存模型

深入理解JVM—JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存...

onedotdot
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部