2011-04-11 114 views

回答

32

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

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

  • ORM是我当前的项目矫枉过正(分布式计算平台,为集群),因为我需要阅读并从数据库中只写不同的领域,而不是完整的表行和我的一些查询足够复杂,不能被简单和轻量级的ORM执行。
  • 我希望语法自动完成我的查询,所以我不需要记住我的整个数据库
  • 我希望能够直接在Java中编写查询,以便编译器可以检查构建基本查询语法。
  • 我希望我的查询是类型安全的,这样我就不会意外地传递一种类型的变量,而另一种类型的变量也是预期的。
  • 我想SQL,但我想它非常方便和易于使用的

那么,与jooq我能做到这一切。我的主要要求是jooq能够处理足够复杂的查询(嵌套,分组等)。那已经完成了。

我也希望能够使用尽可能少的代码行来运行查询,并且能够使用jooq fluent 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卢卡斯日夜准备回答我的问题甚至最愚蠢的问题。

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是一个很好的项目。我将坚持为我的未来项目。我很喜欢。

+0

Interresting就知道了!我甚至不知道JOOQ,我认为我没有对它感兴趣(我更喜欢存储过程中普通的旧SQL,并使用它的特定功能对一个DB进行优化),但从您的描述看来,它似乎是一个ORM做对了。这太不常见了。所以欢迎来到JOOQ – 2011-05-19 09:46:56

+1

@Nicolas Jooq不是一个ORM。 – 2011-05-19 18:49:09

+0

@FractalizeR 2年过去了,[但似乎Wiki认为它是一个ORM](http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software)。 – yair 2014-05-14 19:36:08

0

如果您只查找SQL构建器解决方案。我有一个项目是Java的ORM框架,但它仍然是不成熟的,并且在不断的发展中处理许多数据库的原始用法。 https://github.com/ahmetalpbalkan/orman

在这个阶段没有文档,但是它可以只使用Java链方法构建安全查询,并且可以处理许多SQL操作。它也可以分别将类字段映射到表列。

下面是查询的样本构建查询操作

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()); 

(!LOL干脆放弃开发框架)

最有可能是行不通的为你,但只是想宣布我的项目:P

+0

你的框架看起来很像我JPA/CriteriaQuery。你为什么创建自己的?它与JPA有什么不同? – 2011-05-22 13:43:34

+0

为什么不贡献给jOOQ呢? :) – 2011-05-22 14:11:26

+0

我的项目的主要目标是创建一个注释驱动的ORM,就像JPA一样。 QueryBuilder只是它的一个功能。这与jooq不同。正如你所说'jOOQ不是一个OR映射器',但我的是。 – 2011-05-22 15:27:50

2

你也可以拿一个请看MentaBean,这是一个轻量级的ORM和SQL Builder,可以让您尽可能接近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); 
}