jOOQ 与类型安全 SQL 访问

共 20 题
#

1. jOOQ 的类型安全 SQL DSL 相比字符串 SQL 的编译期校验价值

A 它只提供类型安全,不校验表名和字段名
B 通过代码生成把 schema 映射为强类型,表名、字段名、类型在编译期校验,重构安全 ✓ 正确答案
C 它与字符串 SQL 在编译期行为完全相同
D 字段类型错误只能在运行时发现
#

2. jOOQ 的代码生成(codegen),从数据库 schema 生成表/字段 Java 类型

A 代码生成器在运行时连接数据库,动态生成类型
B jOOQ 不需要代码生成即可类型安全
C 代码生成器读取数据库 schema 生成表、字段等强类型 Java 代码,通常在构建时执行 ✓ 正确答案
D 代码生成后 schema 变更无需重新生成
#

3. jOOQ 与 JPA/Hibernate 的选型边界,动态查询、复杂 SQL 与 ORM 的取舍

A 两者互斥,只能选其一
B JPA 比 jOOQ 更适合复杂 SQL 与动态查询
C jOOQ 管理实体生命周期与缓存
D JPA 面向对象模型适合 CRUD 与级联,jOOQ 面向复杂 SQL 与动态查询,可按场景结合使用 ✓ 正确答案
#

4. jOOQ 的 SQL 方言抽象(Dialect)与多数据库(MySQL/PostgreSQL/Oracle)移植

A jOOQ 的 DSL 只支持单一数据库
B SQLDialect 只影响 SQL 语句,不影响分页
C 方言差异必须由开发者手动处理
D jOOQ 用通用 DSL 写代码,按 SQLDialect 渲染为对应方言 SQL,自动处理分页、JSON 等差异,实现多库移植 ✓ 正确答案
#

5. jOOQ 的 SQL 注入防护,绑定变量(bind values)与内联(inline)的取舍

A jOOQ 默认用内联拼接,容易注入
B 绑定变量性能一定差于内联
C jOOQ 默认用绑定变量(PreparedStatement)防注入,内联仅在特殊场景使用且需自行转义 ✓ 正确答案
D 内联无需处理用户输入
#

6. jOOQ 的 SQL 渲染管线,RenderContext 按方言生成 SQL 与绑定变量占位符分离,自定义渲染器的用途

A RenderContext 渲染带占位符的 SQL 并分离收集绑定参数,自定义渲染器可改写或审计 SQL ✓ 正确答案
B 渲染管线与方言无关
C 自定义渲染器只能用于格式化,不能改 SQL
D 渲染SQL与绑定参数混在一起,无法分离
#

7. jOOQ 的事务集成,与 Spring @Transactional 和 TransactionAwareDataSourceProxy 的协作

A jOOQ 必须使用独立事务,不能复用 Spring 连接
B jOOQ 无法与 Spring 事务协作
C 通过 TransactionAwareDataSourceProxy 包裹 DataSource,使 jOOQ 连接感知 Spring 事务传播,与 @Transactional 共享同一事务 ✓ 正确答案
D TransactionAwareDataSourceProxy 与事务无关
#

8. jOOQ 的批处理(batch/batchExecute)与批量写入性能

A jOOQ 不支持批量操作
B 批大小越大性能一定越好
C 批处理只能一次执行一条语句
D jOOQ 的 batch API 将多条语句打包成 JDBC 批量执行,配合合理的批大小与 rewriteBatchedStatements 提升批量写入性能 ✓ 正确答案
#

9. jOOQ 的 JSON/XML 与聚合函数(JSON_ARRAYAGG 等)的类型安全映射

A JSON 字段无法做类型安全映射
B JSON 聚合函数与数据库无关
C codegen 生成 JSON 字段类型,配合 Converter 映射 Java 对象,JSON_ARRAYAGG 等聚合函数由 DSL 封装并做方言适配 ✓ 正确答案
D jOOQ 只能把 JSON 当字符串处理
#

10. jOOQ 的分页,LIMIT/OFFSET 与窗口函数分页的跨数据库差异

A jOOQ 的 limit() 对所有数据库生成相同 SQL
B jOOQ 的 limit() 按方言适配 LIMIT/OFFSET/FETCH 语法,深分页可用 keyset 或窗口函数分页避免大 offset 扫描 ✓ 正确答案
C 深分页性能与 LIMIT/OFFSET 无关
D 窗口函数分页只适用于 MySQL
#

