- 授权协议: Apache
- 开发语言: Java
- 操作系统: 跨平台
- 软件首页: https://gitee.com/drinkjava2/jSqlBox
- 软件文档: https://gitee.com/drinkjava2/jSqlBox/blob/master/README.md
软件介绍
简介 | Introduce
jSqlBox是一个全功能数据库持久层工具,有Java6和Java8两个版本。采用Apache2.0开源协议。
优点 | Advantages
架构优良:模块式架构,各个模块都可以脱离jSqlBox单独存在。
跨数据库:基于jDialects,支持80多种数据库的分页、DDL生成、实体源码生成、函数变换。
与DbUtils兼容:继承于DbUtils, 原有基于DbUtils的项目可以无缝移植到jSqlBox。
多种SQL写法:Inline方法、模板方法、DataMapper、ActiveRecord、链式写法等。
多项技术创新:Inline写法、多行文本支持、ORM越级查询、树结构查询等。
动态配置:除了支持实体Bean注解式配置,jSqlBox还支持在运行期动态更改配置。
无会话设计:无会话设计(Sessionless),是真正的轻量级工具,可以随用随弃。
自带声明式事务:基于独立的声明式事务工具jTransactions,并可配置成使用Spring事务。
学习曲线平滑:模块化学习,了解了各个子模块,就掌握了jSqlBox,jSqlBox主体只有20多个类。
文档 | Documentation
与其它DAO工具对比 | Features
下表是jSqlBox在各个方面与一些其它DAO工具的对比, 内容仅为个人看法,而且随时更新,因为可能有说错的地方,或是其它DAO工具有了新版本发布,表中的MP为MyBatis-Plus的缩写:
| 对比内容 | MP | BeetlSql | JFinal | jSqlBox | 打分理由(仅参考官网文档,纯属个人看法) |
|---|---|---|---|---|---|
| 总体架构 | 3.5 | 4 | 3.5 | 5 | jSqlBox模块式架构更合理,各个模块可以抽取出来使用。MP内核基于MyBatis,这个内核比较大,本身固有的问题(如XML配置复杂)不能通过插件来解决。JFinal:1)从DAO选型角度看,它捆绑发布的Web层代码是多余的。2)基于Map的实体类不规范,不是标准POJO,对项目有侵入性 |
| 易学、易用、易维护 | 4 | 4 | 5 | 5 | jSqlBox的配置和代码量在所有ORM工具中最少,见DaoBenchMark项目对比(缺JFinal) |
| 从实体类生成DDL脚本 | 0 | 0 | 0 | 5 | jSqlBox支持从实体创建跨数据库(80种方言)的DDL脚本,更方便原型开发和单元测试 |
| 从数据库生成实体源码 | 5 | 5 | 5 | 5 | 代码生成器在项目后期作用有限,例如当实体类字段名重构,还是必须在IDE里打开源码手工重构,代码生成器帮不上忙。 |
| 分页 | 4 | 4 | 4 | 5 | jSqlBox的分页方式侵入性最少,任意SQL和CRUD方法中都可以传入分页拦截器 |
| 事务 | 4 | 4 | 5 | 5 | 都兼容Spring事务,Jfinal和jSqlBox都自带声明式事务,可以甩掉笨重的Spring。jSqlBox的声明式事务有独立发布版,可以提供给其它工具使用。 |
| 动态SQL | 4 | 4 | 4 | 5 | jSqlBox首创参数内嵌(Inline)式写法,方便拼接SQL,任意SQL和CRUD方法中都可以将SQL文本、参数、分页拦截器、缓存选项、分库分表选项等当作参数传递。其它DAO工具则主要依赖模板实现动态SQL,多绕了一层。 |
| DBA友好(多行SQL存放) | 3.5 | 4.5 | 5 | 5 | BeetlSql不能切换模板。MyBatis的XML太繁琐,Sql注解又不适用于多行SQL。jSqlBox缺省模板无语法功能,扣分,但它首创用注释存放多行SQL,支持IDE定位,加分。 |
| 支持重构的SQL | 4 | 4 | 4 | 4.5 | jSqlBox利用Lambda可以写出支持重构的SQL(Java8版),而且没有重新发明新的SQL语法。BeetlSql中的Lambda查询器和MP中的条件构造器支持重构,但个人认为是重新发明SQL的反模式,意义不大。jFinal没有发明反模式,但也没有什么创新,所以打分不高。jSqlBox没有打满分是因为受Java语言限制,Lambda不能直接当参数传递,使用起来繁琐。 |
| ORM关联查询 | 5 | 3 | 3 | 5 | BeetlSql和JFinal实体关联查询有缺陷,例如dept=user.get(“department“)这种写法不支持重构,也没有自动装配POJO中的字段属性。JFinal中Blog.dao.find(“select * from blog where user_id=?“,get(“id“));这种方式隐含1+N问题 |
| DataMapper模式 | 5 | 5 | 0 | 5 | 即类似dao.save(user)写法。JFinal不支持标准POJO的持久化,不利于与其它工具集成使用。 |
| ActiveRecord模式 | 5 | 0 | 5 | 5 | ActiveRecord实现起来很简单,它是DataMapper模式的镜像,在jSqlBox中只有不到300行代码,但是从文档中看不出BeetlSql有这个功能,希望改进。jSqlBox的Java8版只需要声明ActiveEntity接口,不占用单继承。 |
| 接口代理模式 | 5 | 5 | 0 | 0 | 只需要写出接口,SQL用注释加在接口方法上,在运行时生成代理实例方法,这可能是个反模式,因为使用它需要先调用dao.getMapper(User.class)生成一个特殊的代理实例,不如ActiveRecord模式简单明了。在jSqlBox中,简单的SQL和逻辑复杂的SQL,直接在Java方法里拼接就可以了,大段的SQL可以利用/-/注释来存放,支持IDE定位 |
| 混合模型 | ? | 5 | 5 | 5 | 即同时支持利用POJO和数据库字段存取,如user.setName(“Tom“).putTail(“usr_age“,10).save()。BeetlSql利用@Tail或TailBean实现,jSqlBox中的ActiveRecord支持混合模型,jFinal中的Model支持混合模型。MP不清楚,先打个问号。 |
| Record/Map模式 | ? | 5 | 5 | 5 | 实体类不存在时,JFinal可以用Record类来直接存取数据库,jSqlBox用Tail类实现(是ActiveRecord的子类,源码只有两行),BeetlSql还支持直接用Map来存取数据库。Tail/Record/Map这种方式不支持重构,所以不建议在项目中大量使用。 |
| 主从支持 | 2 | 5 | 2 | 5 | jSqlBox的主从选择可以精细控制到任意一个CURD或SQL,jFinal需要手工选择主从库,不具备自动切换主从功能。MyBatis本身不支持主从,要利用AOP等第三方手段实现。 |
| 分库分表 | 2 | 2 | 2 | 4.5 | 只要使用了Sharding,对SQL写法就有侵入。jSqlBox自带基本的Sharding支持,支持原生SQL和所有数据库。其它DAO工具本身不具备sharding功能,需要第三方Sharding工具支持,限制较多。 |
| 批处理 | 4 | 4 | 4 | 5 | 除了通常的JDBC批处理方法外,jSqlBox还提供批处理开关模式。 |
| 缓存 | 5 | 5 | 5 | 5 | 都有,都是针对SQL查询结果而不是实体容器缓存 |
| 拦截器 | 5 | 5 | 5 | 5 | 都有 |
| Sql日志 | 5 | 5 | 5 | 5 | 都有 |
| 锁及版本控制 | 5 | 5 | 0 | 0 | 不常用,JFinal和jSqlBox需手工实现锁及版本 |
| 列名到实体字段映射 | 5 | 5 | 5 | 5 | 数据表与Java字段命名不符时,jSqlBox用@Column注解来更正,符合JPA惯例。jFina推荐Java字段命名与数据表一致。MP和BeetlSql有几种映射策略选择。 |
| Java6/Java8支持 | 5 | 5 | 5 | 5 | 都支持。jSqlBox的Java8版只由3个类组成,反映了它的架构可扩展性好,用户可以模仿这3个文件开发自已的Java8版。 |
| 性能 | 4 | 5 | ? | 5 | 对于持久层,易用性为王,不用多考虑性能。性能测试详见闲大赋的DaoBenchMark |
| 文档 | 4 | 4 | 3 | 4 | JFinal需要官网注册才能下载Demo |
| 知名度、成熟度 | 4 | 4 | 5 | 0 | 用的人越多,Bug就越少。成熟度反映了软件本身的质量,但它与软件的架构、功能、易用性无关。 |
上表中未加入Hibernate和MyBatis,是因为Hiberante太复杂、MyBatis不提供CRUD,缺点太明显。已经被很多人用脚投票了。
不加入EBean的原因是它的功能相对单调一些,设计思路与Hibernate相似,复杂性依然存在。
国产的Nutz DAO功能也挺全的,而且也支持DDL脚本的生成,架构上没有大问题,待下次更新时加入作对比。它的主要缺点是没提供ActiveRecord和实体关联有点复杂化。
JdbcTemplate和DbUtils等DAO工具因为功能单薄,也不加入作对比。
jSqlBox示例 | Demo
jsqlbox-in-actframework 演示jSqlBox与ActFramework框架的整合,分别展示利用jBeanBox和Guice来实现声明式事务。
jsqlbox-in-jfinal 演示jSqlBox与jFinal的整合,用jSqlBox替换掉jFinal自带的DAO工具。
jSqlBox-in-Spring 这是一个MVC Web项目,演示jSqlBox在Spring+Tomcat环境下的配置和使用, IOC、AOP和声明式事务均使用Spring的。
jsqlbox-in-springboot 演示jSqlBox在SpringBoot环境下的配置和使用。
jsqlbox-in-springboot-mybatis 演示在SpringBoot环境下jSqlBox和MyBatis的混合使用。
jsqlbox-java8-demo 主要演示jSqlBox-Java8版的两个特点:实体类只需要声明接口、利用Lambda来写SQL。
配置方式 | Configuration
在pom.xml中添加:
作者其它开源项目 | Other Proje
期望 | Futures
欢迎发issue提出更好的意见或提交PR,帮助完善jSqlBox
版权 | License
关注我 | About Me
Building Web Reputation Systems
Randy Farmer、Bryce Glass / Yahoo Press / 2010 / GBP 31.99
What do Amazon's product reviews, eBay's feedback score system, Slashdot's Karma System, and Xbox Live's Achievements have in common? They're all examples of successful reputation systems that enable ......一起来看看 《Building Web Reputation Systems》 这本书的介绍吧!
