首页 文章 精选 留言 我的

精选列表

搜索[orm框架],共10000篇文章
优秀的个人博客,低调大师

sqltoy-orm 5.2.64 发版,JPA+ 最佳 sql 写法!

为什么选择 mybatis?自由的 sql?假设其他一切对等,sqltoy 的 sql 写法是否可以否定掉 mybatis 的写法? 开源地址: github:https://github.com/sagframe/sagacity-sqltoy gitee:https://gitee.com/sagacity/sagacity-sqltoy idea 插件 (可直接在 idea 中检索安装):https://github.com/threefish/sqltoy-idea-plugins sqltoy 脚手架项目:https://gitee.com/momoljw/sss-rbac-admin sqltoy lambda 项目:https://gitee.com/gzghde/sqltoy-plus 更新内容 1、优化@loop在update语句参数为null的场景,之前缺陷是值为null时被转为field is null,正确模式field=null update table set @loop-full(:fields,':fields[i].name=:fields[i].value',',') where id=:id sqltoy 的关键优势: //------------------了解 sqltoy的关键优势: -------------------------------------------------------------------------------------------*/ //1、最简最直观的sql编写方式(不仅仅是查询语句),采用条件参数前置处理规整法,让sql语句部分跟客户端保持高度一致 //2、sql中支持注释(规避了对hint特性的影响,知道hint吗?搜oracle hint),和动态更新加载,便于开发和后期维护整个过程的管理 //3、支持缓存翻译和反向缓存条件检索(通过缓存将名称匹配成精确的key),实现sql简化和性能大幅提升 //4、支持快速分页和分页优化功能,实现分页最高级别的优化,同时还考虑到了cte多个with as情况下的优化支持 //5、支持并行查询 //6、根本杜绝sql注入问题 //7、支持行列转换、分组汇总求平均、同比环比计算,在于用算法解决复杂sql,同时也解决了sql跨数据库问题 //8、支持保留字自动适配 //9、支持跨数据库函数自适配,从而非常有利于一套代码适应多种数据库便于产品化,比如oracle的nvl,当sql在mysql环境执行时自动替换为ifnull //10、支持分库分表 //11、提供了取top、取random记录、树形表结构构造和递归查询支持、updateFetch单次交互完成修改和查询等实用的功能 //12、sqltoy的update、save、saveAll、load 等crud操作规避了jpa的缺陷,参见update(entity,String...forceUpdateProps)和updateFetch //13、提供了极为人性化的条件处理:排它性条件、日期条件加减和提取月末月初处理等 //14、提供了查询结果日期、数字格式化、安全脱敏处理,让复杂的事情变得简单,大幅简化sql或结果的二次处理工作 //-----------------------------------------------------------------------------------*/ sqltoy 特点介绍: sqltoy 的核心构建思想 sqltoy 的对比 mybatis (plus) 的核心点:查询语句编写、可阅读性、可维护性 对象化 crud 是基础,但 sqltoy 有针对性的改进:update、updateSaveFetch、updateFetch 等 sqltoy 的缓存翻译,大幅减少表关联简化 sql,让你的查询性能成几何级提升 极致的分页,同样帮助你实现查询的性能大幅提升 快速分页:@fast () 实现先取单页数据然后再关联查询,极大提升速度 分页优化器:page-optimize 让分页查询由两次变成 1.3~1.5 次 (用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询 sqltoy 的分页取总记录的过程不是简单的 select count (1) from (原始 sql);而是智能判断是否变成:select count (1) from 'from 后语句 ', 并自动剔除最外层的 order by sqltoy 支持并行查询:parallel="true",同时查询总记录数和单页数据,大幅提升性能 便利的跨数据库统计计算:数据旋转 便利的跨数据库统计计算:无限极分组统计 (含汇总求平均) 便利的跨数据库统计计算:同比环比 5、树形表排序汇总 6、扩展集成

优秀的个人博客,低调大师

sqltoy-orm 4.18.8 发版,强化 Clickhouse 和 DorisDB 支持

开源地址: github:https://github.com/sagframe/sagacity-sqltoy gitee:https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装):https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、clickhouse支持update,并优化delete和批量delete 功能 2、支持dorisdb数据库的查询、增加、删除等操作。 3、配套clickhouse和dorisdb完善quickvo工具 致谢 感谢广大网络用户的支持和反馈,让sqltoy功能越来越完备可靠

优秀的个人博客,低调大师

从ORM到OQM之3:查询对象和动态查询映射

