使用 JOOQ,为什么要在 insertInto().values() 中使用 DSL.param()?
Using JOOQ, why would you use DSL.param() in insertInto().values()?
我是 JOOQ 的新手,正在尝试加快现有代码库的速度(不幸的是,负责此特定代码的开发人员不再与我们在一起)。
插入代码看起来像这样(简化):
public class User {
public static Table<?> table = DSL.table("user");
public static Field<String> firstName = DSL.field(DSL.name(table.getName(), "first_name"), String.class);
public static Field<String> lastName = DSL.field(DSL.name(table.getName(), "last_name"), String.class);
}
private class UserDto {
private String firstName;
private String lastName;
// getters, setters, etc.
}
public class UserWriter {
private final DefaultDSLContext dslContext;
public UserWriter(DefaultDSLContext dslContext) {
this.dslContext = dslContext;
}
public void create(UserDto user) {
dslContext.insertInto(User.table, User.firstName, User.lastName)
.values(
DSL.param(User.firstName.getName(), user.getFirstName()),
DSL.param(User.lastName.getName(), user.getLastName()),
)
.execute();
}
}
既然可以简单地使用实际值,为什么还要在 values() 中使用 DSL.param()?
dslContext.insertInto(User.table, User.firstName, User.lastName)
.values(user.getFirstName(), user.getLastName())
.execute();
这是不必要的冗长还是我遗漏了什么?
谢谢!
您的 param()
使用情况
Is this just unnecessarily verbose or am I missing something?
是的,您的情况不必要地冗长。只需使用您建议的版本即可。
在 jOOQ 的大多数情况下 API,假设的 T|Field<T>
类型总是有一个方便的重载,因此您可以在列表达式 (Field<T>
) 是可能的,绑定值将自动包装在:DSL.val(value, column)
DSL.param()
允许在有意义的地方创建命名绑定参数标记(例如,当将 SQL 字符串导出到 Spring 或其他支持命名参数的工具时)。在 jOOQ 中,命名参数几乎没有用。
另请参阅手册中有关绑定值的部分:
https://www.jooq.org/doc/latest/manual/sql-building/bind-values/
其他冗长内容
看来 param()
并不是您的代码库中唯一喜欢冗长的地方。 jOOQ 附带了一个非常强大的 source code generator,它可以为你生成 User
和 UserDto
类。
只有使用代码生成器(类型安全除外),您才能获得很多功能,例如implicit joins.
我是 JOOQ 的新手,正在尝试加快现有代码库的速度(不幸的是,负责此特定代码的开发人员不再与我们在一起)。
插入代码看起来像这样(简化):
public class User {
public static Table<?> table = DSL.table("user");
public static Field<String> firstName = DSL.field(DSL.name(table.getName(), "first_name"), String.class);
public static Field<String> lastName = DSL.field(DSL.name(table.getName(), "last_name"), String.class);
}
private class UserDto {
private String firstName;
private String lastName;
// getters, setters, etc.
}
public class UserWriter {
private final DefaultDSLContext dslContext;
public UserWriter(DefaultDSLContext dslContext) {
this.dslContext = dslContext;
}
public void create(UserDto user) {
dslContext.insertInto(User.table, User.firstName, User.lastName)
.values(
DSL.param(User.firstName.getName(), user.getFirstName()),
DSL.param(User.lastName.getName(), user.getLastName()),
)
.execute();
}
}
既然可以简单地使用实际值,为什么还要在 values() 中使用 DSL.param()?
dslContext.insertInto(User.table, User.firstName, User.lastName)
.values(user.getFirstName(), user.getLastName())
.execute();
这是不必要的冗长还是我遗漏了什么?
谢谢!
您的 param()
使用情况
Is this just unnecessarily verbose or am I missing something?
是的,您的情况不必要地冗长。只需使用您建议的版本即可。
在 jOOQ 的大多数情况下 API,假设的 T|Field<T>
类型总是有一个方便的重载,因此您可以在列表达式 (Field<T>
) 是可能的,绑定值将自动包装在:DSL.val(value, column)
DSL.param()
允许在有意义的地方创建命名绑定参数标记(例如,当将 SQL 字符串导出到 Spring 或其他支持命名参数的工具时)。在 jOOQ 中,命名参数几乎没有用。
另请参阅手册中有关绑定值的部分: https://www.jooq.org/doc/latest/manual/sql-building/bind-values/
其他冗长内容
看来 param()
并不是您的代码库中唯一喜欢冗长的地方。 jOOQ 附带了一个非常强大的 source code generator,它可以为你生成 User
和 UserDto
类。
只有使用代码生成器(类型安全除外),您才能获得很多功能,例如implicit joins.