本文是我们学院课程的一部分,标题为jOOQ –类型安全的数据库查询 。

在SQL和特定关系数据库很重要的Java应用程序中,jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多,JDBC过多时,这是一种替代方法。 它显示了一种现代的领域特定语言如何可以极大地提高开发人员的生产率,从而将SQL内部化为Java。

在本课程中,我们将看到如何使用jOOQ有效地查询数据库。 在这里查看 !

目录

1.简介 2.简单的活动记录操作 3.乐观锁

1.简介

虽然SQL是一种非常有表现力的语言,但是您的大多数SQL可能都是CRUD(创建,读取,更新,删除)。 编写这样的CRUD既无聊又重复,这就是为什么像Hibernate这样的ORM出现并成功提高开发人员生产力的原因。 但是,当您经常只想对表中的单个记录进行操作时,Hibernate对您的体系结构进行了许多假设(和限制)。

也可以从org.jooq.academy.section2包中获得本节中显示的示例 。

2.简单的活动记录操作

jOOQ知道“活动记录”或UpdatableRecords ,可以将其装入“特殊”种类的SELECT语句,然后在内部跟踪脏标志。 这是在不编写过多SQL的DATE_OF_BIRTH下更新作者DATE_OF_BIRTH

AuthorRecord author = dsl.selectFrom(AUTHOR).where(AUTHOR.ID.eq(1)).fetchOne();
author.setDateOfBirth(Date.valueOf("2000-01-01"));
author.store();

由于上面的示例仅通过selectFrom()从一个表中进行选择,因此jOOQ知道结果记录类型将为AuthorRecord ,即由代码生成器生成的对象。 AuthorRecord实现UpdatableRecord ,它具有多种有用的方法:

  • store() INSERTUPDATE记录
  • insert() INSERT记录
  • update() UPDATE记录
  • delete() DELETE记录
  • refresh()从数据库刷新记录

以下示例部分将指导您完成创建,读取,更新,删除此类记录的整个生命周期:

AuthorRecord author;// Create a new record and store it to the database. This will perform an INSERT statement
author = dsl.newRecord(AUTHOR);
author.setId(3);
author.setFirstName("Alfred");
author.setLastName("Hitchcock");
author.store();// Read the record by refreshing it based on the primary key value
author = dsl.newRecord(AUTHOR);
author.setId(3);
author.refresh();// Update the record with a new value
author.setDateOfBirth(Date.valueOf("1899-08-13"));
author.store();// Delete the record again
author.delete();

jOOQ的UpdatableRecords跟踪每列内部的“脏”或“已更改”状态,在调用store()以便仅插入/更新已在UpdatableRecord更改的值时使用该状态。

3.乐观锁

执行CRUD时,并发数据访问通常是一个可以通过两种方法解决的问题:

  • 通过使用悲观锁定
  • 通过使用乐观锁定

悲观锁定很少是一个好选择,因为当两个进程以不同的顺序锁定表中的几行以等待彼此完成时,死锁很容易发生。 乐观锁定是更合适的解决方案。 一个过程可能很幸运,可以在另一个过程尝试(失败)之前完成交易。 这是jOOQ的工作方式。

在我们的样本数据中, BOOK表具有一个特殊的“系统”列,称为REC_TIMESTAMP 。 每当您在BookRecord上运行CRUD操作时,jOOQ都会完全管理此列的内容,而不必保持最新状态。 考虑以下代码示例:

// Enable optimistic locking
DSLContext dsl = DSL.using(connection, new Settings().withExecuteWithOptimisticLocking(true));// Perform the CRUD with the above setting
BookRecord book1 = dsl.selectFrom(BOOK).where(BOOK.ID.eq(1)).fetchOne();
book1.setTitle("New Title");
book1.store();

jOOQ现在将执行一条UPDATE语句,该语句还将更新并检查REC_TIMESTAMP值:

update "PUBLIC"."BOOK"
set    "PUBLIC"."BOOK"."TITLE" = 'New Title',"PUBLIC"."BOOK"."REC_TIMESTAMP" = timestamp '2014-09-08 18:40:39.416'
where ("PUBLIC"."BOOK"."ID" = 1 and "PUBLIC"."BOOK"."REC_TIMESTAMP" is null)

注意如何在SET子句REC_TIMESTAMP设置为当前时间,同时在WHERE子句中还将其检查为NULL (示例数据库中的初始值)。

如果我们现在有两个相互竞争的进程(或同一进程中的代码部分)进行此更新,如下所示:

BookRecord book1 = dsl.selectFrom(BOOK).where(BOOK.ID.eq(1)).fetchOne();
BookRecord book2 = dsl.selectFrom(BOOK).where(BOOK.ID.eq(1)).fetchOne();book1.setTitle("New Title");
book1.store();book2.setTitle("Another Title");
book2.store();

…然后,在对store()的第二次调用(缩短的堆栈跟踪)上,我们将见证DataChangedException

