当前位置: 首页 > 知识库问答 >
问题:

如何使用java Map在JOOQ中生成插入和更新sql查询(没有代码生成)?

司空繁
2023-03-14

我们正在开发一个应用程序,我们将在运行时生成表单。现在我们需要对动态表单的数据执行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();
    }

上述代码的问题在于:

  1. 两个列表列和值的顺序应相同,并且
  2. 值中的数据类型应与代码中的表列数据类型匹配

注意:我们不能在代码生成中使用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中找到类似的东西。

共有1个答案

宇文嘉勋
2023-03-14
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表。 我发现只有方式使用