【问题标题】:Java: JOOQ persistence framework performance and feed back [closed]Java:JOOQ 持久性框架性能和反馈 [关闭]
【发布时间】:2011-08-03 07:22:31
【问题描述】:

我已经stumbled 使用了一个很好的 SQL 构建器框架,称为 JOOQ。顺便说一句,在俄语 JOOQ 中听起来像名词,意思是“虫子”(作为昆虫)、“甲虫”;)

如果您对 JOOQ 有任何反馈,它的性能等,请分享。也欢迎链接到有关 JOOQ 的博客。

【问题讨论】:

    标签: java persistence jooq sqlbuilder


    【解决方案1】:

    我想我也应该在这里回答,因为我在一个半月前开始使用 jooq,所以我有一些经验。

    我想使用像 jooq 这样的工具,因为:

    • ORM 在我当前的项目(集群的分布式计算平台)中是多余的,因为我只需要从 db 中读取和写入单独的字段,而不是完整的表行,而且我的一些查询非常复杂,无法通过简单和轻量级 ORM。
    • 我希望查询的语法自动完成,这样我就不需要记住整个数据库了
    • 我希望能够直接用 Java 编写查询,以便编译器可以在构建时检查基本查询语法。
    • 我希望我的查询是类型安全的,这样我就不会意外地将一种类型的变量传递给需要另一种类型的变量。
    • 我想要 SQL,但我希望它非常方便易用

    嗯,有了 jooq,我能够做到这一切。我的主要要求是让 jooq 处理足够复杂的查询(嵌套、分组等)。已经实现了。

    我还希望能够使用尽可能少的代码行来运行查询,并且能够使用 jooq fluent API 来实现这一点,该 API 允许类似 jquery 的调用来执行 SELECT。

    在使用 jooq 的过程中,我报告了 one or two bugs,我必须说,它们的修复速度非常快。

    我也有missed some features,我必须再说一遍,我几乎已经拥有了所有这些。

    我非常喜欢的是,jooq 现在使用 SLF4J 来报告一些关于其性能的非常有趣的数据以及输出它所构建的实际查询。它对我的调试很有帮助。

    Jooq 甚至为存储过程、UDF 和可更新记录集生成 Java 工件,不过我目前不使用这些。

    重要的是,jooq 透明地支持 DB2、Derby、H2、HSQLDB、MySQL、Oracle、PostGreSQL、SQLite、SQL Server、Sybase SQL Anywhere。相当广泛的列表,我认为。

    Jooq 有 support forum in Google groups,Lukas 日以继夜地准备回答我最愚蠢的问题。

    Jooq 支持 Maven,这让我松了一口气,因为我所有的 Java 项目都是基于 Maven 的。我们仍然想念生成器的 Maven 插件,但这并不重要,因为运行生成器是小菜一碟。

    使用 jooq 编写查询时我突然发现,它们变得非常可移植,因为我几乎从未在代码中使用任何 MySQL 特定的功能,因为 jooq 试图尽可能地移植。对于那些不能忍受这种特殊性的人,据我所知,对 SQL 扩展的支持也在进行中。

    在我看来,jooq 暂时缺少什么?

    好吧,除了 SELECT 之外,没有用于语句的流畅 API。这会使代码稍微复杂化,并使 UPDATE/DELETE 语句的编写更加复杂。但我认为这将很快添加。 刚刚在 1.5.9 中实施!哈!对我来说太快了;)

    还有一件事。 Jooq 有一本很好的手册,但是……我不知道。可能我只是不明白它的结构或架构......当我第一次开始使用jooq时,我打开一个又一个页面寻找我需要的功能。例如,尝试猜测jooq manual UPDATE 和DELETE 语句在哪里描述,查看内容......但我相信这真的很主观。我什至无法解释,从我的角度来看,手册有什么问题。如果可以,我会张贴一两张票;)

    手动也不是很好导航,因为 Trac 没有类似“这里、那里和返回”的自动链接。

    嗯,对我来说,莫斯科(俄罗斯)的 Trac 页面打开速度也不快,所以阅读手册有点无聊。

    手册还遗漏了对贡献者的 jooq 的良好架构描述。 Jooq 似乎遵循按合同设计的原则,当我想通过在 IDE 中使用我通常的 Ctrl-Click 某些方法名称来了解如何在内部实现某些功能时,我最终进入了一个没有实现的沉闷界面;)不是这样我太聪明了,无法立即开始改进 jooq,但我当然会喜欢了解 jooq 是如何从头到尾构建的。

    也很遗憾我们不能为 jooq 手册做出贡献。我希望它会出现在某种 wiki 中。

    我还想改进的是the waynews are reported。我更喜欢那里的手册链接或这个或那个新功能如何工作的示例。

    Release notes link in manual 实际上只是一个路线图。我想,我明天会自己做那个......

    Jooq 目前也有相对较小的社区,但我很高兴地报告它不会影响代码质量或引入新功能的方式。

    Jooq 确实是一个很好的项目。我也会在我未来的项目中坚持下去。我真的很喜欢。

    【讨论】:

    • 很有趣知道!我什至不知道 JOOQ,我想我对此并不感兴趣(我更喜欢存储过程中的普通旧 SQL,并使用它的特定功能优化一个数据库)但从你的描述来看,它似乎是一个 ORM做得对。这太不常见了。所以欢迎来到JOOQ
    • @FractalizeR 2 年后,seems Wiki thinks it is an ORM after all,不过。
    • 看起来,它会永远挂在那里......我不确定它是好是坏。 Wiki 甚至 says,那个 JOOQ 实现了 ActiveRecord ......哦,我的......
    【解决方案2】:

    您还可以查看MentaBean,这是一个轻量级的 ORM 和 SQL 构建器,可让您尽可能接近 SQL,为样板代码提供大量帮助。这是一个例子:

    程序化配置:

    private BeanConfig getUserBeanConfig() {
    
        // programmatic configuration for the bean... (no annotation or XML)
    
        BeanConfig config = new BeanConfig(User.class, "Users");
        config.pk("id", DBTypes.AUTOINCREMENT);
        config.field("username", DBTypes.STRING);
        config.field("birthdate", "bd", DBTypes.DATE); // note that the database column name is different
        config.field("status", new EnumValueType(User.Status.class));
        config.field("deleted", DBTypes.BOOLEANINT);
        config.field("insertTime", "insert_time", DBTypes.TIMESTAMP).defaultToNow("insertTime");
    
        return config;
    }
    
       // create table Users(id integer primary key auto_increment, 
       // username varchar(25), bd datetime, status varchar(20), 
       // deleted tinyint, insert_time timestamp)
    

    一个简单的 SQL 连接查询:

    Post p = new Post(1);
    
    StringBuilder query = new StringBuilder(256);
    query.append("select ");
    query.append(session.buildSelect(Post.class, "p"));
    query.append(", ");
    query.append(session.buildSelect(User.class, "u"));
    query.append(" from Posts p join Users u on p.user_id = u.id");
    query.append(" where p.id = ?");
    
    stmt = conn.prepareStatement(query.toString());
    stmt.setInt(1, p.getId());
    
    rset = stmt.executeQuery();
    
    if (rset.next()) {
    
        session.populateBean(rset, p, "p");
    
        u = new User();
    
        session.populateBean(rset, u, "u");
    
        p.setUser(u);
    }
    

    【讨论】:

      【解决方案3】:

      如果您只寻找 SQL 构建器解决方案。我有一个项目,它是 Java 的 ORM 框架,但它仍然为时过早,并且在持续开发中,但是可以处理数据库的许多原始用法。 https://github.com/ahmetalpbalkan/orman

      此阶段没有文档,但是它可以仅使用 Java 链方法构建安全查询,并且可以处理许多 SQL 操作。它还可以将classes-fields分别映射到table-columns。

      这是查询的示例查询构建操作

      SELECT COUNT(*) FROM sailors WHERE
          rating>4 AND rating<9 GROUP BY rating HAVING AVG(age)>20;
      

      Java 代码:

          QueryBuilder qb = QueryBuilder.getBuilder(QueryType.SELECT);
          System.out.println(qb
                  .from("sailors")
                  .where(
                          C.and(
                                  C.gt("rating", 5),
                                  C.lt("rating", 9)))
                  .groupBy("rating")
                  .having(
                          C.gt(
                                  new OperationalField(QueryFieldOperation.AVG,
                          "age").toString(), 20)
                          ).getQuery());
      

      (哈哈,干脆放弃开发那个框架!)

      很可能这对你不起作用,但只是想宣布我的项目:P

      【讨论】:

      • 您的框架在我看来很像 JPA/CriteriaQuery。你为什么要创建你自己的?它与 JPA 有什么不同?
      • 为什么不为 jOOQ 做贡献呢? :)
      • 我的项目的主要目标是创建一个注释驱动的 ORM,就像 JPA 一样。 QueryBuilder 只是它的一个特性。这与jooq不同。正如你所说的jOOQ is NOT an OR-mapper.,但我的是。
      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      相关资源
      最近更新 更多