Jdao v2.0.1 发布:革新持久层编程,提升开发效率


简介:Jdao是一种创新的持久层解决方案。主要目的在于 减少编程量,提高生产力,提高性能,支持多数据源整合操作,支持数据读写分离,制定持久层编程规范。 灵活运用Jdao,可以在持久层设计上,减少30%甚至50%以上的编程量,同时形成持久层的统一编程规范,减少持久层错误,同时易于维护和扩展。

核心价值:

  • 显著提升生产力: 减少30%-50%的编程工作量。
  • 统一编程规范: 降低出错率,简化维护流程。
  • 高性能: 支持高效序列化,速度提升近10倍,数据体积减小至20%。
  • 多数据源整合: 支持数据读写分离及灵活的数据源管理。
  • 高效安全的缓存机制: 查询效率提高400倍以上。
  • 易于理解和使用: 即使初次接触也能迅速上手。

关键特性:

  1. 自动化表映射: 自动生成标准化实体类,类似Thrift/Protocol Buffers。
  2. 高效序列化: 实体类内置高速序列化机制。
  3. 数据读写分离: 支持多数据源配置,灵活管理读写负载。
  4. 智能缓存管理: 细致控制缓存策略,包括缓存时效,数据回收机制。
  5. 广泛兼容: 兼容所有遵循JDBC标准的数据库。
  6. 高级功能: 包括事务管理、存储过程和批处理等数据库高级功能
  7. SQL文件映射: 类似MyBatis,支持SQL与业务逻辑分离。

解决Hibernate与MyBatis痛点的新方案

  1. Hibernate普遍认为存在的问题
    1. 过度封装:hibernate提供了一层高级的抽象(包括HQL),这有助于开发者专注于业务逻辑而不是底层的SQL,这是一种更高级的编程模型 但它高度自动化虽然减少了对SQL的理解需求,同时却也掩盖底层数据库的具体行为,这可能导致性能瓶颈难以定位和优化
    2. 复杂性:配置和学习曲线陡峭,对于大型项目可能引入不必要的复杂度,尤其是当需要进行细粒度控制时。
    3. 性能问题:反射和代理机制在高并发场景下可能影响性能,尤其是在大规模数据处理时。
  2. MyBatis 普遍认为存在的问题
    1. SQL的维护:MyBatis 提供了通过 XML 配置文件将 SQL 与 Java 代码分离的功能,这种方式提高了灵活性,使开发者可以直接编写和优化 SQL。然而,将所有 SQL 都与代码分离,可能会导致大量的SQL配置。这无疑增加了配置的复杂度和维护的工作量。特别是在团队协作环境中, 过多的SQL或Xml文件还可能引发版本管理和合并冲突的问题。
    2. 重复工作:在 MyBatis 中,每个 DAO 都需要编写相似的 SQL 语句和结果映射逻辑。这种重复性工作不仅增加了开发时间,还容易引入错误,导致代码维护的复杂性增加。尤其是在处理常见的 CRUD 操作时,重复编写相似的 SQL 语句显得非常低效。

JDAO 的创新解决方案

融合优势 JDAO框架结合了Hibernate的抽象层次和MyBatis的灵活性,旨在提供一个既强大又直观的持久层解决方案。

    1. 标准化映射实体类,处理单表CRUD操作:90%以上的数据库单表操作,可用通过实体类操作完成。这些对单表的增删改查操作,一般不涉及复杂的SQL优化,由实体类封装生成,可以减少错误率,更易于维护。 利用缓存,读写分离等机制,在优化持久层上,更为高效和方便 标准化实体类的数据操作格式并非简单的java对象函数的拼接,而是更类似SQL操作的对象化,使得操作上更加易于理解。
    2. 复杂SQL的执行:在实践中发现,复杂SQL,特别是多表关联的SQL,通常需要优化,这需要对表结构,表索引性质等数据库属性有所了解。 而将复杂SQL使用 java对象进行拼接,通常会增加理解上的难度。甚至,开发者都不知道对象拼接后的最终执行SQL是什么,这无疑增加了风险和维护难度。 因此Jdao在复杂SQL问题上,建议调用Jdao的CURD接口执行,Jdao提供了灵活的数据转换和高效的javaBean映射实现,可以避免过渡使用反射等耗时的操作。
    3. 兼容myBatis映射文件: 对于复杂的sql操作,jdao提供了相应的crud接口。同时也支持通过xml配置sql进行接口映射调用,这点与mybatis特性相似,区别在于mybatis需要映射所有SQL操作。 而Jdao虽然提供了完整的sql映射接口,但是建议只映射复杂SQL,或操作部分标准实体类无法完成的CURD操作。 jdao的SQL配置文件参考mybatis配置文件格式,并实现新的解析器,使得配置参数在类型上的容忍度上更高,更灵活。(具体可以参考文档)

快速入门:

    • 访问 GitHub 获取源码和示例。
    • 查看 Demo 了解实际应用案例。
    • 阅读 使用文档 掌握详细用法。
    • 浏览 官方网站 获得更多信息和支持。


