sagacity-sqltoy-4.16.3 发版,融合 jpa 式对象 crud+极致查询!

2020年10月11日

开源地址:

更新内容

1、优化对tidb、oceanbase、guassdb的支持
2、修复@if中存在2个逻辑判断表达式切割bug,增加@if(:status in '1,2,3') 和@if(:status out '1,2,3') 判断逻辑,进一步增强if判断能力
3、优化日志输出,排除批量更新和保存提示“无参数”导致理解偏差
4、优化convertType功能,不强制要求做exception捕获处理

快速了解 sqltoy-orm:

  • sqltoy是全新一代的ORM框架,兼顾jpa对象式操作的优势,同时极大增强了查询功能,辅以科学的sql编写模式、巧妙的缓存翻译集成、极致的分页优化以及针对大规模数据下的分库分表、超复杂场景下的mongodb、elastic、clickhouse组合应用!
  • sqltoy给你带来了多种主键策略,除常规的UUID、sequence、identity外,还包含雪花算法和基于redis产生有规则的业务主键等。
  • sqltoy还提供了针对统计分析的:数据旋转、无限级分组计算、同比环比等来减少开发者写复杂sql。
  • sqltoy在很多方面提供了极为实用的方法,如:树形表处理、isUnique、findTop、getRandomResult、updateFetch等等
  • sqltoy不同于jooq和mybatis(plus),起点就是认同hibernate jpa模式下并强化查询,而不是极端的唯对象化、唯sql化!
  • sqltoy根本目的在于让大家无orm,实现精力的转移用于更高价值领域或更棘手的方向!

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

  • 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);
  • 数据旋转

  • 无限极分组统计(含汇总求平均),算法配置简单又跨数据库!
  • 同比环比

 

展开阅读全文
8 收藏
分享
加载中
精彩评论
相当实用的改进
2020-10-11 23:51
1
举报
必须支持,越来越强大了!
2020-10-11 19:42
1
举报
@if加强的好,这样就可以任意组合了👍
2020-10-11 19:29
1
举报
已经更新到最新版本
2020-10-11 19:27
1
举报
最新评论 (11)
很关心sql注射攻击的问题,请问有考虑吗?
2020-10-12 15:37
0
回复
举报
sqltoy天然解决sql注入的
2020-10-12 15:44
0
回复
举报
sqltoy不是将值直接拼到sql里面,而是将条件参数全部变成?号,pst.set进去,所以无法做sql注入
2020-10-12 16:05
0
回复
举报
看了一下这个ORM功能还是很强大的,但入门稍显复杂
2020-10-12 11:28
0
回复
举报
目前为止觉得最方便实用的orm工具,推荐!!!
2020-10-12 09:05
0
回复
举报
相当实用的改进
2020-10-11 23:51
1
回复
举报
支持😁
2020-10-11 21:22
0
回复
举报
越来越强大了,赞赞赞
2020-10-11 20:43
0
回复
举报
必须支持,越来越强大了!
2020-10-11 19:42
1
回复
举报
@if加强的好,这样就可以任意组合了👍
2020-10-11 19:29
1
回复
举报
已经更新到最新版本
2020-10-11 19:27
1
回复
举报
更多评论
11 评论
8 收藏
分享
返回顶部
顶部