jSqlBox 简介 | Introduce优点 | Advantages文档 | Documentation与其它DAO工具对比 | FeaturesjSqlBox示例 | Demo配置方式 | Configuration作者其它开源项目 | Other Proje期望 | Futures版权 | License关注我 | About Me 介绍
简介 | Introduce
jsqlBox是一个全功能数据库持久层工具,有Java6和Java8两个版本。采用Apache2.0开源协议。
优点 | Advantages
-
无会话设计 :无会话设计(Sessionless),是真正的轻量级工具,可以随用随弃。
文档 | 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](https://gitee.com/drinkjava2/dao- benchmark)项目对比(缺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](https://gitee.com/drinkjava2/dao- benchmark) |
文档 | 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中添加:
com.github.drinkjava2
jsqlBox
2.0.4
作者其它开源项目 | Other Proje
期望 | Futures
欢迎发issue提出更好的意见或提交PR,帮助完善jsqlBox
版权 | License
关注我 | About Me
jSqlBox 简介 | Introduce优点 | Advantages文档 | Documentation与其它DAO工具对比 | FeaturesjSqlBox示例 | Demo配置方式 | Configuration作者其它开源项目 | Other Proje期望 | Futures版权 | License关注我 | About Me 官网
https://gitee.com/drinkjava2/jsqlbox
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。