jooq 事务
jOOQ是一个库,可帮助我们重新控制SQL。 它可以从我们的数据库生成代码,并允许我们使用其流畅的API来构建类型安全的数据库查询。
本教程的前面部分教我们如何配置示例应用程序的应用程序上下文以及如何从数据库中生成代码。
现在,我们准备迈出第一步,学习如何使用jOOQ创建类型安全查询。 这篇博客文章描述了如何将CRUD操作添加到管理待办事项的简单应用程序中。
让我们开始吧。
补充阅读:
- 将jOOQ与Spring结合使用:配置是本教程的第一部分,它描述了您可以配置使用jOOQ的Spring应用程序的应用程序上下文。 您无需阅读本教程的第一部分就可以了解此博客文章,但是,如果您想在基于Spring的应用程序中真正使用jOOQ,建议您也阅读本教程的第一部分。
- 将jOOQ与Spring结合使用:代码生成是本教程的第二部分,它描述了如何对数据库进行反向工程并创建代表不同数据库表,记录等的jOOQ查询类。 因为这些类是类型安全SQL查询的构建块,所以建议您在阅读本博客文章之前阅读本教程的第二部分。
创建Todo类
让我们从创建一个包含单个待办事项条目信息的类开始。 此类具有以下字段:
- ID字段包含待办事项的ID。
- creationTime字段包含一个时间戳,该时间戳描述了待办事项条目第一次被持久保存的时间。
- 描述字段包含待办事项的描述。
- ModifyTime字段包含一个时间戳,该时间戳描述了待办事项条目的更新时间。
- 标题字段包含待办事项的标题。
这个相对简单的类的名称是Todo ,它遵循以下三个原则:
- 我们可以使用Joshua Bloch在Effective Java中描述的构建器模式来创建新的Todo对象。 如果您不熟悉这种模式,则应该阅读标题为项目2的文章:面对许多构造函数参数时,请考虑使用构建器。
- 标题字段是必填字段,我们不能创建标题为空或为空的新Todo对象。 如果尝试创建标题无效的Todo对象,则会抛出IllegalStateException 。
- 此类是不可变的。 换句话说,其所有字段都声明为final 。
Todo类的源代码如下所示:
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.joda.time.LocalDateTime;
import java.sql.Timestamp;
public class Todo {
private final Long id;
private final LocalDateTime creationTime;
private final String description;
private final LocalDateTime modificationTime;
private final String title;
private Todo(Builder builder) {
this.id = builder.id;
LocalDateTime creationTime = null;
if (builder.creationTime != null) {
creationTime = new LocalDateTime(builder.creationTime);
}
this.creationTime = creationTime;
this.description = builder.description;
LocalDateTime modificationTime = null;
if (builder.modificationTime != null) {
modificationTime = new LocalDateTime(builder.modificationTime);
}
this.modificationTime = modificationTime;
this.title = builder.title;
}
public static Builder getBuilder(String title) {
return new Builder(title);
}
//Getters are omitted for the sake of clarity.
public static class Builder {
private Long id;
private Timestamp creationTime;
private String description;
private Timestamp modificationTime;
private String title;
public Builder(String title) {
this.title = title;
}
public Builder description(String description) {
this.description = description;
return this;
}
public Builder creationTime(Timestamp creationTime) {
this.creationTime = creationTime;
return this;
}
public Builder id(Long id) {
this.id = id;
return this;
}
public Builder modificationTime(Timestamp modificationTime) {
this.modificationTime = modificationTime;
return this;
}
public Todo build() {
Todo created = new Todo(this);
String title = created.getTitle();
if (title == null || title.length() == 0) {
throw new IllegalStateException("title cannot be null or empty");
}
return created;
}
}
}
让我们找出为什么我们需要获取当前日期和时间,更重要的是,什么是最好的方法。
获取当前日期和时间
因为每个待办事项的创建时间和修改时间都存储在数据库中,所以我们需要一种获取当前日期和时间的方法。 当然,我们可以简单地在存储库中创建此信息。 问题在于,如果这样做,我们将无法编写自动测试来确保正确设置了创建时间和修改时间(我们无法为这些字段编写断言,因为它们的值取决于当前时间) 。
这就是为什么我们需要创建一个单独的组件来负责返回当前日期和时间的原因。 DateTimeService接口声明了以下两种方法:
- getCurrentDateTime()方法将当前日期和时间作为LocalDateTime对象返回。
- getCurrentTimestamp()方法将当前日期和时间作为Timestamp对象返回。
DateTimeService接口的源代码如下所示:
import org.joda.time.LocalDateTime;
import java.sql.Timestamp;
public interface DateTimeService {
public LocalDateTime getCurrentDateTime();