1. 引言 在对使用if语句构建动态查询的代码进行重构后,我们实现了一种可以通过查询对象的实例直接构建动态查询的方法。这种方法包括以下步骤: 遍历查询对象的所有字段; 通过反射获取字段的赋值,根据已赋值字段的注解得到对应的查询条件,并将字段的赋值添加到参数列表。 使用AND将多个查询条件组合成查询子句。 借助这种方法,每新增一个查询条件,只需在查询对象中添加一个字段和声明了SQL条件的注解即可。 并且由于其通用性,构建动态查询的实现方法可以放在单独的仓库中进行维护和发布。 然而,随着查询条件的类型和数量的增加,通过注解声明查询条件的弊端也逐渐显现,主要存在以下问题: 查询条件中的列名和字段名称存在重复; IN操作符的变长占位符需要特殊处理; 需要使用OR运算符连接多个查询条件; 需要支持子查询。 通过分析,我们发现操作符为等号的查询条件可以直接从字段名映射而得,从而避免在注解中重复编写SQL条件。这也让我们发现了消除SQL注解这个优化方向。 2. 查询条件归类 基于查询条件的特性,我们将其分为以下四类,每类查询条件由一种类型的字段映射得到: 包含列名、运算符和参数的基础查询条件 使用AND/OR连接的查询条件 含有子查询的查询条件 涉及多对多关系的查询条件 2.1. 谓词后缀字段 基础查询条件由列名、比较运算符和参数三部分构成,可以通过谓词后缀字段自动映射。 谓词后缀字段的命名格式通常为列名加上一个谓词后缀,这些后缀可以直接表示常见的比较运算符,例如,Eq代表等于=、Gt代表大于>等等。这种设计在DSL(领域特定语言)中非常常见。 使用谓词后缀对字段进行命名还有另一个好处。当需要为某列定义比较符不同的多个查询条件时,不同的谓词后缀可以避免字段间的命名冲突。 以UserQuery类为例,原先通过@QueryField注解声明查询条件的代码可以被简化成以下形式: publicclassUserQuery{ privateStringname;//name=? privateStringnameLike;//nameLIKE? privateIntegerageGt;//age>? } 在根据谓词后缀构造查询条件时,我们还会根据字段的赋值情况动态生成占位符和处理参数。例如: 对于IN查询条件,可以根据参数个数自动生成对应个数的占位符; 对于LIKE查询条件,则根据谓词后缀为字段值自动添加%。详见附录A谓词后缀表的对应部分。 这种设计还让查询对象的构建更加直观。当为查询对象的字段赋值时,开发者可以直接根据字段名及其后缀的含义明确对应的SQL查询条件。 附录A中的谓词后缀表列出了常见的谓词后缀和SQL查询条件的映射关系,为使用这些字段定义提供了参考。 2.2. 逻辑后缀字段 由逻辑运算符AND或OR连接的多个查询条件,由逻辑后缀字段映射得到。 逻辑后缀字段的类型为集合或者查询对象,用于映射多个查询条件。 逻辑后缀字段的名称中包含逻辑后缀AND/OR,用于指定连接多个查询条件的逻辑运算符。 逻辑后缀字段的类型可以是查询对象或集合,其中每个字段或元素映射到一个查询条件,所有映射的条件由逻辑后缀确定的逻辑运算符组合而成。 这张表格展示了以Or为后缀的三种字段类型的逻辑后缀字段的映射示例: 字段 取值 (JSON格式) 查询条件 List<String> nameOr ["test1","test2"] name = ? OR name = ? UserQuery userOr {"name": "John", "age": 30} name = ? OR age = ? List<UserQuery> usersOr [{"name": "test", "ageGe": 30, "ageLt": 40}, {"nameLike": "admin", "age": 40}] (name = ? AND age >= ? AND age < ?) OR (name LIKE ? AND age = ?) 例如,查询条件id = ? OR name = ? AND age > ?,我们可以在UserQuery类中添加字段userAnd和userOr,用于映射逻辑运算符连接的查询条件。 publicclassUserQuery{ Integerid; Stringname; StringnameLike; IntegerageGt; UserQueryuserAnd; UserQueryuserOr; } 再通过以下代码构建出UserQuery的实例,由字段userOr生成对应的查询条件: UserQueryuserAnd=UserQuery.builder().name("John").ageGt(30).build(); UserQueryuserOr=UserQuery.builder().id(5).userAnd(userAnd).build(); UserQueryuserQuery=UserQuery.builder().userOr(userOr).build(); List<Object>argList=newArrayList<>(); Stringwhere=buildWhere(query,argList); //SQL:WHEREid=?ORname=?ANDage>? 在这个示例当中,同时存在逻辑运算符AND和OR,其中,AND的优先级高于OR。 由于逻辑运算符的运算优先级不同,我们认为SQL中的组合条件不是平面的,而是有层级的。 通过AND连接的查询条件位于一个层级, 通过OR连接的查询条件位于另一个层级。 不同层级的查询条件由相同的逻辑运算符组合而成。 基于以上发现,我们可以利用对象的层级关系来表达查询子句的层级关系。 下图展示了UserQuery的实例中的赋值字段与查询条件的层级对应关系: 2.3. 子查询字段 对于一般的子查询条件,例如age > (SELECT avg(age) FROM t_user [WHERE]),我们可以将其分为三个部分分别进行映射: 条件部分age >,我们可以复用谓词后缀字段的格式进行映射。但是为了避免和原有的谓词后缀字段ageGt产生命名冲突,我们需要在谓词后缀后再加一些字符进行区分,例如ageGtAvg。在映射时,忽略谓词后缀后的额外字符; 子查询的主句部分SELECT avg(age) FROM t_user:将列名和表名作为不变的静态变量,通过注解声明,例如@Subquery(select = "avg(age)", from = "t_user"); 子查询的WHERE子句部分:通过复用查询对象映射方法进行构建。子查询字段的类型需要为查询对象。 通过这种方法,我们可以在UserQuery中添加如下ageGtAvg字段,用于构建上述查询条件: publicclassUserQuery{ //age>(SELECTavg(age)FROMt_user[WHERE]) @Subquery(select="avg(age)",from="t_user") UserQueryageGtAvg; } 这样,我们仅使用一个字段便可以构建包含子查询的查询条件,且能为子查询构建动态查询语句。 2.4. 实体关系查询字段 为符合第三范式,对于具有多对多关系的两个实体,我们通常引入一个中间表,将多对多关系拆分为两个一对多关系。而这类中间表的表名和字段都具有特定的格式:表名包含两个实体的名称;两个外键也以entity_id的格式命名。这使得我们可以通过两个实体的名称就能推导出查询条件。 以RBAC模型为例,具有用户、角色和权限三个实体。其中,用户和角色具有多对多关系。其中间表的表名就可以由user和role推出,例如a_user_and_role,中间表的两个外键名称可以是user_id和role_id。那么,通过角色查询用户的查询条件为: SELECT*FORMt_user WHEREidIN(SELECTuser_idFROMa_user_and_roleWHERErole_idIN( SELECTidFROMt_role[WHERE])) 由于我们可以由实体名称user和role推出各自对应的表名,以及对应的中间表的表名和两个外键名称,进而推出上述的查询条件,我们通过表达式<user,role>来表示上述查询条件。而对于role表后的WHERE子句,我们可以通过对实体role对应的查询对象复用查询对象映射方法得到。 由于角色和权限也具有多对多关系,这使得用户和权限也符合多对多关系的特征,我们使用表达式<user,role,perm>来表示用户和权限通过角色形成的这种多对多关系,对应的推出根据权限查询所分配给的用户的查询语句为: SELECT*FORMt_user WHEREidIN(SELECTuser_idFROMa_user_and_roleWHERErole_idIN( SELECTrole_idFROMa_role_and_permWHEREperm_idIN( SELECTidFROMt_perm[WHERE]))) 由于表达式<user,role,perm>在表示user和perm的关系时,形成了一条从user到perm的路径,并且路径的节点为具有多对多关系的实体的名称,所以我称之为抽象实体路径。 抽象实体路径可以包含任意多个节点来表示两个实体间的关系。例如,当系统中的权限和菜单也具有多对多关系时,可以使用表达式<user,role,perm,menu>表示用户和菜单中间的多对多关系。以此类推。 根据以上分析,我们将通过角色和权限查询用户的字段分别定义如下: publicclassUserQuery{ //... @DomainPath({"user","role"}) RoleQueryrole; @DomainPath({"user","role","perm"}) PermQueryperm; } 根据角色名称查询所授予的用户,使用角色名称构建RoleQuery对象,再将其赋给UserQuery实例的role字段即可: RoleQueryroleQuery=RoleQuery.builder().roleName("vip").build(); UserQueryuserQuery=UserQuery.builder().role(roleQuery).build(); Stringwhere=buildWhere(userQuery,argList); 对应的查询子句如下: WHEREidIN(SELECTuser_idFROMa_user_and_roleWHERErole_idIN( SELECTidFROMt_roleWHERErole_name=?)) 不仅如此,当抽象实体路径仅包含一个节点时,还能用于表示一对多/多对一关系,仅仅需要再指定一个外键的名称。 例如在菜单实体中,通过外键parent_id连接父菜单的id,其查询字段看定义如下: publicclassMenuQueryextendsPageQuery{ //many-to-one:querysubmenusbyparent'sconditions //parent_idIN(SELECTidFROMt_menu[WHERE]) @DomainPath(value="menu",localField="parentId") privateMenuQueryparent; //one-to-many:queryparentmenusbychildren'sconditions //idIN(SELECTparent_idFROMt_menu[WHERE]) @DomainPath(value="menu",foreignField="parentId") privateMenuQuerychildren; } 我们可以把父子菜单的关系表示为<menu:menu|parentId,id>和<menu:menu|id,parentId>。 实体关系查询字段为我们提供了一种开箱即用的针对实体关系的查询模式。 3. 应用范围 由于查询对象的定义仅依赖于面向对象语言的基本特性,这使得这种方法能够适用于不同的面向对象编程语言。不同类型的数据库在查询条件的语法上具有一定的共性,因此,基于查询对象的映射方案不仅能够生成SQL语句,还能够为MongoDB等NoSQL数据库构建查询语句。 下图展示了如何通过统一的查询对象模型,构建适用于不同数据库的查询条件。该方法的通用性使得我们能够在多个数据库系统之间共享相同的查询构建逻辑,从而提高了代码的复用性和系统的灵活性。 查询对象对比图 4. 总结 本文详细介绍了如何基于查询对象实例自动生成动态查询条件,提出一种以字段特征映射查询条件的改进方法。该方法将查询条件抽象为四种字段类型以实现查询条件的自动构造。该方法减少了手动SQL编写的需求,大幅提高了代码的通用性和扩展性,为复杂查询提供了一种清晰高效的实现方案。 附录A:谓词后缀表 后缀名称 字段名称 字段赋值 SQL查询条件 MongoDB查询条件 - id 5 id = 5 {"id":5} Eq idEq 5 id = 5 {"idEq":5} Ne idNe 5 id != 5 {"idNe":{"$ne":5}} Gt idGt 5 id > 5 {"idGt":{"$gt":5}} Ge idGe 5 id >= 5 {"idGe":{"$gte":5}} Lt idLt 5 id < 5 {"idLt":{"$lt":5}} Le idLe 5 id <= 5 {"idLe":{"$lte":5}} In idIn [1,2,3] id IN (1,2,3) {"id":{"$in":[1, 2, 3]}} NotIn idNotIn [1,2,3] id NOT IN (1,2,3) {"id":{"$nin":[1, 2, 3]}} Null memoNull false memo IS NOT NULL {"memo":{"$not":{"$type", 10}}} Null memoNull true memo IS NULL {"memo":{"$type", 10}} NotLike nameNotLike "arg" name NOT LIKE '%arg%' {"name":{"$not":{"$regex":"arg"}}} Like nameLike "arg" name LIKE '%arg%' {"name":{"$regex":"arg"}} NotStart nameNotStart "arg" name NOT LIKE 'arg%' {"name":{"$not":{"$regex":"^arg"}}} Start nameStart "arg" name LIKE 'arg%' {"name":{"$regex":"^arg"}} NotEnd nameNotEnd "arg" name NOT LIKE '%arg' {"name":{"$not":{""}}} End nameEnd "arg" name LIKE '%arg' {"name":{""}} NotContain nameNotContain "arg" name NOT LIKE '%arg%’ {"name":{"$not":{"$regex":"arg"}}} Contain nameContain "arg" name LIKE '%arg%’ {"name":{"$regex":"arg"}} Rx nameRx "arg\d" name REGEXP 'arg\d’ {"name":{"$regex":"arg\d"}} 附录B:GitHub Java version: http://github.com/doytowin/doyto-query Golang version: http://github.com/doytowin/goooqo 询问AI

优秀的个人博客,低调大师

融合 JPA 和超强查询的 sqltoy-orm 5.6.7 发版

开源地址: github:https://github.com/sagframe/sagacity-sqltoy gitee:https://gitee.com/sagacity/sagacity-sqltoy idea 插件 (可直接在 idea 中检索安装):https://github.com/imyuyu/sqltoy-idea-plugin sqltoy 脚手架项目:https://gitee.com/momoljw/sss-rbac-admin sqltoy lambda 项目:https://gitee.com/gzghde/sqltoy-plus 更新内容 1、修复ToChar函数:场景to_char(t.total_amt)单参数场景2、打springboot-starter包时增加yml配置提示json到META-INFO下3、BeanUtil、CollectionUtil部分代码编写优化4、修复oracle timestamp转localDateTime精度问题 JPA 部分 类似 JPA 的对象化 CRUD、对象级联加载和新增、更新 支持通过 POJO 生成 DDL 以及直接向数据库创建表 强化 update 操作,提供弹性字段修改能力,不同于 hibernate 先 load 后修改,而是一次数据库交互完成修改,确保了高并发场景下数据的准确性 改进了级联修改,提供了先删除或者先置无效,再覆盖的操作选项 增加了 updateFetch、updateSaveFetch 功能,强化针对强事务高并发场景的处理,类似库存台账、资金台账,实现一次数据库交互,完成锁查询、不存在则插入、存在则修改,并返回修改后的结果 增加了树结构封装,便于统一不同数据库树型结构数据的递归查询 支持分库分表、支持多种主键策略 (额外支持基于 redis 的产生特定规则的业务主键)、加密存储、数据版本校验 提供了公共属性赋值 (创建人、修改人、创建时间、修改时间、租户)、扩展类型处理等 提供了多租户统一过滤和赋值、提供了数据权限参数带入和越权校验 查询部分 极为直观的 sql 编写方式,便于从客户端 <--> 代码 双向快速迁移,便于后期变更维护 支持缓存翻译、反向缓存匹配 key 代替 like 模糊查询 提供了跨数据库支持能力:不同数据库的函数自动转换适配,多方言 sql 根据实际环境自动匹配、多数据库同步测试,大幅提升了产品化能力 提供了取 top 记录、随机记录等特殊场景的查询功能 提供了最强大的分页查询机制:1) 自动优化 count 语句;2) 提供基于缓存的分页优化,避免每次都执行 count 查询;3) 提供了独具特色的快速分页;4) 提供了并行分页 提供了分库分表能力 提供了在管理类项目中极为价值的:分组汇总计算、行列转换 (行转列、列转行)、同比环比、树形排序、树形汇总 相关算法自然集成 提供了基于查询的层次化数据结构封装 提供了大量辅助功能:数据脱敏、格式化、条件参数预处理等 支持多种数据库 常规的 mysql、oracle、db2、postgresql、 sqlserver、dm、kingbase、sqlite、h2、 oceanBase、polardb、guassdb、tidb 支持分布式 olap 数据库: clickhouse、StarRocks、greenplum、impala (kudu) 支持 elasticsearch、mongodb 所有基于 sql 和 jdbc 各类数据库查询 sqltoy 特点介绍: sqltoy 的核心构建思想 sqltoy 的对比 mybatis (plus) 的核心点:查询语句编写、可阅读性、可维护性 对象化 crud 是基础,但 sqltoy 有针对性的改进:update、updateSaveFetch、updateFetch 等 sqltoy 的缓存翻译,大幅减少表关联简化 sql,让你的查询性能成几何级提升 极致的分页,同样帮助你实现查询的性能大幅提升 快速分页:@fast () 实现先取单页数据然后再关联查询,极大提升速度 分页优化器:page-optimize 让分页查询由两次变成 1.3~1.5 次 (用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询 sqltoy 的分页取总记录的过程不是简单的 select count (1) from (原始 sql);而是智能判断是否变成:select count (1) from 'from 后语句 ', 并自动剔除最外层的 order by sqltoy 支持并行查询:parallel="true",同时查询总记录数和单页数据,大幅提升性能 便利的跨数据库统计计算:数据旋转 便利的跨数据库统计计算:无限极分组统计 (含汇总求平均) 便利的跨数据库统计计算:同比环比 5、树形表排序汇总 6、扩展集成

优秀的个人博客,低调大师

mybatis-mp - 亮点八:mybatis-xml returnType 的 ORM 映射

mybatis-mp - 亮点八: 可对 xml 实体类返回 进行自动映射: 当你需要写一个很复杂的sql时,你可能会选择用xml 去做例如: <select id="findUserList" returnType="User"> select id,user_name as userName,nick_name as nickName,password from user where xx and xx2 and xx3 ........ </select> 如上:你可能需要自己 一个一个 as userName , as nickName 之类的,是不是很麻烦 现在好,只要接入 mybatis-mp;这些完全不用写了,如下: <select id="findUserList" returnType="User"> select id,user_name,nick_name,password from user where xx and xx2 and xx3 ........ </select> 自动帮你进行了映射,而且不仅仅支持实体,还支持VO;省去了很多麻烦步骤!

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册