极致查询性能 sqltoy-orm-4.12.6 发版

来源: 投稿
作者: zhongxuchen
2020-06-03

开源地址:

更新内容

1、升级spring、elasticsearch、mongo依赖包的版本
2、优化对mongodb查询支持、改为直接通过mongoTemplate集成(原先是通过mongoDbFactory模式), 完善范例

参考范例:

https://github.com/chenrenfei/sqltoy-showcase/tree/master/trunk/sqltoy-nosql
见test下面MongoTest.java

sqltoy特点说明:

  • 支持mysql、postgresql、db2、oracle、sqlserver、sqlite、clickhouse、elasticsearch、mongodb等
  • 具有JPA模式的CRUD功能(即CRUD无需写sql),无需写Dao,sqltoy提供了SqlToyLazyDao,同时提供了quickvo从数据库生成POJO。
  • 根本上杜绝了sql注入问题
  • 最科学的sql编写方式

* sqltoy的sql编写(支持嵌套)

select 	*
from sqltoy_device_order_info t 
where #[t.ORDER_ID=:orderId]
      #[and t.ORGAN_ID in (:authedOrganIds)]
      #[and t.STAFF_ID in (:staffIds)]
      #[and t.TRANS_DATE>=:beginDate]
      #[and t.TRANS_DATE<:endDate] 

* mybatis同样功能实现

select *
 from sqltoy_device_order_info t 
 <where>
    <if test="orderId!=null">
	and t.ORDER_ID=#{orderId}
    </if>
    <if test="authedOrganIds!=null">
	and t.ORGAN_ID in
	<foreach collection="authedOrganIds" item="order_id" separator="," open="(" close=")">  
            #{order_id}  
 	</foreach>  
    </if>
    <if test="staffIds!=null">
	and t.STAFF_ID in
	<foreach collection="staffIds" item="staff_id" separator="," open="(" close=")">  
            #{staff_id}  
 	</foreach>  
    </if>
    <if test="beginDate!=null">
	and t.TRANS_DATE>=#{beginDate}
    </if>
    <if test="endDate!=null">
	and t.TRANS_DATE<#{endDate}
    </if>
</where>
  • 缓存翻译大幅提升性能,减少多表关联,让sql直观可维护

  • 最高等级的分页优化

  • 支持用算法代替sql实现行列转换、同比环比、分组汇总等

  • 支持分库分表
  • sqltoy支持跨数据库函数自适应:一套sql可以自适应多种数据库
  • 提供了5种默认的非数据库相关的主键策略
1、shortNanoTime 22位有序安全ID,格式: 13位当前毫秒+6位纳秒+3位主机ID
2、nanoTimeId 26位有序安全ID,格式:15位:yyMMddHHmmssSSS+6位纳秒+2位(线程Id+随机数)+3位主机ID
3、uuid:32 位uuid
4、SnowflakeId 雪花算法ID
5、redisId 基于redis 来产生规则的ID主键
  • 提供了通用字段赋值处理

  • 提供了树形表的统一处理机制

  • sql文件更新自动重载,便于开发阶段无需重启应用
  • 慢sql统计功能
  • 便于跟其他拓展平台集成,如报表平台、配置化服务平台


 

public class SqlToyContext implements ApplicationContextAware {

   // 省略其他代码

  /**
     * @todo 提供可以动态增加解析sql片段配置的接口,并返回具体id,用于第三方平台集成,如报表平台等
     * @param sqlSegment
     * @return
     * @throws Exception
     */
    public synchronized SqlToyConfig parseSqlSegment(Object sqlSegment) throws Exception {
        return scriptLoader.parseSqlSagment(sqlSegment);
    }

}

 

展开阅读全文
19 收藏
分享
加载中
精彩评论
你不觉得xml 书写太繁琐了,能不能采用类似jfinal enjoy sql 的方式
2020-06-03 10:00
2
举报
最新评论 (16)
不少人见xml就反,以为引入模板引擎或md模式比较好
1、xml的优势是schema,可以校验书写格式,同时可以进行自动提示,帮助大家编写,而不是硬记。
2、如果不用xml,复杂的sql难道也写在代码中?不写代码中就肯定要写在一个文件中,那是xml还是其他本质都一样,sqltoy的xml sql主体跟xml并没有关系,xml只是用于实现扩展功能。
3、简单的查询是可以写在代码中的,这个并没有争议
2020-06-03 17:33
0
回复
举报
sqltoy这个#【】就是模板了,支持嵌套,无需再引入一个模板引擎!
细细分析就可以得出结论:
1、如果再引入模板引擎其实解决的还是if() 逻辑判断问题,必须要给判断区块有明显的标记,结果又变成一样的效果。
2、xml并不是核心问题,sqltoy用xml并没有用它来做类似if判断,只是利用xml的schema和扩展性,来进行格式校验还有扩展功能的实施。
3、经过全面的平衡分析,xml其实是合适的
2020-06-03 17:17
0
回复
举报
为自己的框架打个广告。基于spring封装的orm,个人用了7,8年了。https://www.oschina.net/p/turbo。仅供学习。
2020-06-03 15:44
0
回复
举报
😄,看了你的作品,值得鼓励!开源不易,为了兴趣坚持也不易!
2020-06-03 16:31
0
回复
举报
说极致性能大家不加思索认为浮夸,毕竟这属于社会普遍现象,我们以分页优化为试金石,看一下优化的极致!

请看这篇文章(不要告诉我你没有看懂啥意思!):

https://blog.csdn.net/zhongxu/article/details/105555803
2020-06-03 15:21
0
回复
举报
不错,感觉是国产的新一代 数据库工具了!
2020-06-03 13:32
0
回复
举报
何必呢
2020-06-03 12:24
0
回复
举报
真实体验,很多用法和理念,用了一段时间才能体会到,习惯了,感觉没有那么多反锁,缓存翻译,sql写法,挺直观的,期待更多特性
2020-06-03 12:11
0
回复
举报
大家可能没有太深入地使用这个工具,我用了段时间觉得书写方式相对还好,主要优点还是缓存翻译、快速分页、汇总旋转,提升性能还是比较明显的。
2020-06-03 12:08
0
回复
举报
期待
2020-06-03 10:48
0
回复
举报
这是不是算是夸下海口了呢
2020-06-03 10:14
0
回复
举报
欢迎用大家举例交流!sqltoy最大的优势就是查询优势,如果能够读懂分页优化就会有比较!
2020-06-03 13:20
0
回复
举报
更多评论
16 评论
19 收藏
分享
返回顶部
顶部