当前位置: 首页 > news >正文

Easy-Query:Java/Kotlin高性能轻量级ORM框架完全指南

Easy-Query:Java/Kotlin高性能轻量级ORM框架完全指南

【免费下载链接】easy-queryjava/kotlin high performance lightweight solution for jdbc query,support oltp and olap query,一款java下面支持强类型、轻量级、高性能的ORM,致力于解决jdbc查询,拥有对象模型筛选、隐式子查询、隐式join项目地址: https://gitcode.com/gh_mirrors/ea/easy-query

Easy-Query是一款面向Java/Kotlin开发者的高性能轻量级ORM框架,专注于解决JDBC查询问题,提供强类型支持、对象模型筛选、隐式子查询和隐式Join等核心功能,同时兼顾OLTP和OLAP场景需求。本文将全面介绍这款框架的核心优势、快速上手方法以及高级特性,帮助开发者轻松掌握这一高效数据访问工具。

🚀 为什么选择Easy-Query?

在众多ORM框架中,Easy-Query凭借其独特的设计理念和技术优势脱颖而出:

  • 极致轻量:无依赖设计,核心包体积不足500KB,轻松集成到任何Java/Kotlin项目
  • 性能卓越:通过代理模式和SQL优化技术,性能接近原生JDBC
  • 强类型支持:全程编译时类型检查,杜绝运行时SQL错误
  • 隐式查询能力:自动处理关联查询、子查询和分组操作,大幅减少代码量
  • 多数据库支持:兼容MySQL、Oracle、PostgreSQL等主流数据库,提供统一查询体验

核心功能架构

Easy-Query的功能架构主要分为以下几个核心模块:

  • sql-core:框架核心,提供基础查询能力和表达式解析
  • sql-db-support:数据库方言支持,适配不同数据库特性
  • sql-extension:扩展模块,包含缓存、搜索等增强功能
  • sql-platform:平台集成,支持Spring Boot、Solon等主流框架

🔧 快速上手指南

环境准备

Easy-Query支持JDK 8及以上版本,兼容Spring Boot 2.x/3.x和Solon 2.x等主流开发框架。推荐使用Maven或Gradle进行依赖管理。

安装依赖

Maven依赖配置

<properties> <easy-query.version>last-version</easy-query.version> </properties> <dependency> <groupId>com.easy-query</groupId> <artifactId>sql-springboot-starter</artifactId> <version>${easy-query.version}</version> </dependency>

控制台模式依赖(非Spring环境):

<dependency> <groupId>com.easy-query</groupId> <artifactId>sql-api-proxy</artifactId> <version>${easy-query.version}</version> </dependency> <dependency> <groupId>com.easy-query</groupId> <artifactId>sql-mysql</artifactId> <version>${easy-query.version}</version> </dependency>

初始化配置

Spring Boot环境

只需添加依赖即可自动配置,无需额外代码。

控制台模式初始化

// 初始化数据源 HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/easy-query-test?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false"); dataSource.setUsername("root"); dataSource.setPassword("root"); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); // 构建EasyQuery客户端 EasyQueryClient easyQueryClient = EasyQueryBootstrapper.defaultBuilderConfiguration() .setDataSource(dataSource) .useDatabaseConfigure(new MySQLDatabaseConfiguration()) .build(); // 获取实体查询接口 EasyEntityQuery easyEntityQuery = new DefaultEasyEntityQuery(easyQueryClient);

💡 核心功能详解

实体定义

使用注解定义实体类,支持逻辑删除、主键策略等特性:

@Data @Table("t_blog") @EntityProxy // 启用代理功能 public class BlogEntity extends BaseEntity implements ProxyEntityAvailable<BlogEntity, BlogEntityProxy> { private String title; private String content; private String url; private Integer star; private LocalDateTime publishTime; private BigDecimal score; private Integer status; private BigDecimal order; private Boolean isTop; private Boolean top; }

单表查询

简洁的API设计,支持链式调用:

Topic topic = easyEntityQuery .queryable(Topic.class) .where(o -> o.id().eq("3")) .firstOrNull();

生成的SQL:

SELECT t.`id`,t.`stars`,t.`title`,t.`create_time` FROM `t_topic` t WHERE t.`id` = ? LIMIT 1

五大约束隐式特性

Easy-Query的五大隐式特性是其核心竞争力,能够大幅简化复杂查询的编写:

1. 隐式Join

自动处理一对一和多对一关系的关联查询:

List<SysUser> userInXXCompany = entityQuery.queryable(SysUser.class) .where(user -> { user.company().name().like("xx Company"); }) .orderBy(user -> { user.company().registerMoney().desc(); user.birthday().asc(); }).toList();
2. 隐式子查询

自动处理一对多和多对多关系的子查询:

List<Company> companies = entityQuery.queryable(Company.class) .where(company -> { company.users().any(u -> u.name().like("Xiao Ming")); company.users().where(u -> u.name().like("Xiao Ming")) .max(u -> u.birthday()).gt(LocalDateTime.of(2000,1,1,0,0,0)); }).toList();
3. 隐式分组

