sqltoy-orm 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
sqltoy-orm 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
sqltoy-orm 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
sqltoy-orm 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
sqltoy-orm 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !

软件简介

sqltoy-orm是比hibernate+myBatis更加贴合项目的orm框架,具有hibernate增删改的便捷性同时也具有比myBatis更加灵活优雅的自定义sql查询功能。 支持以下数据库:

  • oracle 11g+
  • db2 9.5+,建议从10.5 开始
  • mysql(mariadb/innosql)支持5.6、5.7、8.0 版本
  • postgresql(greenplum) 支持9.5 以及以上版本
  • sqlserver 支持2008到2019版本,建议使用2012或以上版本
  • sqlite
  • DM达梦数据库
  • elasticsearch 只支持查询,版本支持5.7+版本,建议使用7.3以上版本
  • clickhouse
  • oceanBase
  • guassdb
  • tidb
  • kingbase
  • mongodb (只支持查询)
  • sybase_iq 支持15.4以上版本,建议使用16版本

1.1 是否重复造轮子,我只想首先说五个特性:

  • 根本上杜绝了sql注入问题,sql支持写注释、sql文件动态更新检测,开发时sql变更会自动重载
  • 最直观的sql编写模式,当查询条件稍微复杂一点的时候就会体现价值,后期变更维护的时候尤为凸显
  • 极为强大的缓存翻译查询:巧妙的结合缓存减少查询语句表关联,极大简化sql和提升性能。
  • 最强大的分页查询:很多人第一次了解到何为快速分页、分页优化这种极为巧妙的处理,还有在count语句上的极度优化。
  • 跨数据库函数方言替换,如:isnull/ifnull/nvl、substr/substring 等不同数据库

当然这只是sqltoy其中的五个特点,还有行列转换(俗称数据旋转)、多级分组汇总、统一树结构表(如机构)查询、分库分表sharding、取随机记录、取top记录、修改并返回记录、慢sql提醒等这些贴合项目应用的功能, 当你真正了解上述特点带来的巨大优势之后,您就会对中国人创造的sqltoy-orm有了信心!

sqltoy-orm 来源于个人亲身经历的无数个项目的总结和思考,尤其是性能优化上不断的挖掘,至于是不是重复的轮子并不重要,希望能够帮到大家!

2. 快速特点说明

2.1 最优雅直观的sql编写模式

  • sqltoy 的写法(一眼就看明白sql的本意,后面变更调整也非常便捷,copy到数据库客户端里稍做出来即可执行)
  • sqltoy条件组织原理很简单: 如 #[order_id=:orderId] 等于if(:orderId<>null) sql.append(order_id=:orderId);#[]内只要有一个参数为null即剔除
  • 支持多层嵌套:如 #[and t.order_id=:orderId #[and t.order_type=:orderType]]
  • 条件判断保留#[@if(:param>=xx ||:param<=xx1) sql语句] 这种@if()高度灵活模式,为特殊复杂场景下提供万能钥匙
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>

2.2 天然防止sql注入,执行过程:

  • 假设sql语句如下
select 	*
from sqltoy_device_order_info t 
where #[t.ORGAN_ID in (:authedOrganIds)]
      #[and t.TRANS_DATE>=:beginDate]
      #[and t.TRANS_DATE<:endDate] 
  • java调用过程
sqlToyLazyDao.findBySql(sql, new String[] { "authedOrganIds","beginDate", "endDate"},
				new Object[] { authedOrganIdAry,beginDate,null}, DeviceOrderInfoVO.class);
  • 最终执行的sql是这样的:
select 	*
from sqltoy_device_order_info t 
where t.ORDER_ID=?
      and t.ORGAN_ID in (?,?,?)
      and t.TRANS_DATE>=?	
  • 然后通过: pst.set(index,value) 设置条件值,不存在将条件直接作为字符串拼接为sql的一部分

2.3 最强大的分页查询

2.3.1 分页特点说明

  • 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分页考虑是最优化的,如: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

2.3.1 分页sql示例

