当前位置: 首页 > 知识库问答 >
问题:

是否可以将MyBatis和QueryDSL/Jooq结合起来?

易嘉胜
2023-03-14

我已经检查的内容:

  • 我曾考虑用QueryDSL生成SQL查询字符串,并在MyBatis中使用它的'@SelectProvider'注释,但这似乎是一个死胡同:MyBatis在它的SQL字符串中需要“${xxx}”的东西,但QueryDSL只生成基于实际Java类型的查询,所以它甚至对ID也不起作用。
  • 作为querydsl/jooq的替代方案的mybatis生成器:相当糟糕的替代方案,因为它实际上生成了一个样板代码,您以后必须对其进行维护和扩展
  • MyBatis SQL Builder作为QueryDSL/jOOQ的替代:比QueryDSL或jOOQ弱得多,例如,它不提供列名的编译时检查,它更麻烦,并且它依赖于使代码复杂化的“@SelectProvider”

共有1个答案

龚志文
2023-03-14

我将从一个更高的层面来回答--所以我不是深入研究QueryDSL和jOOQ之间的实际差异,在讨论的这一点上,它们“只是”在Java中提供了类型安全的嵌入式SQL。但是,我将从jOOQ的角度给出答案,因为我对这个API了解得多。

免责声明:我是从一个为Jooq背后的公司工作的人的角度给出这个答案的。

是的。你可以把jOOQ和Mybatis结合起来。例如,您可以从jOOQ查询中提取查询字符串,如下所示:

Select<?> query =
DSL.using(configuration)
   .select(TABLE.A, TABLE.B)
   .from(TABLE)
   .where(TABLE.C.eq(1));

String sql = query.getSQL();
List<Object> bindvalues = query.getBindValues();
    null

例如,jOOQ实现了很容易挂入日志钩子的功能,但是您也可以使用JDBC跟踪日志库或您的JDBC驱动程序的功能在JDBC级别上进行日志记录

4)映射

我在这里所说的缓存也是同样的道理。MyBatis为您的映射算法提供了一个简单的默认实现,当您进入更复杂的映射场景时,这可能很快就不够了。jOOQ,btw也是如此,它还实现了POJO的默认映射,您可以以任何方式覆盖POJO。但与缓存非常类似,映射并不是真正应该在SQL级别上解决的问题。对于映射本身,您会找到更好的工具,例如Model Mapper(它内置了jOOQ支持,顺便说一句)。或者,如果您在Java8环境中,您可以使用常规的函数式编程技术来映射内容,例如,如下所示:

DSL.using(configuration)
   .select(
       COLUMNS.TABLE_NAME,
       COLUMNS.COLUMN_NAME,
       COLUMNS.TYPE_NAME
   )
   .from(COLUMNS)
   .orderBy(
       COLUMNS.TABLE_CATALOG,
       COLUMNS.TABLE_SCHEMA,
       COLUMNS.TABLE_NAME,
       COLUMNS.ORDINAL_POSITION
   )
   .fetch()
   .stream()
   .collect(groupingBy(
       r -> r.getValue(COLUMNS.TABLE_NAME),
       LinkedHashMap::new,
       mapping(
           r -> new Column(
               r.getValue(COLUMNS.COLUMN_NAME),
               r.getValue(COLUMNS.TYPE_NAME)
           ),
           toList()
       )
   ))
   .forEach(
       (table, columns) -> {
            System.out.println(
                "CREATE TABLE " + table + " (");

            System.out.println(
                columns.stream()
                       .map(col -> "  " + col.name +
                                    " " + col.type)
                       .collect(Collectors.joining(",\n"))
            );

           System.out.println(");");
       }
  );
 类似资料:
  • 问题内容: MyBatis提供了映射,本地缓存和开箱即用的功能。 QueryDSL / jOOQ提供了SQL语句的编译时检查和IDE自动完成的结果。 是否可以将它们组合在一起? 换句话说, 我想使用QueryDSL或jOOQ创建一个查询,然后使用MyBatis用一些粘合代码/适配器执行它 。 我已经检查过的内容: 我考虑过使用QueryDSL生成SQL查询字符串,并在MyBatis中使用它的’@S

  • 我们有基于微服务架构的应用程序的第一个版本。我们使用REST进行外部和内部通信。 现在我们想从 CP(CAP 定理)* 切换到 AP,并使用消息总线在微服务之间进行通信。有很多关于如何基于 Kafka、RabbitMQ 等创建事件总线的信息。但是我找不到任何结合 REST 和消息传递的最佳实践。例如,您创建一个汽车服务,您需要添加不同的汽车组件。为此,将 REST 与 POST 请求一起使用会更有

  • 问题内容: 我正在使用Phonegap + React.js和Socket.io开发一个应用程序。但是,随后React-Native发行了,其原生感觉很棒。 我试图让socket.io-client与React Native一起工作,但是不幸的是没有成功。我做了一些研究,发现与此问题中描述的错误完全相同:https : //github.com/facebook/react- native/iss

  • 然而,域的其余部分是具有挑战性的,出于许多原因,我不想直接将其映射到DB表。 我尝试引入由Hibernate管理的中间bean,并从这些bean映射到我的域,当所有的关系都是从挑战到容易的部分时,这很好地工作。当Hibernate管理的“Easy”类引用映射在自定义Java代码中的“挑战性”类,而不是直接Hibernate管理时,这种方法就失败了。 这时我意识到,我找不到自定义Hibernate和

  • 问题内容: 1个 结果集 : 2个 结果集2: 有没有办法可以做到这一点: 我想在RHEL 5上使用Sybase 12.5的解决方案,我也想知道在其他任何数据库系统中是否可行。 -–谢谢您的回答- 问题答案: 通过为该列使用CASE / WHEN并基于true / false求和1或0,您可以在同一查询中获得这两者。此外,如果您希望将另一个值的总和作为另一个,则可以执行相同的操作列…只需将其替换为

  • 在过去的8个月里,我们使用vue 3和类组件构建了一个项目,但似乎不再维护它,我们希望逐渐切换到组合API,更准确地说是切换到设置脚本语法。 我们目前正在使用vue3。0.0和vue类组件8.0.0。 我们的目标是,因为我们必须不断向项目添加新功能,开始使用composition API创建新组件,同时保留那些已经使用vue class component编写的组件。而且,在我们继续的过程中,我们