将多个子查询优化合并为分组查询:

List<Company> companies = entityQuery.queryable(Company.class) .subQueryToGroupJoin(company -> company.users()) .where(company -> { company.users().any(u -> u.name().like("Xiao Ming")); company.users().where(u -> u.name().like("Xiao Ming")) .max(u -> u.birthday()).gt(LocalDateTime.now()); }).toList();
4. 隐式分区分组

支持一对多和多对多关系的首条/N条记录操作:

List<Company> companies = entityQuery.queryable(Company.class) .where(company -> { company.users().orderBy(u->u.birthday().desc()).first().name().eq("Xiao Ming"); company.users().orderBy(u->u.birthday().desc()).element(0) .birthday().lt(LocalDateTime.now()); }).toList();
5. 隐式CASE WHEN表达式

通过property.aggregate.filter()语法实现复杂条件聚合:

List<Draft3<Long, Long, BigDecimal>> result = entityQuery.queryable(SysUser.class) .where(user -> { user.birthday().lt(LocalDateTime.now()); }) .select(user -> Select.DRAFT.of( user.id().count().filter(() -> { user.address().eq("Hangzhou"); }), user.id().count().filter(() -> { user.address().eq("Beijing"); }), user.age().avg().filter(() -> { user.address().eq("Beijing"); }) )).toList();

完整单表查询示例

包含过滤、聚合、投影和排序的综合示例:

List<Draft3<String, Integer, LocalDateTime>> myBlog = easyEntityQuery.queryable(BlogEntity.class) .where(b -> { b.content().like("my blog"); }) .groupBy(b -> GroupKeys.of(b.title())) .having(group -> { group.groupTable().star().sum().lt(10); }) .select(group -> Select.DRAFT.of( group.key1(), group.groupTable().star().sum().asAnyType(Integer.class), group.groupTable().createTime().max() )) .orderBy(group -> group.value3().desc()) .limit(2, 2) .toList();

生成的SQL:

SELECT t1.`value1` AS `value1`, t1.`value2` AS `value2`, t1.`value3` AS `value3` FROM (SELECT t.`title` AS `value1`, SUM(t.`star`) AS `value2`, MAX(t.`create_time`) AS `value3` FROM `t_blog` t WHERE t.`deleted` = false AND t.`content` LIKE '%my blog%' GROUP BY t.`title` HAVING SUM(t.`star`) < 10) t1 ORDER BY t1.`value3` DESC LIMIT 2,2

📊 分库分表支持

Easy-Query提供强大的分库分表能力,支持表分片、数据库分片以及混合分片策略。

表分片示例

@Data @Table(value = "t_topic_sharding_time", shardingInitializer = TopicShardingTimeShardingInitializer.class) public class TopicShardingTime { @Column(primaryKey = true) private String id; private Integer stars; private String title; @ShardingTableKey // 分片键 private LocalDateTime createTime; } // 分片初始化器 public class TopicShardingTimeShardingInitializer extends AbstractShardingMonthInitializer<TopicShardingTime> { @Override protected LocalDateTime getBeginTime() { return LocalDateTime.of(2020, 1, 1, 1, 1); } @Override protected LocalDateTime getEndTime() { return LocalDateTime.of(2023, 5, 1, 0, 0); } }

数据库分片示例

@Data @Table(value = "t_topic_sharding_ds", shardingInitializer = DataSourceShardingInitializer.class) public class TopicShardingDataSource { @Column(primaryKey = true) private String id; private Integer stars; private String title; @ShardingDataSourceKey // 数据源分片键 private LocalDateTime createTime; }

🛠️ 数据操作全指南

插入数据

Topic topic = new Topic(); topic.setId(String.valueOf(0)); topic.setStars(100); topic.setTitle("标题0"); topic.setCreateTime(LocalDateTime.now()); long rows = easyEntityQuery.insertable(topic).executeRows();

更新数据

实体更新

Topic topic = easyEntityQuery.queryable(Topic.class) .where(o -> o.id().eq("7")).firstNotNull("未找到对应的数据"); topic.setTitle("新标题"); long rows = easyEntityQuery.updatable(topic).executeRows();

表达式更新

long rows = easyEntityQuery.updatable(Topic.class) .setColumns(o -> { o.stars().set(12); }) .where(o -> o.id().eq("2")) .executeRows();

删除数据

// 按条件删除 long rows = easyQuery.deletable(Topic.class) .where(o -> o.title().eq("title998")) .executeRows(); // 按实体删除 Topic topic = easyQuery.queryable(Topic.class).whereId("997").firstNotNull("未找到数据"); long rows = easyQuery.deletable(topic).executeRows();

📚 数据库支持矩阵

Easy-Query支持多种主流数据库,提供统一的查询体验:

数据库名称包名Spring Boot配置Solon配置
MySQLsql-mysqlmysqlmysql
Oraclesql-oracleoracleoracle
PostgreSQLsql-pgsqlpgsqlpgsql
SQL Serversql-mssqlmssqlmssql
H2sql-h2h2h2
SQLitesql-sqlitesqlitesqlite
ClickHousesql-clickhouseclickhouseclickhouse
达梦Damengsql-damengdamengdameng
人大金仓KingbaseESsql-kingbase-eskingbase_eskingbase_es
高斯数据库sql-gauss-dbgauss-dbgauss-db
DuckDBsql-duckdbduckdbduckdb
DB2sql-db2db2db2

🌟 社区与支持

加入交流群

欢迎加入Easy-Query交流群,获取最新资讯和技术支持:

Easy-Query交流群

学习资源

