sqltoy-orm-4.15.7.3 发版,增强 link 功能,开放缓存管理接口

2020年09月18日

开源地址:

更新内容(感谢众多网友的反馈,使得一些边缘场景得以巩固)

1、增强group_concat的算法实现link功能,支持多列场景

<!-- 演示link操作,如果分页请用@fast() 取10条后再关联,最终会返回10条记录 -->
<sql id="qstart_link_case">
<value>
<![CDATA[
select t.ORGAN_ID ,t.ORGAN_ID ORGAN_NAME, t.STAFF_NAME , t.SEX_TYPE,t.SEX_TYPE sexTypeName 
from sqltoy_staff_info t
order by t.ORGAN_ID 
]]>
</value>
<!-- 多个列合并,可以先翻译后合并 -->
<link id-column="ORGAN_ID" columns="STAFF_NAME,sexTypeName" sign="," />
<translate cache="dictKeyName" columns="sexTypeName" cache-type="SEX_TYPE"/>
<translate cache="organIdName" columns="ORGAN_NAME"/>
</sql>


2、优化postgresql9.4 版本的saveOrUpdate功能(9.4 不支持insert table AS T1别名模式,剔除别名),推荐9.5+版本
3、增强loadBySql、load(entity)对象类型处理,避免new VO(){{setId("");}} 双大括号极端特殊场景下定义对象导致类型获取错误。
4、增强sql中参数:param判断逻辑,适配postgresql带有json形式的查询场景::jsonb 这种对条件参数的干扰
5、translateManager 简化了缓存更新、清除接口(之前是要再调一层),便于用户扩展来完成缓存的近实时更新
6、quickvo增强支持JSONB等类型

快速了解 sqltoy-orm:

  • sqltoy是全新一代的ORM框架,兼顾jpa对象式操作的优势,同时极大增强了查询功能,辅以科学的sql编写模式、巧妙的缓存翻译集成、极致的分页优化以及针对大规模数据下的分库分表、超复杂场景下的mongodb、elastic、clickhouse组合应用!
  • sqltoy给你带来了多种主键策略,除常规的UUID、sequence、identity外,还包含雪花算法和基于redis产生有规则的业务主键等。
  • sqltoy还提供了针对统计分析的:数据旋转、无限级分组计算、同比环比等来减少开发者写复杂sql。
  • sqltoy在很多方面提供了极为实用的方法,如:树形表处理、isUnique、findTop、getRandomResult、updateFetch等等
  • sqltoy不走jooq全对象式、mybatis全sql式这种不是天就是地的极端路子,紧贴项目实战发展起来的框架,让各自技术以合理的方式应用于合理的地方!

简要举例介绍(因篇幅问题部分举例):

  • JPA式的CRUD,但规避了其不足,提供了默认的SqlToyCRUDService(简单的则无需写service方法) 和 SqlToyLazyDao(开发无需自己写Dao,只需要写Service业务逻辑),可以了解类似于update、updateAll、saveOrUpdate等内在逻辑,减少了数据库交互,考虑了高并发和业务对象变更的特征!
 @Autowired
 private SqlToyCRUDService sqlToyCRUDService;

 //基于对象保存 
 sqlToyCRUDService.save(staffInfo);

 //基于对象更新(字段值为null的不会参与变更) 
 sqlToyCRUDService.update(staffInfo);
 
 //深度变更,全部字段都参与变更
 sqlToyCRUDService.updateDeeply(staffInfo);
 
 //基于对象更新(制定强制修改的字段) 
 sqlToyCRUDService.update(staffInfo,new String[]{"staffName","onDuty"});

 //基于对象更新 
 sqlToyCRUDService.saveOrUpdate(staffInfo);

 //加载对象
 sqlToyCRUDService.load(new StaffInfoVO("S190715009"));

 //加锁获取对象
 sqlToyCRUDService.load(new StaffInfoVO("S190715009"),LockMode.UPGRADE);

 //判断对象是否唯一
 sqlToyCRUDService.isUnique(staffInfo, "staffCode");

 //delete\deleteAll\updateAll\loadAll 等等不一一写完
  • 单表等简单的查询和变更操作,提供了链式操作
//单表对象查询,直接传参模式
List<StaffInfoVO> staffVOs = sqlToyLazyDao.findEntity(StaffInfoVO.class,
				EntityQuery.create().where("#[staffName like ?] #[ and status=?]").values("陈", 1).lock(LockMode.UPGRADE)
						.orderBy("staffName").orderByDesc("createTime"));

//单表查询,对象传参模式
List<StaffInfoVO> staffVOs = sqlToyLazyDao.findEntity(StaffInfoVO.class,
				EntityQuery.create().where("#[staffName like :staffName] #[ and status=:status]")
						.values(new StaffInfoVO().setStatus(1).setEmail("test3@aliyun.com")));


//代码中链式查询并删除
Long deleteCount = sqlToyLazyDao.deleteByQuery(StaffInfoVO.class,
				EntityQuery.create().where("status=:status").values(new StaffInfoVO().setStatus(1)));

//链式变更
Long updateCount = sqlToyLazyDao.updateByQuery(StaffInfoVO.class,
				EntityUpdate.create().set("staffName", "张三").where("staffName like ? and status=?").values("陈", 1));
  • 更强大的查询,sqltoy强调复杂查询建议放置于xml中跟代码分离(当然等jdk15文本块来了你写在java也可以)
//sqltoy统一的规则就是直接传递sql语句或者对应的sqlId,并不是说sql只能写在xml中(推荐但不绝对)
findBySql(final String sqlOrSqlId, final String[] paramsNamed, final Object[] paramsValue,
			final Class<T> voClass)