11. jOOQ record 到 DTO/POJO 的映射(RecordMapper/DefaultRecordMapper)与嵌套对象

A 映射必须手动逐字段赋值
B jOOQ 只能返回 Record,无法映射到 POJO
C DefaultRecordMapper 按字段名自动映射到 POJO,支持自定义 RecordMapper 与嵌套对象映射 ✓ 正确答案
D 嵌套对象无法映射
#

12. jOOQ 的 DSL API 组合,condition 拼接与动态 where 如何替代字符串拼接

A 动态条件只能用字符串拼接
B 动态查询会导致类型不安全
C Condition 无法动态组合
D 用 Condition 对象组合条件(and/or、可空跳过),类型安全且无注入风险,替代字符串拼接 ✓ 正确答案
#

13. jOOQ 与 MyBatis 共存的分工,复杂报表 SQL 交给 jOOQ、简单 CRUD 用 MyBatis-Plus

A 两者不能共存,只能选其一
B 简单 CRUD 用 MyBatis-Plus、复杂报表用 jOOQ 是合理分工,两者共享 DataSource 并由 Spring 统一管理事务 ✓ 正确答案
C jOOQ 更适合简单 CRUD
D 共存会导致事务必然冲突
#

14. jOOQ 的执行监听器(ExecuteListener)与慢 SQL/审计钩子

A ExecuteListener 只能用于日志,不能检测慢 SQL
B 慢 SQL 检测必须在数据库端完成
C ExecuteListener 在执行生命周期回调,可在 executeEnd 记录耗时检测慢 SQL,在 executeStart 实现审计钩子 ✓ 正确答案
D ExecuteListener 无法获取 SQL 与参数
#

15. jOOQ 的 UPSERT,onDuplicateKeyUpdate/onConflict 的跨数据库差异,以及如何实现幂等写入

A jOOQ 按方言渲染 UPSERT(onDuplicateKeyUpdate/onConflict/MERGE),冲突时更新或跳过,实现幂等写入 ✓ 正确答案
B jOOQ 的 UPSERT 对所有数据库生成相同 SQL
C UPSERT 无法实现幂等
D onConflict 只能用于 MySQL
#

16. jOOQ 的乐观锁,version/timestamp 字段如何在 UPDATE 中自动附加条件并返回受影响行数

A jOOQ 不支持乐观锁
B UPDATE 时自动附加 version 条件,受影响行数为 0 表示并发冲突,可据此抛出异常或重试 ✓ 正确答案
C 乐观锁只用 timestamp,不用 version
D 受影响行数无法判断冲突
#

17. jOOQ 的 DSLContext 生命周期与线程安全,Configuration/DSLContext 的复用边界

A 所有 DSLContext 都可跨线程复用
B DSLContext 完全不可复用
C 事务 DSLContext 可以跨线程传播
D 全局 DSLContext 可线程安全复用,但事务内 DSLContext 绑定连接与事务,不能跨线程复用 ✓ 正确答案
#

18. jOOQ 与 Flyway 的协作,生成代码与迁移脚本的版本同步

A 生成代码与迁移脚本无需同步
B 两者无法在构建中串联
C 构建时先执行 Flyway 迁移再运行 codegen,保证生成代码与当前 schema 一致,迁移脚本与代码同步提交 ✓ 正确答案
D codegen 应在迁移前执行
#

19. jOOQ 对存储过程、UDT 与 MySQL 原生特性的支持边界

A jOOQ 通过 Routine 调用存储过程、codegen 生成 UDT,但部分 MySQL 特有功能需用原生 SQL 兜底 ✓ 正确答案
B jOOQ 完全支持所有 MySQL 原生特性
C jOOQ 不支持存储过程
D UDT 无法在 jOOQ 中使用
#

20. jOOQ 的 Converter/Binding,自定义 Java 类型与数据库类型的双向映射,与代码生成器的配合

A Converter 只能做单向转换
B Converter 实现数据库类型与 Java 类型的双向映射,Binding 处理底层 JDBC,codegen 配置可使生成字段自动应用 ✓ 正确答案
C Converter 与 codegen 无关
D Binding 只能用于分页