<!-- 快速分页和分页优化演示 -->
<sql id="sqltoy_fastPage">
	<!-- 分页优化器,通过缓存实现查询条件一致的情况下在一定时间周期内缓存总记录数量,从而无需每次查询总记录数量 -->
	<!-- alive-max:最大存放多少个不同查询条件的总记录量; alive-seconds:查询条件记录量存活时长(比如120秒,超过阀值则重新查询) -->
	<page-optimize alive-max="100" alive-seconds="120" />
	<value>
		<![CDATA[
		select t1.*,t2.ORGAN_NAME 
		-- @fast() 实现先分页取10条(具体数量由pageSize确定),然后再关联
		from @fast(select t.*
			   from sqltoy_staff_info t
			   where t.STATUS=1 
			     #[and t.STAFF_NAME like :staffName] 
			   order by t.ENTRY_DATE desc
			    ) t1 
		left join sqltoy_organ_info t2 on  t1.organ_id=t2.ORGAN_ID
			]]>
	</value>
	
	<!-- 这里为极特殊情况下提供了自定义count-sql来实现极致性能优化 -->
	<!-- <count-sql></count-sql> -->
</sql>

2.3.3 分页java代码调用

/**
 *  基于对象传参数模式
 */
public void findPageByEntity() {
	PaginationModel pageModel = new PaginationModel();
	StaffInfoVO staffVO = new StaffInfoVO();
	// 作为查询条件传参数
	staffVO.setStaffName("");
	// 使用了分页优化器
	// 第一次调用:执行count 和 取记录两次查询
	PaginationModel result = sqlToyLazyDao.findPageBySql(pageModel, "sqltoy_fastPage", staffVO);
	System.err.println(JSON.toJSONString(result));
	// 第二次调用:过滤条件一致,则不会再次执行count查询
	//设置为第二页
	pageModel.setPageNo(2);
	result = sqlToyLazyDao.findPageBySql(pageModel, "sqltoy_fastPage", staffVO);
	System.err.println(JSON.toJSONString(result));
}

/**
 *  基于参数数组传参数
 */
public void findPageByParams() {
	//默认pageSize 为10,pageNo 为1
	PaginationModel pageModel = new PaginationModel();
	String[] paramNames=new String[]{"staffName"};
	Object[] paramValues=new  Object[]{""};
	PaginationModel result = sqlToyLazyDao.findPageBySql(pageModel, "sqltoy_fastPage",paramNames,paramValues,StaffInfoVO.class);
	System.err.println(JSON.toJSONString(result));
}
	

2.4 最巧妙的缓存应用,将多表关联查询尽量变成单表(看下面的sql,如果不用缓存翻译需要关联多少张表?sql要有多长?多难以维护?)

  • 1、 通过缓存翻译: 将代码转化为名称,避免关联查询,极大简化sql并提升查询效率
  • 2、 通过缓存名称模糊匹配: 获取精准的编码作为条件,避免关联like 模糊查询
<sql id="sqltoy_order_search">
	<!-- 缓存翻译设备类型
        cache:具体的缓存定义的名称,
        cache-type:一般针对数据字典,提供一个分类条件过滤
	columns:sql中的查询字段名称,可以逗号分隔对多个字段进行翻译
	cache-indexs:缓存数据名称对应的列,不填则默认为第二列(从0开始,1则表示第二列),
	      例如缓存的数据结构是:key、name、fullName,则第三列表示全称
	-->
	<translate cache="dictKeyNameCache" cache-type="DEVICE_TYPE" columns="deviceTypeName" cache-indexs="1"/>
	<!-- 员工名称翻译,如果同一个缓存则可以同时对几个字段进行翻译 -->
	<translate cache="staffIdNameCache" columns="staffName,createName" />
	<filters>
		<!-- 反向利用缓存通过名称匹配出id用于精确查询 -->
		<cache-arg cache-name="staffIdNameCache" param="staffName" alias-name="staffIds"/>
	</filters>
	<value>
	<![CDATA[
	select 	ORDER_ID,
		DEVICE_TYPE,
		DEVICE_TYPE deviceTypeName,-- 设备分类名称
		STAFF_ID,
		STAFF_ID staffName, -- 员工姓名
		ORGAN_ID,
		CREATE_BY,
		CREATE_BY createName -- 创建人名称
	from sqltoy_device_order_info t 
	where #[t.ORDER_ID=:orderId]
	      #[and t.STAFF_ID in (:staffIds)]
		]]>
	</value>
</sql>

最跨数据库

  • 1、提供类似hibernate性质的对象操作,自动生成相应数据库的方言。
  • 2、提供了最常用的:分页、取top、取随机记录等查询,避免了各自不同数据库不同的写法。
  • 3、提供了树形结构表的标准钻取查询方式,代替以往的递归查询,一种方式适配所有数据库。
  • 4、sqltoy提供了大量基于算法的辅助实现,最大程度上用算法代替了以往的sql,实现了跨数据库
  • 5、sqltoy提供了函数替换功能,比如可以让oracle的语句在mysql或sqlserver上执行(sql加载时将函数替换成了mysql的函数),最大程度上实现了代码的产品化。 default:SubStr\Trim\Instr\Concat\Nvl 函数;可以参见org.sagacity.sqltoy.plugins.function.Nvl 代码实现
       <!-- 跨数据库函数自动替换(非必须项),适用于跨数据库软件产品,如mysql开发,oracle部署 -->
   <property name="functionConverts" value="default">
   <!-- 也可以这样自行根据需要进行定义和扩展
   <property name="functionConverts">
   	<list>
   		<value>org.sagacity.sqltoy.plugins.function.Nvl</value>
   		<value>org.sagacity.sqltoy.plugins.function.SubStr</value>
   		<value>org.sagacity.sqltoy.plugins.function.Now</value>
   		<value>org.sagacity.sqltoy.plugins.function.Length</value>
   	</list>
   </property> -->
</bean>

2.5 提供行列转换(数据旋转),避免写复杂的sql或存储过程,用算法来化解对sql的高要求,同时实现数据库无关(不管是mysql还是sqlserver)

        <!-- 列转行测试 -->
	<sql id="sys_unpvoitSearch">
		<value>
		<![CDATA[
		SELECT TRANS_DATE, 
		       sum(TOTAL_AMOUNT) TOTAL_AMOUNT,
		       sum(PERSON_AMOUNT) PERSON_AMOUNT,
		       sum(COMPANY_AMOUNT) COMPANY_AMOUNT
		FROM sys_unpivot_data
		group by TRANS_DATE
		]]>
		</value>
		<!-- 将指定的列变成行(这里3列变成了3行) -->
		<unpivot columns="TOTAL_AMOUNT:总金额,PERSON_AMOUNT:个人金额,COMPANY_AMOUNT:企业金额"
			values-as-column="TRANS_AMOUNT" labels-as-column="AMOUNT_TYPE" />
	</sql>

	<!-- 行转列测试 -->
	<sql id="sys_pvoitSearch">
		<value>
		<![CDATA[
		select t.TRANS_DATE,t.TRANS_CHANNEL,TRANS_CODE,sum(t.TRANS_AMT) TRANS_AMT from sys_summary_case t
		group by t.TRANS_DATE,t.TRANS_CHANNEL,TRANS_CODE
		order by t.TRANS_DATE,t.TRANS_CHANNEL,TRANS_CODE
		]]>
		</value>
		<pivot category-columns="TRANS_CHANNEL,TRANS_CODE" start-column="TRANS_AMT"
			default-value="0" default-type="decimal" end-column="TRANS_AMT"
			group-columns="TRANS_DATE" />
	</sql>

2.6 提供分组汇总求平均算法(用算法代替sql避免跨数据库语法不一致)

	<!-- 汇总计算 (场景是sql先汇总,页面上还需要对已有汇总再汇总的情况,如果用sql实现在跨数据库的时候就存在问题)-->
	<sql id="sys_summarySearch">
		<!-- 数据源sharding,多库将请求压力分摊到多个数据库节点上,支撑更多并发请求 -->	
		<sharding-datasource strategy="multiDataSource" />
		<value>
		<![CDATA[
		select	t.TRANS_CHANNEL,t.TRANS_CODE,sum( t.TRANS_AMT )
		from sys_summary_case t
		group by t.TRANS_CHANNEL,t.TRANS_CODE
		]]>
		</value>
		<!-- reverse 表示将汇总信息在上面显示(如第1行是汇总值,第2、3、4行为明细,反之,1、2、3行未明细,第4行为汇总)  -->
		<summary columns="2" reverse="true" sum-site="left" radix-size="2">
			<global sum-label="总计" label-column="0" />
                        <!-- 可以无限层级的分组下去-->
			<group sum-label="小计/平均" label-column="0" group-column="0" average-label="平均" />
		</summary>
	</sql>

2.7 分库分表

2.7.1 查询分库分表(分库和分表策略可以同时使用)

        sql参见showcase项目:com/sagframe/sqltoy/showcase/sqltoy-showcase.sql.xml 文件
        sharding策略配置参见:src/main/resources/spring/spring-sqltoy-sharding.xml 配置
        <!-- 演示分库 -->
	<sql id="sqltoy_db_sharding_case">
		<sharding-datasource
			strategy="hashBalanceDBSharding" params="userId" />
		<value>
			<![CDATA[
			select * from sqltoy_user_log t 
			-- userId 作为分库关键字段属于必备条件
			where t.user_id=:userId 
			#[and t.log_date>=:beginDate]
			#[and t.log_date<=:endDate]
				]]>
		</value>
	</sql>

	<!-- 演示分表 -->
	<sql id="sqltoy_15d_table_sharding_case">
		<sharding-table tables="sqltoy_trans_info_15d"
			strategy="historyTableStrategy" params="beginDate" />
		<value>
			<![CDATA[
			select * from sqltoy_trans_info_15d t 
			where t.trans_date>=:beginDate
			#[and t.trans_date<=:endDate]
				]]>
		</value>
	</sql>
        

2.7.2 操作分库分表(vo对象由quickvo工具自动根据数据库生成,且自定义的注解不会被覆盖)

@Sharding 在对象上通过注解来实现分库分表的策略配置

参见:com.sagframe.sqltoy.showcase.ShardingCaseServiceTest 进行演示

package com.sagframe.sqltoy.showcase.vo;

import java.time.LocalDate;
import java.time.LocalDateTime;

import org.sagacity.sqltoy.config.annotation.Sharding;
import org.sagacity.sqltoy.config.annotation.SqlToyEntity;
import org.sagacity.sqltoy.config.annotation.Strategy;

import com.sagframe.sqltoy.showcase.vo.base.AbstractUserLogVO;

/**
 * @project sqltoy-showcase
 * @author zhongxuchen
 * @version 1.0.0 Table: sqltoy_user_log,Remark:用户日志表
 */
/*
 * db则是分库策略配置,table 则是分表策略配置,可以同时配置也可以独立配置
 * 策略name要跟spring中的bean定义name一致,fields表示要以对象的哪几个字段值作为判断依据,可以一个或多个字段
 * maxConcurrents:可选配置,表示最大并行数 maxWaitSeconds:可选配置,表示最大等待秒数
 */
@Sharding(db = @Strategy(name = "hashBalanceDBSharding", fields = { "userId" }),
		// table = @Strategy(name = "hashBalanceSharding", fields = {"userId" }),
		maxConcurrents = 10, maxWaitSeconds = 1800)
@SqlToyEntity
public class UserLogVO extends AbstractUserLogVO {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1296922598783858512L;

	/** default constructor */
	public UserLogVO() {
		super();
	}
}
展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (23)

加载中
大家大多数一直使用mybatis-plus,ss可否与mp并存?请专门讲解一下。
09/30 17:07
回复
举报
以前有过类似的想法,因为各种原因作罢 看到作者的说明,当时就眼前一亮,陆陆续续在后续一些项目中开始替换掉jpa和mybatis。 有几个小改进,看看作者是否会考虑 第一是 如果能够支持公共的父类就好了,比如一些通用字段,id 创建时间 修改时间 删除标记等. 第二是 实体能够支持枚举。 第三是 unifyFieldsHandler支持注解如@PreUpdate之类的。 以上可以看出来,其实都是jpa的特性,但是确实好用,其实自己也改造了,如果官方可以支持就完美了。
08/23 17:54
回复
举报
打分: 力荐
我找了好久,终于找到了
05/13 14:45
回复
举报
mongodb es 希望事物,crud
05/13 12:44
回复
举报
zhongxuchen软件作者
之前很多人让我用sqltoy跟beeltsql比较比较,考虑大家开源不易我都拒绝了,最近在sqltoy交流群里有不少用beeltsql的用户转用sqltoy,然后给了我截图,我就放到了之前的文章中 https://my.oschina.net/u/4234377/blog/4305669
2020/11/19 15:10
回复
举报
sqlToyLazyDao.findBySql(sql, new String[] { "authedOrganIds","beginDate", "endDate"}, new Object[] { authedOrganIdAry,beginDate,null}, DeviceOrderInfoVO.class); 这种调用感觉还是复杂了下特别是参数比较多时,倾向于用Map传参 如:Map paras = new HashMap<>(); paras.put("authedOrganIds",authedOrganIdAry) ; paras.put("beginDate",beginDate) ; paras.put("endDate",null) ; sqlToyLazyDao.findBySql(sql, paras , DeviceOrderInfoVO.class); 这个可以自己简单封装下,不知道原生是否可以提供下
2020/10/23 10:29
回复
举报
zhongxuchen软件作者
已经支持map 传参了,支持map传参、支持传统数组传参,也支持对象直接传参
2020/11/13 14:23
回复
举报
很牛逼的东东,行转列,列转行不是最基础的SQL东东,SQL调优也是吧....难道现在程序员都这么懒的
2020/10/10 23:49
回复
举报
zhongxuchen软件作者
不能指望每个程序员直接写,如果作为产品,这些sql语法换了数据库就不通用了,但算法就不关心你是什么数据库了
2020/11/13 14:36
回复
举报
看介绍感觉很棒,核心点放在了稍大数据量的复杂查询,分库分表上
2020/06/24 15:48
回复
举报
zhongxuchen软件作者
是的,果然高手! 因为简单的crud或者单表查询大家都不担心,市场上大量这类的框架,但针对复杂查询和性能优化却是始终的难题 普通的crud这些简单的其实sqltoy做的也比他们好,只是这种太普通了,不足以说道
2020/11/19 14:49
回复
举报
sqltoy很赞,作者很赞。提了对国产数据库的支持问题,作者迅速的解决了。 强烈支持!
2020/06/07 09:50
回复
举报
超级赞。那个别名的数据转换减少表关联是一个超级赞的东西,18年的时候我在这方面下了一些功夫 https://my.oschina.net/cnzzs/blog/2878369
2020/05/26 20:32
回复
举报
更多评论
发表了资讯
10/19 10:54

新一代国产 ORM 框架 sagacity-sqltoy-5.1.9 发版,统一授权传参和越权校验

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、增加统一数据权限传参和越权检查,参照文档统一字段处理章节配置 2、兼容sql中参数名称含中文的特殊场景 3、@loop(:paramName,sql片段)支持类似:staffInfos[i].birthday 对象子属性模式,为应对极端场景...

23
12
发表了资讯
10/13 10:40

sagacity-sqltoy 5.1.8、4.18.48 发版

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、batchUpdate方法支持List<Map>传参数模式,同时支持子类属性 2、修复sql去除回车换行导致@if()中或(||)符号被替换的bug qltoy的关键优势: //------------------了解 sqltoy的关键优势: -------------...

0
4
发表了资讯
09/29 13:23

sagacity-sqltoy-5.1.6 发版,你还在用 mybatis(plus) 吗?

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、排查修复db2 updateSaveFetch锁语句为for update with rs 2、优化queryResult中labelTypes类型处理(针对存在缓存翻译、格式化场景改变了结果类型),此类型数据为备用属性,不影响实际查询过程 3、升级依赖...

9
7
发表了资讯
09/18 13:30

sagacity-sqltoy 睿智 ORM 5.1.4、4.18.43 发版,中秋前完善极端场景诉求

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、增加findEntity可以用entity查询但返回结果类型是dto的接口方法 /**  * @TODO 通过entity实体进行查询,但返回结果类型可自行指定  * @param <T>  * @param entityClass  * @param entityQuer...

1
0
发表了资讯
09/16 09:27

sagacity-sqltoy 睿智 ORM 5.1.3、4.18.42 发版,真正睿智的 ORM

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、增加获取数据库表信息和表字段信息功能 //用法:getTableColumns(null, null, "SYS_STAFF_INFO") public List<ColumnMeta> getTableColumns(final String catalog, final String schema, final Strin...

0
2
发表了资讯
09/08 10:51

sagacity-sqltoy 睿智 ORM 5.1.2、4.18.41 发版,真正睿智的 ORM!

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、修复updateSaveFetch锁查询、修改(不存在则插入)、并返回修改后结果功能在复合主键场景下的bug 2、修复sqlite数据库identity主键策略insert的缺陷 3、优化saveOrUpdate,增加当主键值为null时直接走sav...

1
7
发表了资讯
09/02 09:46

sagacity-sqltoy 睿智 ORM 框架 5.1.0 和 4.18.39 版本发布,增加新特性

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、针对类似库存台账、客户资金帐等强事务、高并发场景,提供updateSaveFetch新的一次数据库交互完成锁查询、更新、记录不存在则插入、返回的全过程的方法 /** * @TODO 适用于库存台账、客户资金账等高...

6
2
发表了资讯
08/23 14:39

sagacity-sqltoy 睿智 ORM 框架 5.0.12 和 4.18.37 版本发布

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、修复NumberUtil类数字转中文金额过亿元万位数全为零的一个缺陷 2、elastic sql http模式执行下增加@blank(:name)和@value(:name) sqltoy的关键优势: //------------------了解 sqltoy的关键优势: ---...

4
4
发表了资讯
08/18 11:21

sagacity-sqltoy 睿智 ORM 框架 5.0.11 和 4.18.36 版本发布

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、优化重复sqlId的提示和处理 2、升级pom依赖版本 sqltoy的关键优势: //------------------了解 sqltoy的关键优势: -------------------------------------------------------------------------------...

3
2
发表了资讯
08/06 17:03

sagacity-sqltoy 睿智 ORM 框架 5.0.9 和 4.18.33 版本发布

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、支持impalajdbc,主要针对kudu进行了集成,进一步增强大数据体系下的应用 2、findEntity的EntityQuery增加了groupBy()和having() 参数设置 3、优化支持elasticsearch原生sql取top记录的sql组织方式 4、优...

4
3
发表了资讯
07/23 10:18

sagacity-sqltoy 睿智 ORM 框架 5.0.7、 4.18.31 版本发布

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1.修复oracle数据库oracle.sql.TIMESTAMP 转LocalDateTime的支持 sqltoy特点介绍: sqltoy最佳sql编写模式,便于开发和后期维护 sqltoy的缓存翻译,大幅减少表关联简化sql,让你的查询性能成几何级提升 极致...

0
4
发表了资讯
07/13 11:34

sagacity-sqltoy 睿智 ORM 框架 5.0.6、4.18.30 发版

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1.优化执行带有缓存翻译的查询,在首次执行时因获取缓存影响当前sql执行后台日志输出问题(建议升级,以免单元测试时产生对日志的困惑)! 感谢网友的反馈,sqltoy及时发版进行修正 sqltoy特点介绍: sqlt...

4
1
发表了资讯
07/09 14:34

sagacity-sqltoy 睿智 ORM 框架 5.0.2、4.18.28 发版

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1. 查询参数findBySql(String sql,Map paramsMap,Class resultType) map支持多层子对象属性 String sql="select * from table where id=:staff.id and name like :staff.name" Map paramMap=new HashMa...

0
3
发表了资讯
06/30 10:13

sqltoy-orm-5.0.0 发版,分享给大家最睿智的 ORM 框架!

写在开头 sagacity-sqltoy 是JPA+超强查询有机融合体,是个人长期项目实践的归纳总结,极为注重项目过程实践,尤其是项目痛点,如:sql注入、动态条件sql编写、树形结构查询、sql跨数据库、查询性能极致优化、极致的分页查询、涉及统计分析的行列转换、分组汇总计算等等,都有极为独特的解决策略! 感谢广大网络用户的支持和反馈,sagacity-sqltoy5.0 在拥有良好特性的基础上进一步完善了代码结构,必将更好的为大家的选择提供坚...

2
7
发表了资讯
06/10 13:43

sqltoy-orm-4.18.25 发版

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、修复oracle 表无主键保存的一个NPP错误 2、优化defaultDataSource获取模式,适应dynamic-datasource插件场景 3、在sqlToyContext中扩展了ConnectionFactory 供自定义获取当前ThreadLocal中的connection的...

1
4
发表了资讯
05/28 21:45

sqltoy-orm-4.18.22 发版,还在坚持 mybatis(plus) 吗?

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、在findEntity中EntityQuery可以设置fetchSize,在sqltoyContext中可以全局设置fetchSize,实现查询数据提取的性能 2、针对一些特殊原因导致表名是数据库关键词场景的兼容 ORM的最佳形态:类JPA对象式操作...

2
7
发表了资讯
05/24 10:48

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

开源地址: 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作为内部框架取得...

0
4
发表了资讯
05/13 10:04

sqltoy-orm 4.18.20 发版,您还在坚持 mybatis(plus) 吗?

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、优化wrapTreeTable 表名取schemaTable,即当pojo中含schema时为schema.xxxx 形式 2、在QueryExecutor中增加pivot和Unpivot操作,为开发者提供动态设置操作 心中理想的ORM框架应该是什么? 个人的观念是:...

9
12
发表了资讯
04/28 10:54

sqltoy-orm 4.18.18 发版,优化 sql 中注释处理、缓存未匹配日志输出等

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、优化部分极端场景sql中单行注释没有被剔除的缺陷 2、修复部分数据库getUpdateCount() 提示信息不准确问题 3、缓存翻译在未匹配到时,当有未匹配模板时不输出日志 4、spring依赖包版本升级...

0
0
04/16 09:41

sqltoy-orm 4.18.13 发版,您还在坚持 mybatis(plus) 吗?

开源地址: github: https://github.com/sagframe/sagacity-sqltoy gitee: https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装): https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、 增加DataSourceSelector,为多数据源场景下使用其他开源插件如dynamic-datasource等提供扩展 2、升级依赖包版本 心中理想的ORM框架应该是什么? 个人的观念是:JPA+更加灵活高效的sql组织和执行机制,任...

49
8
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
2020/04/08 13:19

分析sqltoy-orm的价值和场景思考(远比mybatis强大的sqltoy)

sqltoy开源地址: https://github.com/sagframe/sagacity-sqltoy sqltoy gitee地址: https://gitee.com/sagacity/sagacity-sqltoy 在此之前写了一篇列举sqltoy远比mybatis强大的十几条特点,基本上采取了严谨的举证模式。 具体参见:为什么说sqltoy-orm远比mybatis强大 https://www.oschina.net/news/114671/sqltoy-orm-vs-mybatis#comments 很多人说我就坚持mybatis,其实并没有关系,写文章不在于强迫谁去选择,而是互通有无...

0
1
2020/04/12 18:59

到底要不要用 ORM?ORM vs. 非 ORM 对比

我一直很喜欢使用 Go 的 database/sql 包来处理数据库。最近,一些涉及 Gorm 的问题激起了我对 Go 中 使用 ORM vs. 直接使用 database/sql 的好奇心。在 ORM 方面曾有过丰富的经验,所以我决定开始一个实验:利用 Gorm 和 非 ORM 编写同一个简单的应用程序,并比较付诸的努力。 这促使我写下了一些关于 ORM 优缺点的想法。如果您对此感兴趣,请继续阅读! 非 ORM vs. ORM 的相关经验 实验中,定义了一个可作为博客引擎子集的简单...

0
0
发表了博客
2019/11/04 20:27

orm

[TOC] orm 对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示着额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的...

0
0
发表了博客
2019/02/26 18:02

ORM

一、ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,简单的说:ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。 ORM在业务逻辑层和数据库层之间充当了桥梁的作用 二、Django中的ORM 2.1、Django连接MySql 在Django项目的settings.py文件中,配置数据库连接信息 DATABASES = { "default": { ...

0
0
2018/08/07 11:01

ORM

对象-关系映射(OBJECT/RELATIONALMAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单的操作实体对象的属性和方法 [2] 。O R M 技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
23 评论
183 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部