//嫌弃上面的格式化传参也可以使用这样链式查询
sqlToyLazyDao.findByQuery(new QueryExecutor("sqltoy_order_search").names("orderId", "authedOrganIds")
				.values(null, authedOrgans).resultType(DeviceOrderInfoVO.class));
  • sqltoy提供了最简洁的动态sql编写

我们对比一下mybatis的实现(很简单的sql写的如此让人不愿意写!)

  • 缓存翻译,利用缓存减少关联查询,简化sql同时大幅提升效率

  • 极致分页优化

  • 并行查询
// 使用并行查询同时执行2个sql,条件参数是2个查询的合集
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);
  • 旋转数据并进行环比计算

展开阅读全文
5 收藏
分享
加载中
精彩评论
推荐大家使用,绝对是目前已知orm框架中最强大的!
2020-09-18 13:13
2
举报
功能强大,使用简单,很不错!
2020-09-18 15:54
1
举报
最新评论 (31)
sqltoy的动态sql写法、缓存翻译、快速分页、分页优化这些是sqltoy的特点,也已经申请了发明专利!
2020-09-18 20:49
0
回复
举报
很荣幸 orm比较的时候想起 beetlsql,beetlsql3即将发布,欢迎关注
2020-09-18 18:41
0
回复
举报
哈哈
2020-09-18 18:49
0
回复
举报
就知道闲大赋马上会来!
2020-09-18 18:50
0
回复
举报
跟 beetlsql pk过没有
2020-09-18 17:43
0
回复
举报
哈哈,挑事的!那只能自己比较了
2020-09-18 17:45
0
回复
举报
竟然跟mybatis比较,也可以跟 beetlsql pk 一下
2020-09-18 18:00
0
回复
举报
我不跟国内框架对比,要比你自己去判断!sqltoy的特点就摆在那里!
2020-09-18 18:04
0
回复
举报
用过hibernate,也用过ibatis到mybatis,各有所长.sqltoy独具匠心的设计在调试,排查SQL问题应该可以甩hibernate和mybatis几条街,配合直接把sql贴到sql桌面工具,可以无差别的执行。翻译功能十分强大,已经作为我项目的必备工具
2020-09-18 17:40
0
回复
举报
大概扫了一眼介绍,就好奇,如果是需要传入列名字来拼接SQL的情况,能支持到吗?看你没有代码样例。就是程序开发好了,但是表名字列名字是客户使用过程中现场自行建立的。那么,肯定以某种逻辑来增删改这些表时,需要动态的传入列名称和值来做。这种情况,支持吗。
2020-09-18 17:13
0
回复
举报
首先对你的这个场景本身的合理性质疑,你这种就是sql可以用户随意组织,导致sql注入!
第二呢,抛开合理性,也是支持的,短短篇幅不会讲解特殊场景下的处理模式!
2020-09-18 17:16
0
回复
举报
额,就是where条件后面,要写 foreach 结构,然后,循环嵌入 key 和 value,key是列名字,value是过滤的值。这种也是支持的吗?场景合理性就不用质疑了,又不是全是开发互联网产品;开发企业内部用的通用类管理软件时(oa,erp),这种情况是普遍存在的。
2020-09-18 17:48
0
回复
举报
嗯,部分场景需要特殊处理一下,我也是经常做erp,CRM的
2020-09-18 18:05
0
回复
举报
就是因为经常做这些管理类项目还有数据分析类项目才促动写sqltoy的!
最早是2008年宁波农行,十几个查询条件,还经常变需求,所以才有了针对动态sql组织的灵感!
你说的场景其实都是有后手来应对的,做管理类项目最重要的就是不能绝对化搞死,要留一手以防不测!
2020-09-18 19:31
0
回复
举报
非常感谢,原本是用一个特殊方式来支持的,在4.16版本里面增加了@loop来处理,这个问题已经有了很好的解决!4.16已经发版
2020-09-26 09:31
0
回复
举报
很多人质疑sqltoy对比mybatis,其实很简单,开源是很费时间和精力的而且没有收益,所以要做就必须有意义,所以必须要跟mybatis进行对比,否则我个人认为毫无价值毫无意义!不存在贬低之说,好坏要通过具体的特点摆事实讲道理来分析!
2020-09-18 16:56
0
回复
举报
mybatis支持JavaSE,而你这个框架需要依赖spring怎么不说?Java届可不止有Spring。
2020-09-18 17:06
0
回复
举报
哈哈,闹了半天就整出这么一个论据,服了!!

大家对好的国产框架的支持就足以说明艰难了,要发展起来才能支持更多场景!

我不是在努力的抛砖引玉,引起共鸣聚集力量做更大发展吗!
2020-09-18 17:11
0
回复
举报
简直无语了,宣传自己不错,总是贬低别人mybatis。
2020-09-18 16:46
0
回复
举报
你无语的理由是什么呢?跟mybatis对比有什么问题吗?
一个连mybatis都无法PK的orm开源的意思是什么?

搞研究搞技术就是要对标,否则就是浪费时间的重复劳动
sqltoy的特点如果不足以pk mybatis你可以表示无语!
2020-09-18 17:00
0
回复
举报
手比脚高就是特点呗?
2020-09-18 17:02
0
回复
举报
张嘴就来呀!能举例子吗?
是动态sql不如mybatis?
是缓存翻译不如mybatis?
是分页不如mybatis?

请举例子
2020-09-18 17:04
0
回复
举报
sqltoy需要在相对复杂的场景和较大规模数据下会将优势体现的非常明显!
2020-09-18 16:06
0
回复
举报
功能强大,使用简单,很不错!
2020-09-18 15:54
1
回复
举报
支持,越来越坚实了!
2020-09-18 14:08
0
回复
举报
更多评论
31 评论
5 收藏
分享
返回顶部
顶部