我们正在开发一个应用程序,我们将在运行时生成表单。现在我们需要对动态表单的数据执行CRUD操作。
我们想通过写入将记录保存到表中
Map<String, String> map = new TreeMap<>();
map.put("name","User Name");
map.put("dob", "30-3-1995");
map.put("address", "Address Line");
map.put("city", "Jaipur");
/* insert into user table */
db.insert("user",map); // SAME AS JPA
javaSpring引导提供查询生成器像php CodeIgniter查询生成器
我正在尝试使用JOOQ来实现同样的目标。
@Override
public void testingJooq(){
Field<String> username = field("username", String.class, "harigyan2");
// How bindings bind the value to the Field?
Field<String> password = field("password", String.class, "abcd");
Field<String> email = field("email", String.class, "hg2@server.com");
Field<Boolean> enabled = field("enabled", Boolean.TYPE, true);
// list of columns to insert
List<? extends Field<? extends Serializable>> columns = Arrays.asList(username, password, email, enabled);
// list of corresponding values as columns
List<? extends Field<? extends Serializable>> values = Arrays.asList(field("harigyan2", String.class), field("pwdhere", String.class), field("harigyan@server.com", String.class), field("1", Boolean.TYPE));
this.create.insertInto(table("user"), columns)
.values(values).getSQL();
}
上述代码的问题在于:
注意:我们不能在代码生成中使用JOOQ,因为所有表单都是动态的,没有任何对应的Java类(实体类)。
Map<String, Object> map = new TreeMap<>();
map.put("name","User Name");
map.put("dob", "30-3-1995");
map.put("address", "Address Line");
map.put("city", "Jaipur");
/* insert into user table */
this.create.insertInto(table('user')).values(map).execute();
如果上面的JOOQINSERT语句从映射中找到字段名(映射键名为列名)和值,这将非常有用
我们在一个项目中使用了PHPCodeIgniter来构建sql查询PHPCodeIgniter查询生成器,所以我们也尝试在java中找到类似的东西。
Field<String> username = field("username", String.class, "harigyan2");
这不是你想的那样。您使用的是普通SQL模板。但是没有绑定参数标记(?
),所以您的绑定值"harigyan2"
是多余的。取而代之的是,删除要执行此操作的值:
Field<String> username = field("username", String.class);
或者,如果不需要,请避免使用普通SQL模板,例如,通过编写:
Field<String> username = field(name("username"), String.class);
另见:https://blog.jooq.org/2020/04/03/whats-a-string-in-the-jooq-api
别这样!
Arrays.asList(
field("harigyan2", String.class),
field("pwdhere", String.class),
field("harigyan@server.com", String.class),
field("1", Boolean.TYPE)
);
您再次使用普通SQL模板,这意味着您的字符串将逐字包含在您的SQL语句中。这导致语法错误和SQL注入。通过使用DSL. val()
包装值来使用绑定值
Arrays.asList(
val("harigyan2", String.class),
val("pwdhere", String.class),
val("harigyan@server.com", String.class),
val("1", Boolean.TYPE)
);
或者,重新使用以前定义的字段引用中的类型信息:
Arrays.asList(
val("harigyan2", username),
val("pwdhere", password),
val("harigyan@server.com", email),
val("1", enabled)
);
你可以!如果你有一张地图
create.insertInto(table("user")).set(map).execute();
我一直在使用Jooq生成的代码模式进行如下查询: 它与RecordMapperProvider一起根据表和模型类确定使用哪个RecordMapper: 这是我试图实现的一个例子: 新的查询包含了该组件,并且它正在改变传递给RecordMapperProvider的RecordType。这个新的RecordType不再与生成的代码匹配。 我的问题是:是否有一种解决方案,可以在查询中使用distinc
我更改了数据库中的一些表,所以我想生成记录、键、类等。但是每次我这样做时,它总是跳过jooq代码生成。 [INFO]--jooq-codegen-maven:3.11.10:generate(默认cli)@http网关--[INFO]跳过jooq代码生成 为了运行Jooq代码生成,我应该执行哪个mvn cmd?现在我使用: 谢谢
我试图使用JOOQ连接到HSQLDB,但我失败了,这里是错误消息: 此查询也会在HSQLDB Manager上失败(与JOOQ代码生成器的错误相同): 此查询工作正常: 我认为问题出在“cc”限定符上(在查询返回的“CONSTRAINT_NAME”字段上),这是HSQLDB错误吗? 我正在使用: HSQLDB 2.3.1 JOOQ 3.2.3 谢谢Ciccio
我正在使用Jooq和GradleJooq插件生成代码。它工作得很好,但在添加表或删除列时,我在更新生成的代码时遇到了一个问题。我可以通过更改“packageName”配置参数来强制更新,并构建一个新的包。通过返回原始名称,代码按预期进行了更新。 在使用我的设置更改模式后,重新生成代码的正确方法是什么? 我正在使用https://github.com/etiennestuder/gradle-joo
我有一个Springboot项目,它使用Liquibase进行数据库迁移,使用Jooq进行数据库访问和相关的代码生成。当Jooq反省一个应用了所有更改的数据库时,这很好,但是现在我想转换到内存中的H2数据库来生成代码,这样Jooq就不依赖于我的实际(Postgres)数据库。 但是当使用Jooq生成源时,我现在得到一个错误,因为我有一个唯一约束的列上有一个重复的键异常。我注意到这是因为我使用Liq
我是新来的Laravel。我正在寻找一种方法来插入一个值到特定的字段,如自动每当行插入到DB表。 我发现只有方式使用