您现在的位置是:首页 > 文章详情

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

日期:2024-07-31点击:194
简介: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配置文件格式,并实现新的解析器,使得配置参数在类型上的容忍度上更高,更灵活。(具体可以参考文档)

快速入门:


程序简单介绍

使用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] select id 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 Hstest order by id desc limit 1"); System.out.println(hs); //insert int i = Jdao.executeUpdate("insert into hstest2(rowname,value) values(?,?)", "helloWorld", "123456789"); //update int i = Jdao.executeUpdate("update hstest set value=? where id=1", "hello"); //delete int i = 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 hstest WHERE 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使用文档

原文链接:https://www.oschina.net/news/304658/jdao-2-0-1-released
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章