克隆地址
jSqlBox用户手册

jSqlBox用户手册

简介

jSqlBox是一个全功能数据库持久层工具,它的主要特点体现在以下几个方面:
1.易学易用,基本上看了HelloWorld就可以开始使用它了。
2.功能全,架构优秀,当深入使用它时你会发现它几乎包含了数据库持久层涉及的所有功能,包括跨数据库DDL生成、主键生成、实体注解、分页、各种SQL写法(ActiveRecord/模板/链式写法/参数内嵌写法等)、ORM查询、批处理、声明式事务、分布式事务、缓存、日志、拉截器、主从、分库分表等。
3.它能在几乎所有关系数据库上使用,支持80多种数据库方言。
4.无会话(Sessionless)设计,能轻易与其它持久层工具混合使用。
如果想要快速了解jSqlBox与其它DAO工具的优缺点横向对比,请参见附录"与其它DAO工具的对比"一节。

jSqlBox的架构

jSqlBox由DbUtils、jBeanBox、jDialects、jDbPro、jTransactions再加上jSqlBox本身,一共6个模块组合而成,这些子模块都以源码内含的形式包含在项目中,以减少发布包的数量,但这些模块本身是独立的项目,各自在Maven中央库上也有独立发布版,可以单独下载使用。
DbUtils: 这是jSqlBox的内核,包装了JDBC的访问,DbUtils全称为Apache Commons DbUtils。
jDbPro: 是在DbUtils基础上的进一步包装,提供了各种不同的SQL写法,如参数内嵌式写法和SQL模板支持等。
jDialect: 用于处理所有与数据库方言相关的功能,如DDL生成、函数变换、分页、java与jdbc参数的类型转换等。
jTransactions: 用于提供Dao工具的事务功能,除了jSqlBox,它也可以用来为其它JDBC工具提供事务功能。
jBeanBox: 这是一个小巧的IOC/AOP工具,用来支持声明式事务功能。大项目也可以不用它而采用更常见但更臃肿的Spring。
jSqlBox: 这是项目的本体,除了整合以上模块,还实现了ActiveRecord、ORM查询、分库分表、分布式事务等功能。

jSqlBox的开发目是解决其它数据库持久层工具的一些问题,主要有(纯属个人见解):

1 架构有问题,重复发明轮子。其它持久层通常试图提供一篮子解决方案,但是不分模块的开发方式使得代码纠缠成一堆乱麻,不可复用、难以维护和扩展。例如Hibernate、MyBatis、jFinal、NutzDao、BeetlSql、JdbcTemplate等工具,都面临着如何处理跨数据库开发的问题,它们的做法要么就是自已从头到尾开始开发一套方言工具,要么就是干脆不支持数据库方言,没有借签其它工具的成果,也没有考虑将自己的成果分享给其它工具。
2 过于执迷于某项技术,试图用一把锤子解决所有问题。例如Hibernate和JPA对象化设计过度,臃肿复杂(JPA共有100多个注解)。MyBatis的XML配置繁琐,没有提供CRUD方法(有插件如MyBatis-Plus等提供CRUD功能,但总归不如原生就支持的好,而且依然不能彻底摆脱XML配置)。JdbcTemplate和DbUtils过分偏重于底层SQL,不方便维护。
3 功能不全。持久层是一个综合工程,跨数据库、分页、主键生成、实体注解、ActiveRecord、动态SQL、ORM、缓存、事务、主从支持、分库分表等各方面都必须考虑,而且整合这些不同专题的内容,让它们减少互相干扰,保持架构的清晰、代码的精简是非常重要的。目前没有几个持久层工具能在所有方面都能做到令人满意。
4 不支持动态配置。从数据库表到Java对象,称为ORM,这就需要进行配置。但这些常见的持久层工具,不支持动态配置,这对于需要动态生成或修改配置的场合是个缺陷。例如Hibernate用注解或XML配置的实体Bean,在运行期很难更改外键关联关系、数据库表映射关系配置。
5 软件中存在一些反模式。例如:

  • Hibernate、MyBatis、BeetlSql、Ebean、Nutz等工具中各自发明了一些利用Java方法来支持SQL重构的写法,类似下面这种: customer.billingAddress.city.equalTo("Auckland").status.isEqualTo(Status.NEW);开发时写起来很爽,但是SQL一复杂就很难看,破坏了可读性,不利于维护和移植。
  • 很多工具模仿MyBatis,过分强调代码和SQL分离,采用基于接口代理的设计,不管业务需不需要,先创建接口和DAO层再说,造成中间垃圾层太多,影响开发效率。这一点,大家可以对比一下DaoBenchmark项目,虽然是个性能测试项目,但从源码数量上来说,jSqlBox也是远远少于其它DAO工具的,源码少即意味着开发效率高。
  • 1+N陷阱,在Hibernate、MyBatis等工具中,常出现FetchType.LAZY之类设置,一不小心就会出现1+N问题,严重影响性能和失去对项目的掌控感。