  • 官方文档:可通过项目源码中的文档模块获取详细使用指南
  • 示例代码:sql-test/src/main/java/com/easy/query/test/ 目录下包含丰富的示例

贡献代码

Easy-Query是开源项目,欢迎通过以下方式参与贡献:

  1. Fork仓库
  2. 创建特性分支 (git checkout -b feature/amazing-feature)
  3. 提交更改 (git commit -m 'Add some amazing feature')
  4. 推送到分支 (git push origin feature/amazing-feature)
  5. 创建Pull Request

📝 总结

Easy-Query作为一款高性能轻量级ORM框架,通过创新的隐式查询技术和简洁的API设计,极大地简化了Java/Kotlin应用中的数据访问层开发。无论是简单的单表操作还是复杂的分库分表场景,Easy-Query都能提供高效、优雅的解决方案。

如果你正在寻找一款既能提高开发效率又不牺牲性能的ORM框架,不妨尝试Easy-Query,相信它会成为你项目中的得力助手!

要开始使用Easy-Query,请克隆仓库:git clone https://gitcode.com/gh_mirrors/ea/easy-query

【免费下载链接】easy-queryjava/kotlin high performance lightweight solution for jdbc query,support oltp and olap query,一款java下面支持强类型、轻量级、高性能的ORM,致力于解决jdbc查询,拥有对象模型筛选、隐式子查询、隐式join项目地址: https://gitcode.com/gh_mirrors/ea/easy-query

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/1201857/

相关文章:

  • CANN/asc-devkit TensorTrait类型检查API
  • Aave Protocol V2开发者指南:从合约接口到集成实战
  • 消防远程联网监控平台系统之UI界面设计-设备信息查询界面
  • 多模型路由架构设计:根据任务复杂度分派不同模型
  • 南京良庆美度手表回收 2026,今日最新行情快速变现渠道 - 禹竞奢收行
  • datascience与Jupyter Notebook集成:提升教学效率的5个技巧
  • MPL_ROS与ROS 2迁移指南:从ROS Kinetic到ROS 2 Foxy的完整迁移方案
  • 擅长互联网行业的猎头公司哪家好?哪家猎头公司擅长互联网行业的中高端人才招聘? - 榜单推荐
  • 2026年7月徐州装修装饰市场优选服务商深度解析 - 品牌鉴赏官2026
  • 欧米茄官方售后服务中心全部网点地址及24小时热线实地考察报告+多信源验证(2026年7月更新) - 欧米茄官方服务中心
  • Rufus终极指南:免费开源工具如何彻底改变USB启动盘制作体验
  • 盘点崂山城阳回收门店,同城上门当场结算闲置包 - 生活时报
  • OptiScaler技术问题排查实战指南:完整解决方案与深度优化
  • 2026年南京靠谱全屋装修公司盘点:优质选择与专业解析 - 品牌鉴赏官2026
  • 2026华东流体控胶设备选购解析苏州本地点胶制造企业与高粘度压盘供料设备合作方筛选要点 - 栗子测评
  • 计算机毕业设计之校园论坛的设计和实现
  • QMCDecode:解锁QQ音乐加密格式的macOS实用工具深度解析
  • 流式 AI 响应的前端体验设计:并行加载与渐进渲染
  • 查询速度提升 98.9%,索引吞吐量提升 4 倍:系统化诊断 Elasticsearch 性能
  • 武汉钻戒回收实测,出手钻石再也不怕被坑 - 融媒生活
  • Forecastle开发者指南:如何贡献代码和扩展功能
  • NURBS-Python开源社区指南:贡献代码与解决问题的最佳实践
  • 六面包钢 VS 传统地板:四大核心优势,定义机房地面新标准 - 品牌发掘
  • Madmin实战案例:如何用Madmin构建电商后台管理系统
  • 深入解析JD-GUI:Java字节码反编译工具的架构奥秘与实战应用
  • 盐城本地黄金换新服务实测对比:四家门店规则与体验解析 - 招财兔数字员工
  • 如何快速上手Easy-Query:5分钟完成第一个数据库查询
  • 如何在React应用中快速集成React Komposer:5个实用示例
  • 企业级Figma-Context-MCP离线部署架构设计:3种高性能方案深度解析
  • 二七本地直营回收门店,闲置名表金条免费上门估价,行情透明公开 - 全城热点