JOOQ与JDBC+测试

JOOQ与JDBC+测试,jdbc,jooq,Jdbc,Jooq,与JDBC+测试相比,JOOQ有什么优势 在JDBC中,您可以直接在代码中编写SQL查询,我们使用JOOQ调用方法,因此JOOQ在默认情况下速度较慢 在JOOQ中,犯错误更难,但并非不可能。这些错误可能会在测试中被发现,使用JOOQ,您还应该编写这些测试,因此,JOOQ没有任何优势 我完全同意你的看法。无论您是将动态语言SQL用作外部DSL(例如JDBC),还是将静态语言SQL用作内部DSL(例如jOOQ),都最好进行测试 但还有比这更多的东西: 你似乎只触及了jOOQ能为你做什么的表面。当然,

与JDBC+测试相比,JOOQ有什么优势

在JDBC中,您可以直接在代码中编写SQL查询,我们使用JOOQ调用方法,因此JOOQ在默认情况下速度较慢


在JOOQ中,犯错误更难,但并非不可能。这些错误可能会在测试中被发现,使用JOOQ,您还应该编写这些测试,因此,JOOQ没有任何优势

我完全同意你的看法。无论您是将动态语言SQL用作外部DSL(例如JDBC),还是将静态语言SQL用作内部DSL(例如jOOQ),都最好进行测试

但还有比这更多的东西: 你似乎只触及了jOOQ能为你做什么的表面。当然,类型安全的嵌入式SQL是一个很好的功能,但一旦具备了这一功能,免费获取的列表还远远不够详尽:

活动记录:使用JDBC,您可以重新手动拼写每个无聊的INSERT、UPDATE和DELETE语句。jOOQ大大简化了这一点,同时提供了以下功能: 用于记录生命周期管理 动态SQL非常简单。而不是JDBC字符串连接混乱,否则会出现。 多租户:为了对不同的架构运行相同的查询。 标准化:同一个jOOQ查询在多达21个RDBMS上运行,因为JOOQAPI标准化了生成的SQL。例如,这可以在SQL标准化最差的条款之一中看到 查询生命周期:有一个名为的简单SPI,允许您连接到各种JDBC交互步骤,包括: SQL生成 准备好的语句创建 变量绑定 处决 结果获取 例外情况 SQL转换:SPI允许您在查询表达式树中的任意位置拦截SQL生成。这可能非常有用,例如,实现功能强大的东西,如。 存储过程:使用JDBC绑定这些过程相当繁琐,尤其是当您使用更高级的功能时,如: 想象一下实现SQLData等。 当然,您可以免费获得您提到的编译时类型安全性和IDE自动完成。如果您不想全神贯注于jOOQ提供的内部DSL,您仍然可以使用jOOQ的API,然后以一种非类型安全的方式使用它,它仍然有很多特性:

//仅举一个例子:CSV导出 字符串csvExport= ctx.fetchSELECT*来自my_表,其中id=?,3 .csv; TL;博士: JDBC是一种有线协议抽象API jOOQ是一个sqlapi 免责声明:
当然,这个答案是有偏见的,因为我为jOOQ背后的公司工作,使用jOOQ由于编译时类型安全性,在重构方面也更加健壮。使用普通JDBC,当某个DB对象被重命名或删除时,更容易错过更新查询。使用像jOOQ这样的API,如果出现问题,编译器会抱怨。-活动记录:您可以向JDBC添加帮助程序-使用JDBC的动态SQL:String select=。。。;字符串from=。。。;所以同样的混乱-多租户:您在运行时更改模式的频率是多少?迁移呢?复制呢标准化:在某些数据库中,您拥有的功能在另一个数据库中缺失,在JOOQ中将如何?@Romper:Helpers:是的,您可以添加帮助程序。但是为什么要重新发明轮子呢?多租户:很多jOOQ用户都有这个问题。YMMV。迁移:。复制:对用例的更多细节感到好奇。标准化:有时,事情可以被模拟——请参阅关于复制的内容,如果您有3-4个数据库实例,JOOQ是否能够在运行时同时更改所有数据库的模式?是的,是模拟的,当您更改数据库时,您认为一切正常,但代码可能会执行意外操作things@Romper:是的,有帮助。但是,你必须确保你的测试充分涵盖了理论上应该实现但实践中往往无法实现的每一种情况。编译器不会不指出测试可能未涵盖的任何模糊的角落情况。因此,使用JavaSQLAPI,您可以集中精力编写这些测试,而不必管理大量golden master SQL查询字符串测试。记住,这些测试也需要与db模式一起重构。