org.jooq.exception.DataChangedException: Database record has been changed or doesn't exist any longerat org.jooq.impl.UpdatableRecordImpl.checkIfChanged(UpdatableRecordImpl.java:420)at org.jooq.impl.UpdatableRecordImpl.storeUpdate(UpdatableRecordImpl.java:193)at org.jooq.impl.UpdatableRecordImpl.store(UpdatableRecordImpl.java:129)at org.jooq.impl.UpdatableRecordImpl.store(UpdatableRecordImpl.java:121)

乐观锁定适用于UpdatableRecord操作,包括insert()update()delete()

jOOQ支持三种乐观锁定模式:

  • 使用专用的TIMESTAMP列来跟踪修改日期
  • 使用专用的NUMBER列跟踪版本号
  • 使用价值比较。 如果没有为代码生成器配置任何时间戳或版本列,则为默认设置

翻译自: https://www.javacodegeeks.com/2015/09/perform-crud-with-active-records.html

使用活动记录执行CRUD相关推荐

  1. php 命令执行crud_使用活动记录执行CRUD

    php 命令执行crud 本文是我们学院课程" jOOQ –类型安全数据库查询"的一部分 . 在SQL和特定关系数据库很重要的Java应用程序中,jOOQ是一个不错的选择. 当JP ...

  2. spring aop实践_使用Spring AOP实现活动记录模式

    spring aop实践 在课堂设计过程中,我们应就每个班级的职责分配做出决定. 如果我们选择的不错,系统将更易于理解,维护和扩展. 我们几乎所有的项目都有一个持久层,即关系数据库,文档存储或仅XML ...

  3. 使用Spring AOP实现活动记录模式

    在班级设计中,我们应就每个班级的职责分配做出决定. 如果我们选择的不错,系统将更易于理解,维护和扩展. 几乎我们所有的项目都有一个持久层,即关系数据库,文档存储或仅XML文件. 通常,您将使用DAO模 ...

  4. vue.js crud_如何使用VS Code和ADO.NET使用ASP.NET Core执行CRUD操作

    vue.js crud 介绍 (Introduction) In this article we are going to create a web application using ASP.NET ...

  5. 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  6. 计算机兴趣班记录,计算机兴趣班活动记录.doc

    计算机兴趣班活动记录 计算机二课活动记录 周 次三应 到人 数实 到 人 数缺席者及原因活动内容创作练习:设计贺卡记录人陈美馨活 动 过 程 记 录1.启动"画图"软件:解说并演示 ...

  7. 使用SQL数据库在Python中执行CRUD操作

    目录 介绍 背景 在Visual Studio中创建一个Python项目 在SQL中创建数据库和表 为数据库创建配置文件 安装Python包 "Pypyodbc" 创建连接文件 创 ...

  8. sql crud_使用适用于SQL Server的Python SQL库执行CRUD操作

    sql crud This article covers how to connect a Python application to Microsoft SQL Server using a 3rd ...

  9. 【编译原理】活动记录

    活动与活动记录 概念: 过程的一次执行称为过程的一次活动 把过程的一个活动所需要的信息组成的一块连续的存储单元 ,称为活动记录 理解: 一个活动所需要的信息的每个数据项有相同的生存周期,因此,将它们组 ...

最新文章

  1. TCP/IP状态详解
  2. phonegap工程中修改app的名字
  3. Java 求分段函数g(x)的值
  4. 微带线特性阻抗计算公式_利用HFSS计算微带线的特性阻抗
  5. java中如何对对象排序?
  6. 牛客16500 珠心算测试
  7. HTTP header location 重定向 URL
  8. 英特尔显示器音频_骁龙865、全球最快32寸显示器、高达联名路由……这场发布会为电竞玩家带来多少高科技?...
  9. ZOJ 1094 带括号的矩阵连乘
  10. matplotlib 可视化 —— matplotlib.patches
  11. 抽象、多样性与可变性
  12. 《麦肯锡方法》读书笔记10
  13. Java多人抽奖案例
  14. 经验模态分解(EMD)
  15. MJPEG和MP4——视频转换随想
  16. 大众点评各城市热门餐厅评分字体加密信息数据采集
  17. bucket name does not follow Amazon S3 standards
  18. 读《纳瓦尔宝典》感想
  19. 2022年茶艺师(高级)考试题及模拟考试
  20. R语言开发之输出散点图

热门文章

  1. java中你知道这四种代码块吗?
  2. springboot获取多个请求参数_springboot获取URL请求参数的多种方式
  3. springboot2.5.5配置druid数据源1.2.8与jdbc
  4. java中延迟_Java中的延迟分配
  5. nosql和rdnms_用于SaaS和NoSQL的Jdbi
  6. apache camel_Apache Camel中的短重试与长重试
  7. 接口方法javadoc注释_继承Javadoc方法注释
  8. java解码_Java数组已排序解码
  9. findfirst_当心findFirst()和findAny()
  10. 可以自定义模板的ide_将IDE检查应用于自定义Java批注