jSqlBox的开发目标是尽量避免这些问题,它的主要优点有:

1 架构合理。jSqlBox将Jdbc工具、事务、数据库方言等功能分成子模块,由不同的子项目实现,每个子项目都可以脱离jSqlBox存在,甚至可供其它ORM工具使用,避免重复发明轮子。模块之间不存在双向藕合,每个模块源码尽量控制在30个类左右,以提高可维护性。 同时jSqlBox的各个子模块在开发中大量借签了其它成熟项目,例如,方言模块(jDialects)抽取了Hibernate的70种方言,事务模块(jTranscations)在提供简化版声明式事务的同时兼容Spring事务,Jdbc工具(jDbPro)基于成熟的DbUtils,链式风格和模板的引入则分别借签jFinal和BeetlSql,并且各自有改进,如新的链式语法、模板可以切换。
2 基于DbUtils这个稳固的内核不仅节约了开发成本,而且与DbUtils兼容,基于DbUtils的项目可以无缝升级到jSqlBox。
3 支持SQL写法多。从最底层的JDBC方法到参数内嵌式SQL写法、DataMapper、ActiveRecord、Tail模式都支持。
4 学习曲线平滑、可维护性好。例如jsqlbox模块下,源码只有40多个类,主要负责整合各个子模块、对象映射、分布式事务。方言、数据库访问等功能被分配到子模块中实现。模块化设计可以形成一个平滑的学习曲线。最极端情况是DbUtils使用者可以无学习直接上手jSqlBox。
5 技术创新多,如参数内嵌式写法(是jSqlBox的首创)、多行SQL文本支持、动态配置、对象关联查询、树结构查询等。
6 无会话(Sessionless)设计,是真正轻量级的持久层工具,能轻易和其它持久层工具混用或作为补丁存在。
7 是除Hibernate之外少有的支持几乎所有数据库DDL脚本生成(80种方言)的持久层工具,方便单元测试。
8 性能高,启动快速,几乎是0秒启动,这点对于需要反复启动的单元测试来说很有用。

在开发过程中,对于以下一些持久层工具提供的功能,jSqlBox决定暂不支持:

1 Sql文件映射到接口代理。个人认为SqlMapper是一个反模式,jSqlBox推荐用肮脏直接的方式在Java里拼写SQL(即jSqlBox的SQL参数内嵌写法),多行SQL可以利用Text类存放,(甚至采用Java13版),支持IDE定位。
2 (支持/或不支持重构的)条件构造器,或用Java方法拼接来代替SQL,理由见上,属于意义不大的反模式。
3 懒加载(延迟加载)功能。实体属性的懒加载会增加DAO层的复杂性和可维护性,jSqlBox不支持懒加载。

目前jSqlBox的主要缺点:

jSqlBox是个小众项目,用户不多,在多人项目中选用jSqlBox这种小众DAO工具之前,必须要先和其它人沟通确认才可以,因为DAO工具是项目的基石,万一出现问题会对项目影响很大。
个人建议jSqlBox可以先在以下场景试用:个人项目、技术强能看懂源码、只使用了jSqlBox的部分功能如参数内嵌式SQL、作为其它DAO工具的补丁混搭使用这几种场合。