# 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 只能用于分页