5分钟 BeetlSQL 快速入门

企业应用面临的问题

  • 高效编写数据库访问代码
    • 内置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

1void insert(T entity); 2void insertBatch(List<T> list); 3int updateById(T entity); 4int updateTemplateById(T entity); 5int deleteById(Object key); 6T unique(Object key); 7T single(Object key); 8T lock(Object key); 9List<T> all(); 10List<T> template(T entity); 11<T> T templateOne(T entity); 12List<T> execute(String sql,Object... args); 13int executeUpdate(String sql,Object... args ); 14Query<T> createQuery(); 15LambdaQuery<T> createLambdaQuery();

Query 链式操作

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

Java8

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

处理复杂SQL

1select 2@pageTag(){ 3u.*,o.name org_name 4@} 5from core_user u left join core_org o on u.org_id=o.id where 1=1 and u.del_flag = 0 6@//数据权限,该sql语句功能点 7and #function("user.query")# 8@if(!isEmpty(orgId)){ 9 and u.org_id =#orgId# 10@} 11 @if(!isEmpty(orgId)){ 12 and u.org_id =#orgId# 13@} 14@if(!isEmpty(code)){ 15 and u.code like #"%"+code+"%"# 16@} 17@if(!isEmpty(name)){ 18 and u.name like #"%"+name+"%"# 19@} 20@if(!isEmpty(state)){ 21 and u.state = #state# 22@} 23

超简单的Dao实现

1@SqlResource("console.user") 2public interface UserConsoleDao extends BaseMapper<CoreUser> { 3 4 PageQuery<CoreUser> queryByCondtion(PageQuery<CoreUser> query); 5 6 void batchDelUserByIds( List<Long> ids); 7 8 void batchUpdateUserState(List<Long> ids, GeneralStateEnum state); 9 10 List<CoreUserRole> queryUserRole( Long id,Long orgId,Long roleId); 11 12}
  • console.user 指明了SQL文件的位置,方法名对应了SQL片段名称。
  • 继承BaseMapper可以获得内置的CRUD等若干现成方法

调试

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

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

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

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

1selectUserAndDepartment 2=== 3 select * from user where user_id=#userId# 4 @ orm.single({"departmentId":"id"},"Department"); 5 @ orm.many({"id":"userId"},"user.selectRole","Role"); 6 7user.selectRole 8=== 9 10 select r.* from user_role ur left join role r on ur.role_id=r.id 11 12 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周精通
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )