为什么80%的码农都做不了架构师?>>>
企业应用面临的问题
- 高效编写数据库访问代码
- 内置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 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 all();
List template(T entity);
T templateOne(T entity);
List execute(String sql,Object... args);
int executeUpdate(String sql,Object... args );
Query createQuery();
LambdaQuery createLambdaQuery();
Query 链式操作
Query query = sqlManager.query(User.class);
long count = query.andEq("name", "new name")
.orEq("id", 1637).limit(1, 10).count();
Java8
LambdaQuery 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 {
PageQuery queryByCondtion(PageQuery query);
void batchDelUserByIds( List ids);
void batchUpdateUserState(List ids, GeneralStateEnum state);
List 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周精通