程序简单介绍

使用Jdao,所有功能只需要4个入口,分别为:

1. Jdao

主要核心入口,提供以下功能:

  • 设置数据源
  • SQL CRUD 函数

2. JdaoCache

缓存入口,支持以下功能:

  • 绑定或移除包、类等属性,开启或移除它们的查询缓存

3. JdaoSlave

读写分离操作入口,支持以下功能:

  • 绑定或移除包、类等属性,开启或移除它们的读写分离操作

4. JdaoMapper

映射 SQL 与接口,支持以下功能:

  • 直接调用 Jdao 接口操作 SQL
  • 通过 XML 文件进行 SQL 映射

快速入门

 

1. 安装 jdao依赖包

# 使用 Maven 安装
<dependency>
	<groupId>io.github.donnie4w</groupId>
	<artifactId>jdao</artifactId>
	<version>2.0.1</version>
	<scope>compile</scope>
</dependency>

2. 配置数据源

Jdao.init(dataSource,Jdao.MYSQL);
// dataSource 为数据源
// Jdao.MYSQL 为数据库类型

3. 生成表标准化实体类

使用 Jdao 代码生成工具生成数据库表的标准化实体类。

4. 实体类增删改查等操作

//数据源设置
Jdao.init(dataSource,Jdao.MYSQL);

// 读取
Hstest t = new Hstest();
t.where(Hstest.ID.GT(1));
t.limit(20,10);
List<Hstest> list = t.selects(Hstest.Id);
for (Hstest hstest : list) {
	System.out.println(hstest);
}
// [SELECT SQL] selectid from hstest where id> ? limit ?,? [1,10,10] 

// 更新
Hstest t = new Hstest();
t.SetValue("hello world")
t.where(Hstest.ID.EQ(1));
t.update()
//[UPDATE SQL] update hstest set value=? where id=? ["hello world",1]

// 删除
Hstest t = new Hstest();
t.where(Hstest.ID.EQ(1));
t.delete()
//[DELETE SQL]delete from hstest where id = ? [1]

// 新增
Hstest hs = new Hstest();
hs.setRowname("hello world");
hs.setValue("123456789");
hs.insert();
//[INSERT SQL] insert to hstest (rowname,value) values(?,?) ["hello world","123456789"]

5. Jdao

CRUD操作

//查询,返回单条
Hstest hs =Jdao.executeQuery(Hstest.class,"select * from Hstestorder by id desc limit 1");
System.out.println(hs);

//insert
inti = Jdao.executeUpdate("insert into hstest2(rowname,value) values(?,?)", "helloWorld", "123456789");

//update
inti = Jdao.executeUpdate("update hstest set value=? where id=1", "hello");

//delete
inti = Jdao.executeUpdate("delete from hstest where id = ?", 1);

6. JdaoCache

配置缓存

//绑定Hstest.class启用缓存, 缓存时效为 100毫秒
JdaoCache.bindClass(Hstest.class,new CacheHandle(100));
Hstest t = new Hstest();
t.where(Hstest.ID.EQ(3));
Hstest hs = t.select();
System.out.println(hs);

//返回缓存数据结果
Hstest t2 = new Hstest();
t2.where(Hstest.ID.EQ(3));
Hstest hs2 = t2.select();
System.out.println(hs2);

7. JdaoSlave

读写分离

JdaoSlave.bindClass(Hstest.class, DataSourceFactory.getDataSourceByPostgreSql(), DBType.POSTGRESQL);
//这里主数据库为mysql,备数据库为postgreSql,Hstest读取数据源为postgreSql
Hstest t = new Hstest();
t.where(Hstest.ID.EQ(3));
Hstest hs = t.select();
System.out.println(hs);

8. JdaoMapper

使用 XML 映射 SQL

<!-- MyBatis 风格的 XML 配置文件 -->
<mapper namespace="io.github.donnie4w.jdao.action.Mapperface">
<select id="selectHstestById" parameterType="int" resultType="io.github.donnie4w.jdao.dao.Hstest">
SELECT * FROM hstestWHERE id < #{id} and age < #{age}
</select>
</mapper>
//初始化数据源
Jdao.init(DataSourceFactory.getDataSourceBySqlite(), DBType.SQLITE);
//读取解析xml配置
JdaoMapper.build("mapper.xml");

JdaoMapper jdaoMapper = JdaoMapper.newInstance()
Hstest hs = jdaoMapper.selectOne("io.github.donnie4w.jdao.action.Mapperface.selectHstestById", 2, 26);

System.out.println(hs);

mapper 映射为java接口

public interface Mapperface {
List<Hstest> selectAllHstest();
List<Hstest> selectHstest(int id, int age);
Hstest selectHstestByMap(Map map);
List<Hstest> selectHstestByList(int id, int age);
Hstest[] selectHstestByList(List list);
Hstest selectHstestById(int id, int age);
List<Hstest> selectHstestById(Integer id, Integer age);
Hstest1 selectHstest1(int limit);
List<Hstest1> selectHstest1(long limit);
int insertHstest1(Hstest1 hs);
int updateHstest1(Hstest1 hs);
int deleteHstest1(Hstest1 hs);
}


