内容简介:开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins...
开源地址:
- 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的文档深入了解。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 个人角度阐述 OKR
- 中央企业“三重一大”决策运行系统价值阐述
- 详细精确阐述jsBridge执行流程的文章
- 章文嵩阐述滴滴派单复杂度,因言论有误被怼
- 【好文推荐】黑莓OS手册是如何详细阐述底层的进程和线程模型的?
- 干货!谷歌首席科学家发文阐述“半监督学习革命”,想走出瓶颈先试试这个
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
常用算法深入学习实录
张子言 / 电子工业出版社 / 2013-10 / 89.00元
对于任何一门编程语言来说,算法都是程序的“灵魂”。正是因为算法如此重要,所以笔者精心编写了本书,希望通过书中的内容引领广大读者一起探讨学习算法的奥秘,带领广大读者真正步入程序开发的高级世界。 本书共分15章,循序渐进、由浅入深地详细讲解算法的核心内容,并通过具体实例的实现过程演练各个知识点的具体用法。本书首先详细讲解算法的基础知识,剖析了将算法称为“程序灵魂”的原因。然后详细讲解算法技术的核......一起来看看 《常用算法深入学习实录》 这本书的介绍吧!