【硬核】开源的高性能轻量级ORM框架

2024-08-28 23:20

本文主要是介绍【硬核】开源的高性能轻量级ORM框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

easy-orm是一款简洁、轻量高效的数据库对象关系映射框架,它的代码编写规范基于SQL语义,学习成本低,可以快速掌握。

下图是与业界mybatis-plus框架相比。

功能mybatis-pluseasy-orm
单表CRUD
多表CRUD×
子查询x
多数据源×
预编译

easy-orm不需要做任何前置工作,不依赖于任何jar包,开箱即用,以下给出easy-orm的基本使用方式。

注册数据源

用户可以任意选择接入的连接池,以HikariCP为例,用户可以在任意地方获取到数据源。

    HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://localhost:3306/test");config.setUsername("root");config.setPassword("xxxxxx");// easy-orm支持注册多数据源,此处注册了名为mysql的数据源,并且设置为默认数据源SqlConnectFactory.register("mysql", new HikariDataSource(config), true);

1. 查询

在实体类上添加@Table注解指定表名与数据库表相关联。

查询出所有姓张的学生,并且是18到30岁以内

List<StudentModel> studentModels = SqlExecutor.builder().selectChain()//.select() 等于 select *.select(StudentModel::getId, StudentModel::getName, StudentModel::getAge).from(StudentModel.class).where(SubUtil.like(StudentModel::getName, "张%").and().between(StudentModel::getAge, 18, 30)).list(StudentModel.class);System.out.println(studentModels);// 控制台输出
22:18:05.754 [Test worker] DEBUG com.coderevolt.sql.core.dql.DQLSqlGenerator - ==> execute sql: SELECT studentModel.id,studentModel.name,studentModel.age FROM student studentModel WHERE studentModel.name LIKE (?) AND studentModel.age BETWEEN ? AND ?
22:18:05.754 [Test worker] DEBUG com.coderevolt.sql.core.dql.DQLSqlGenerator - ==> param1=%, param2=18, param3=30
22:18:07.336 [Test worker] DEBUG com.coderevolt.sql.core.dql.DQLSqlGenerator - <==  total:2
[StudentModel{id='6', name='张三', age='26'}, StudentModel{id='7', name='张玉立', age='19'}]

2.更新

更新张三的年龄为18

boolean result = SqlExecutor.builder().updateChain().update(StudentModel.class).set(SubUtil.set(StudentModel::getAge, 18)).where(SubUtil.eq(StudentModel::getName, "张三")).exec();System.out.println("更新结果:" + result);// 控制台输出
22:26:43.453 [Test worker] DEBUG com.coderevolt.sql.core.dml.DMLSqlGenerator - ==> execute sql: UPDATE student studentModel SET studentModel.age = ? WHERE studentModel.name = (?)
22:26:43.454 [Test worker] DEBUG com.coderevolt.sql.core.dml.DMLSqlGenerator - ==> param1=18, param2=张三
更新结果:true

3.删除

删除所有年纪小于10岁的学生

 boolean result = SqlExecutor.builder().deleteChain().deleteFrom(StudentModel.class).where(SubUtil.lt(StudentModel::getAge, 10)).exec();System.out.println("执行结果: " + result);// 控制台输出
22:30:42.835 [Test worker] DEBUG com.coderevolt.sql.core.dml.DMLSqlGenerator - ==> execute sql: DELETE FROM student studentModel WHERE studentModel.age < (?)
22:30:42.836 [Test worker] DEBUG com.coderevolt.sql.core.dml.DMLSqlGenerator - ==> param1=10
执行结果: true

4.新增

新增一条学生数据


boolean result = SqlExecutor.builder().insertChain()
//                .insertInto(StudentModel.class) 等于 insert into student.insertInto(StudentModel.class, StudentModel::getName, StudentModel::getAge).values(new StudentModel("老王", 20)).exec();System.out.println("执行结果: " + result);22:43:15.585 [Test worker] DEBUG com.coderevolt.sql.core.dml.DMLSqlGenerator - ==> execute sql: INSERT INTO student(name,age) VALUES (?,?)
22:43:15.586 [Test worker] DEBUG com.coderevolt.sql.core.dml.DMLSqlGenerator - ==> param1=老王, param2=20
执行结果: true

5. 多表查询

查询学生参与的课程

List<Map<String, Object>> listMap = SqlExecutor.builder().selectChain().select(StudentModel::getName, StudentModel::getAge).select(SubjectModel::getName, "subjectName").from(StudentModel.class).innerJoin(StudentSubjectRelation.class, SubUtil.eq(StudentModel::getId, StudentSubjectRelation::getStudentId)).innerJoin(SubjectModel.class, SubUtil.eq(StudentSubjectRelation::getSubjectId, SubjectModel::getId)).listMap();System.out.println(listMap);// 控制台输出
22:52:14.212 [Test worker] DEBUG com.coderevolt.sql.core.dql.DQLSqlGenerator - ==> execute sql: SELECT studentModel.name,studentModel.age,subjectModel.name AS subjectName FROM student studentModel INNER JOIN student_subject_relation studentSubjectRelation ON studentModel.id = studentSubjectRelation.student_id INNER JOIN subject subjectModel ON studentSubjectRelation.subject_id = subjectModel.id
22:52:14.231 [Test worker] DEBUG com.coderevolt.sql.core.dql.DQLSqlGenerator - <==  total:3
[{name=张三, age=18, subjectName=语文}, {name=张三, age=18, subjectName=数学}, {name=张玉立, age=19, subjectName=数学}]

6.子查询

查询参与课程的学生

SelectSqlGenerator sqlGenerator = SqlExecutor.builder(SqlOption.builder().build()).selectChain().select(StudentModel::getName).from(StudentModel.class).where(SubUtil.in(StudentModel::getId, ctx -> {return SubUtil.subSelect().select(StudentSubjectRelation::getStudentId).from(StudentSubjectRelation.class).innerJoin(SubjectModel.class, SubUtil.eq(StudentSubjectRelation::getSubjectId, SubjectModel::getId));}));
System.out.println(sqlGenerator.listMap());// 控制台输出
22:59:06.024 [Test worker] DEBUG com.coderevolt.sql.core.dql.DQLSqlGenerator - ==> execute sql: SELECT studentModel.name FROM student studentModel WHERE studentModel.id IN (SELECT studentSubjectRelation.student_id FROM student_subject_relation studentSubjectRelation INNER JOIN subject subjectModel ON studentSubjectRelation.subject_id = subjectModel.id)
22:59:06.042 [Test worker] DEBUG com.coderevolt.sql.core.dql.DQLSqlGenerator - <==  total:2
[{name=张三}, {name=张玉立}]

其他

easy-orm同样支持批量新增和批量更新,其中批量更新可以通过@Column注解指定ID属性和更新策略,例如StudentModel对象

@Table("student")
public class StudentModel {/*** @see com.coderevolt.sql.core.dml.UpdateSqlGenerator#updateById*/@Column(type = Column.ColumnType.ID)private Long id;/*** @Column注解缺省默认行为:Column.DmlStrategy.IGNORE_NULL*/private String name;@Column(dmlStrategy = Column.DmlStrategy.IGNORE_NULL)private Integer age;/*** Column.DmlStrategy.IGNORE_NULL 忽略null值,当avatar为null时忽略更新数据库,默认行为*/@Column(dmlStrategy = Column.DmlStrategy.IGNORE_NULL)private String hobby;/*** Column.DmlStrategy.SET_NULL 不忽略null值,当avatar为null时更新数据库*/@Column(dmlStrategy = Column.DmlStrategy.SET_NULL)private String avatar;
}

项目中封装了SubUtil工具类,提供了sql便捷操作方法,用户完全可以再进行扩展。AtomicUtil类提供了事务执行的方法。

项目的整体设计架构很简洁清晰,每个sql操作都是通过SqlExecutor类创建对应的sql执行链路,在builder方法中可以设置SqlOption 类来配置本次执行,或者使用默认的配置。在这个链路中会创建一个上下文容器SqlChainContext类存放所有的信息。
子查询同样可以看作是没有执行动作(例如exec()、listMap())的执行链,执行链的上下文信息会在嵌套子查询之间传递。
在这里插入图片描述

每一个子操作都被抽象成AbstractSub类的子类,并实现apply抽象方法。
子操作可以分为三大类:compare(where、havaing、on)、order(order by)、set(update set)
在这里插入图片描述

其中apply抽象方法会接收到上层执行链的上下文信息,并返回子操作的sql语句,以SubOrder为例。

@Override
public String apply(SqlChainContext ctx) {this.sqlBuf.append(SFuncUtil.getColumn(column));if (sqlSort != null) {this.sqlBuf.append(" ").append(sqlSort.name());}return toSql();
}

jmeter性能测试参考
在这里插入图片描述

最后

在开发完这个orm后我在想,能不能无感知的join和嵌套不同的数据源,屏蔽数据源的差异,就像是操作单数据源那样简单。

github地址: https://github.com/songbiaoself/easy-orm

gitee地址: https://gitee.com/song_biao/easy-orm

联系方式: 646997146@qq.com

公众号: codeRevolt

在这里插入图片描述

这篇关于【硬核】开源的高性能轻量级ORM框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116179

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1