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配置 |
|---|---|---|---|
| MySQL | sql-mysql | mysql | mysql |
| Oracle | sql-oracle | oracle | oracle |
| PostgreSQL | sql-pgsql | pgsql | pgsql |
| SQL Server | sql-mssql | mssql | mssql |
| H2 | sql-h2 | h2 | h2 |
| SQLite | sql-sqlite | sqlite | sqlite |
| ClickHouse | sql-clickhouse | clickhouse | clickhouse |
| 达梦Dameng | sql-dameng | dameng | dameng |
| 人大金仓KingbaseES | sql-kingbase-es | kingbase_es | kingbase_es |
| 高斯数据库 | sql-gauss-db | gauss-db | gauss-db |
| DuckDB | sql-duckdb | duckdb | duckdb |
| DB2 | sql-db2 | db2 | db2 |
🌟 社区与支持
加入交流群
欢迎加入Easy-Query交流群,获取最新资讯和技术支持:
Easy-Query交流群
学习资源
- 官方文档:可通过项目源码中的文档模块获取详细使用指南
- 示例代码:sql-test/src/main/java/com/easy/query/test/ 目录下包含丰富的示例
贡献代码
Easy-Query是开源项目,欢迎通过以下方式参与贡献:
- Fork仓库
- 创建特性分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add some amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 创建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),仅供参考