sqltoy-orm-4.18.21 发版,阐述和分享对 orm 的理解

栏目: 软件资讯 · 发布时间: 2年前

内容简介:开源地址: 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极为简洁、直观、便于后期维护
sqltoy-orm-4.18.21 发版,阐述和分享对 orm 的理解

sql编写模式上秒杀mybatis

  • sqltoy的缓存翻译极大的提升性能同时简化sql,性能还需要对比吗?
sqltoy-orm-4.18.21 发版,阐述和分享对 orm 的理解

将多表查询变成了单表查询,性能不秒杀mybatis?

  • sqltoy拥有极致的分页优化
  1. 快速分页:@fast() 实现先取单页数据然后再关联查询,极大提升速度
  2. 分页优化器:page-optimize 让分页查询由两次变成1.3~1.5次(用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询
  3. sqltoy的分页取总记录的过程不是简单的select count(1) from (原始sql);而是智能判断是否变成:select count(1) from 'from后语句', 并自动剔除最外层的order by
  4. sqltoy支持并行查询:parallel="true",同时查询总记录数和单页数据,大幅提升性能
  5. 在极特殊情况下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
sqltoy-orm-4.18.21 发版,阐述和分享对 orm 的理解

 

  • 并行查询:同时执行多个查询,提升性能
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-orm-4.18.21 发版,阐述和分享对 orm 的理解

 

  • 无限极分组统计(含汇总求平均),算法配置简单又跨数据库!
sqltoy-orm-4.18.21 发版,阐述和分享对 orm 的理解

 

  • 同比环比
sqltoy-orm-4.18.21 发版,阐述和分享对 orm 的理解

 

  • 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的文档深入了解。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First Python

Head First Python

Paul Barry / O'Reilly Media / 2010-11-30 / USD 49.99

Are you keen to add Python to your programming skills? Learn quickly and have some fun at the same time with Head First Python. This book takes you beyond typical how-to manuals with engaging images, ......一起来看看 《Head First Python》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具