@Test
public void selectMapperFace() throws JdaoException, JdaoClassException, SQLException {
JdaoMapper jdaoMapper = JdaoMapper.newInstance();
Mapperface mapper = jdaoMapper.getMapper(Mapperface.class);

List<Hstest> list = mapper.selectHstestById(Integer.valueOf(5), Integer.valueOf(20));
for (Hstest hs : list) {
System.out.println(hs);
}

Hstest hstest = mapper.selectHstestById(5, 20);
System.out.println(hstest);
}

更多详细信息和实践示例,请查阅 Jdao使用文档


相關推薦

2024-08-07

简介:gdao是一种创新的持久层解决方案。主要目的在于 减少编程量,提高生产力,提高性能,支持多数据源整合操作,支持数据读写分离,制定持久层编程规范。 灵活运用gdao,可以在持久层设计上,减少30%甚至50%以上的编程

2023-08-03

Jdao 基于Java的持久层框架,零配置,零SQL操作持久层 用最简单的方式操作数据库 支持全对象方式读写数据; 支持事务,缓存,批处理等操作; 支持原生sql 操作; 支持注册多数据源,设置对象,类,包名对应不同数据

2023-04-25

sms4j V2.0.1版本正式发布 该版本中包含了一些重要的更新和改进,以提高框架的性能、可靠性和用户体验。在这里,我们将详细介绍这些更新内容。 数据库刷新和读取的方法进行了优化 为了提高系统的性能,我们对数据

2024-07-10

  Linux 软件 Linux 软件生态正迎来一场革命,随着软件数量的激增,传统的包管理系统逐渐暴露出依赖性强、兼容性差、安全性不足等问题。作为一种新型的独立包管理工具集,“玲珑” 提供分层与隔离的运行环境,

2022-05-27

MyBatis 3.5.10 已发布,MyBatis 的前身为 iBatis,是一个数据持久层(ORM)框架,它提供的持久层能力包括 SQL Maps 和 Data Access Objects(DAO)。 主要变化 Bugfix 在 `test` 表达式中调用方法时出现意外的非法反射访问警告 #2392 自动

2024-07-25

AutoMQ 介绍 Apache Kafka 自诞生之日起,就以其卓越的设计和强大的功能,很快成为了流系统领域的事实标准。它不仅定义了现代流系统的架构,更以其独特的分布式日志抽象,为实时数据流的处理和分析提供了前所未有的能力。

2024-06-27

发!》中向全球开发者介绍了华为自研仓颉编程语言,并发布了HarmonyOS NEXT仓颉语言开发者预览版。这是华为首次公开发布仓颉编程语言。 据介绍,复旦大学工研院认知与智能技术实验室(CITLab)领衔的研发团队与华为仓颉编

2024-08-09

关注业务本身,切实提升开发效率。 目前,文心快码已发布2.5版本,在知识增强、研发流程全域赋能、企业级安全等方面实现了能力提升。百度80%的工程师已经在深度使用文心快码,其中代码采纳率已达到46%,新增代码生成占

2024-07-11

AutoMQ 介绍 Apache Kafka 自诞生之日起,就以其卓越的设计和强大的功能,很快成为了流系统领域的事实标准。它不仅定义了现代流系统的架构,更以其独特的分布式日志抽象,为实时数据流的处理和分析提供了前所未有的能力。

2024-08-13

ETL & 流批一体化框架 bboss v7.2.6 发布---简版Flink。文件输出插件新增将生成的数据文件写入oss数据库minio功能以及若干改进。 v7.2.6 功能改进-20240812 问题修复:修复部分Postgresql分页查询失败问题 功能改进:将框架中部

2022-10-02

密评要求。         此次发布的为 v2.0.1 正式版本,具体更新内容如下: 1.【新增】新增easyTrans和typehandel来替代 传统的join表和加解密 2.【更新】关闭satoken的最大登录限制 3.【修复】修复issues中单

2023-09-25

开发者在用 React 开发时面临的一些棘手问题。v2.0.1 现已发布,具体更新内容包括: Patch Changes 修复使用 pnpm 时 MDX 文件的类型 ( #7491 ) 更新getDependenciesToBundle以处理没有 main exports 的 ESM 包 ( #7272 ) 注意,这

2023-04-08

OpenHarmony 3.2 已正式发布。 OpenHarmony 开源项目是由开放原子开源基金会孵化及运营的开源项目,由开放原子开源基金会 OpenHarmony 项目群工作委员会负责运作。 OpenHarmony 整体遵从分层设计,从下向上依次为:内核层、系统服

2023-06-27

钟内就能搭建自己的工作流引擎。 V2.0.1版本介绍 自从发布了第一个版本之后,很多小伙伴反馈前端为啥不开源,限制了使用场景~本人和团队商量之后,加班加点赶了一版开源版本出来,现在正式放出来了,欢迎大家体验。