sqltoy-orm-4.18.21 发版,阐述和分享对 orm 的理解
开源地址:
- github: https://github.com/sagframe/sagacity-sqltoy
- gitee: https://gitee.com/sagacity/sagacity-sqltoy
- idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins
更新内容
1、 修复elasticsearch sql查询的一个NPP错误
2、date-format增加locale选项,支持英文等日期格式化
3、针对分页、取top记录、取随机记录方法适度进行了重用性规整
- 为什么开源sqltoy
sqltoy作为内部框架取得了良好的效果,因工作变动的原因,看到很多人一提orm必称mybatis(plus),甚至有一种:mybatis(plus)都不熟,言语中还稍有点轻视感,但经过实际项目中sqltoy的使用,大家真正感受到了sqltoy的强大,大家也鼓动将sqltoy开源给大家分享。
对于开源个人的观念是:在有同类产品的情况下,如果不足够好就应该hold住不要开源了,大家都卷了累了!
很多人问sqltoy为什么总是踩mybatis(plus)?其实sqltoy根本就没有踩一个抬一个,优劣要靠事实依据,如果不比mybatis(plus)强大开什么源?有什么必要开源?岂不是给996的时代创造焦虑吗?
- 心中理想的ORM框架应该是什么?
个人的观念是:JPA+更加灵活高效的sql组织和执行机制,任何单独强调jpa和mybatis都是有失偏颇的。
1、互联网项目很多人认为JPA就足够了(常问jpa够好了为什么有人还在鼓吹mybatis),忽视了面向管理端和数据统计分析时场景的复杂性,有人说jpa有qsl也可以写原生sql,但真的还不够强!
2、ToB的项目很多人认为mybatis灵活便于sql优化,但希望普通的单表操作能跟jpa一样,因此产生了mybatis的各种plus,甚至plus plus!
3、更有甚者:强调jooq模式用对象实现sql,简单查询的对象式并无过错,但复杂的其实就矫枉过正了,sql本身就是一个普世的语言,在客户端调试完再转成java对象模式,修改的时候再转成sql再调试,这种过程本质而言就是自虐,开发懂sql、产品懂sql、测试懂sql,变成对象模式就只有开发自己懂!
总之:我们希望有JPA那种对象式的简单直接,也想要有sql的灵活高效。
- sqltoy-orm 正是为解决上述问题而产生的
1、sqltoy有jpa式的对象操作,且针对jpa的一些不足进行了加强
2、sqltoy的sql 充分考虑了开发、调试、变更、后期维护的全过程,让sql更加接近于客户端调试完的结果
3、sqltoy不是简单地重复jpa和优化mybatis,而是针对性能优化和统计分析提供了独特新颖的解决思路,你会第一次了解到缓存翻译、分页优化、快速分页、并行查询、行列转换等极为有帮助的特性(当然分库分表等人人皆知的功能自然也是支持的)。
- sqltoy的对象操作介绍,通过框架中的SqlToyLazyDao完成交互
StaffInfoVO staffInfo = new StaffInfoVO(); //保存 sqlToyLazyDao.save(staffInfo); //删除 sqlToyLazyDao.delete(new StaffInfoVO("S2007")); //update 针对jpa的缺陷进行了改进 //public Long update(Serializable entity, String... forceUpdateProps); // 这里对photo 属性进行强制修改,其他为null自动会跳过 sqlToyLazyDao.update(staffInfo, "photo"); //深度修改,不管是否null全部字段修改 sqlToyLazyDao.updateDeeply(staffInfo); List<StaffInfoVO> staffList = new ArrayList<StaffInfoVO>(); StaffInfoVO staffInfo = new StaffInfoVO(); StaffInfoVO staffInfo1 = new StaffInfoVO(); staffList.add(staffInfo); staffList.add(staffInfo1); //批量保存或修改 sqlToyLazyDao.saveOrUpdateAll(staffList); //批量保存 sqlToyLazyDao.saveAll(staffList); ............... sqlToyLazyDao.loadByIds(StaffInfoVO.class,"S2007") //唯一性验证 sqlToyLazyDao.isUnique(staffInfo, "staffCode"); //提供了独特的updateFetch功能,查询、锁定、修改并返回修改后的结果 // 适用于高并发、高度一致性场景,如:库存台账、财务资金帐实时扣减、叠加等 public List updateFetch(final QueryExecutor queryExecutor, final UpdateRowHandler updateRowHandler);
- sqltoy支持代码中对象查询和直接写sql
// sqltoy中统一的规则是xml中的sqlId 或者直接传具体的sql语句,而不是only xml public <T extends Serializable> List<T> findBySql(final String sqlOrNamedSql, final T entity);
//带缓存翻译的代码中动态条件查询,xml中的功能用代码基本都可以实现,xml一般用于复杂查询 public PaginationModel<StaffInfoVO> findStaff(PaginationModel<StaffInfoVO> pageModel, StaffInfoVO staffInfoVO) { return sqlToyLazyDao.findEntity(StaffInfoVO.class, pageModel, EntityQuery.create() .where("#[staffName like :staffName]#[and createTime>=:beginDate]#[and createTime<=:endDate]") .values(staffInfoVO) // 将性别代码通过缓存转变成中文名称 .translates(new Translate("dictKeyName").setColumn("sexTypeName") .setCacheType("SEX_TYPE").setKeyColumn("sexType")) //通过缓存显示员工所在机构的名称 .translates(new Translate("organIdName").setColumn("organName") .setKeyColumn("organId"))); } //演示代码中非直接sql模式设置条件模式进行记录修改 public Long updateByQuery() { return sqlToyLazyDao.updateByQuery(StaffInfoVO.class, EntityUpdate.create().set("createBy", "S0001") .where("staffName like ?").values("张")); } //代码中非直接sql模式设置条件模式进行记录删除 sqlToyLazyDao.deleteByQuery(StaffInfoVO.class, EntityQuery.create() .where("status=?").values(0));
- 通过上面的介绍说明sqltoy在常规的crud领域是跟jpa、mybatis(plus)对等的,一些细节因篇幅不做详细介绍,而不是only sql、only xml!因为下面的篇幅更多会以xml和sql形式表达,上面不铺垫一下容易误解sqltoy就必须是sql必须是xml。
- sqltoy在sql编写方式上跟客户端(dbeaver) 上极为一致,让sql极为简洁、直观、便于后期维护
sql编写模式上秒杀mybatis
- sqltoy的缓存翻译极大的提升性能同时简化sql,性能还需要对比吗?
将多表查询变成了单表查询,性能不秒杀mybatis?
- sqltoy拥有极致的分页优化
- 快速分页:@fast() 实现先取单页数据然后再关联查询,极大提升速度
- 分页优化器:page-optimize 让分页查询由两次变成1.3~1.5次(用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询
- sqltoy的分页取总记录的过程不是简单的select count(1) from (原始sql);而是智能判断是否变成:select count(1) from 'from后语句', 并自动剔除最外层的order by
- sqltoy支持并行查询:parallel="true",同时查询总记录数和单页数据,大幅提升性能
- 在极特殊情况下sqltoy分页考虑是最优化的,如:with t1 as (),t2 as @fast(select * from table1) select * from xxx 这种复杂查询的分页的处理,sqltoy的count查询会是:with t1 as () select count(1) from table1, 如果是:with t1 as @fast(select * from table1) select * from t1 ,count sql 就是:select count(1) from table1
- 并行查询:同时执行多个查询,提升性能
String[] paramNames = new String[] { "userId", "defaultRoles", "deployId", "authObjType" }; Object[] paramValues = new Object[] { userId, defaultRoles, DEPLOY_ID,GROUP }; List<QueryResult<TreeModel>> list = super.parallQuery( Arrays.asList( ParallQuery.create().sql("webframe_searchAllModuleMenus").resultType(TreeModel.class), ParallQuery.create().sql("webframe_searchAllUserReports").resultType(TreeModel.class)), paramNames, paramValues);
- 数据旋转
- 无限极分组统计(含汇总求平均),算法配置简单又跨数据库!
- 同比环比
- sqltoy支持哪些数据库?
1、oracle 11g+
2、db2 9.5+,建议从10.5 开始
3、mysql(mariadb/innosql)支持5.6、5.7、8.0 版本
4、postgresql(greenplum) 支持9.5 以及以上版本
5、sqlserver 2012+
6、sqlite
7、DM达梦数据库
8、elasticsearch 只支持查询,版本支持5.7+版本,建议使用7.3以上版本
9、clickhouse、dorisdb
10、oceanBase
11、guassdb
12、tidb
13、kingbase
14、mongodb (只支持查询)
15、sybase_iq 支持15.4以上版本,建议使用16版本
- sqltoy 还有什么特点?
因为篇幅原因,关于其他的例如分库分表、跨数据库sql自适应、json类型支持等可通过sqltoy的文档深入了解。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
mica 2.5.0 & 2.4.6 发布,实验性对 Spring Native 支持
一、mica(云母) mica是一个微服务组件集,但不仅仅是组件,我们关注的是微服务生态并持续演进,尽量做到开箱即用,简化使用和排坑。总共已有 40+ 组件,并且很多组件已经打通。 二、版本说明 最新版本 mica 版本 spring boot 版本 spring cloud 版本 2.5.0 mica 2.5.x 2.5.x 2020 2.4.6 mica 2.4.x 2.4.x 2020 2.1.1-GA mica 2.0.x~2.1.x 2.2.x ~ 2.3.x Hoxton 三、更新记录 v2.5.0 - 2021-05-23 mica-redis 微调,支持 Spring boot 到 2.5.0。 升级 Spring boot 到 2.5.0。 v2.4.6 - 2021-05-23 mica-logging 完成 loki 支持 #36 #I3PX2F。 mica-ip2region、mica-captcha 添加对 spring-native 的支持 #38 #I3PX2N。 mica-jetcache 添加 metrics 支持 #37 #I3PX2K。 mica-...
- 下一篇
华为地图服务 5.3.0 版本发布
华为地图服务5.3.0版本已发布,主要更新内容如下: 新增支持热力图图层绘制功能。以不同颜色标识地图上的点,这些点的集合使地图该区域以高亮的形式呈现。例如,您可以通过热力图功能展示交通拥堵情况,提醒用户躲避拥挤地区; "规划驾车路径"功能中,新增支持距离优先、避免轮渡的规则,可以更加合理的设置路径规划方案; 路径规划请求响应结果中,Route属性新增字段,可以更丰富的描述该路段是否有阶梯; 新增支持设置Petal Maps Logo的位置,开发者可以根据需要调整Logo的显示位置。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池