如何在使用jOOQ生成没有Code-genreation的SQL时使用jOOQ转换器?

时间:2016-04-02 22:33:52

标签: java mysql sql jooq

我正在使用jOOQ生成mySql查询而不生成代码而不使用jooq来查询数据库。

我创建这样的查询时:

String tableName = "sample_table";        
DSLContext create = DSL.using(SQLDialect.MYSQL);
Table<Record> table = DSL.tableByName(tableName);
String sql1 = create.insertInto(table, Arrays.asList(
            DSL.fieldByName("id"),
            DSL.fieldByName("roll_no"),
            DSL.fieldByName("name"),
            DSL.fieldByName("date_enrolled"),
            DSL.fieldByName("sex")
            ))
    .values(
            "1",
            12,
            "Raman",
            new DateTime(),
            Sex.Male
           )
    .getSQL(ParamType.INLINED);

生成的查询如下所示:

insert into `sample_table` (`id`, `roll_no`, `name`, `date_enrolled`, `sex`) values ('1', 12, 'Raman', '2016-04-03T03:55:37.940+05:30', 'Male')

MySQL不接受此处生成的日期时间值。我进行了探索,发现jOOQ converter可用于自定义转化。我可以在how to use conversion while fetching data上找到示例,但无法弄清楚如何在查询时使用转换器。如何在没有代码生成的情况下使用jOOQ Convertor生成SQL?或者,如果有更好的方法可以为sql生成此查询。

1 个答案:

答案 0 :(得分:2)

(我在这个答案中假设你的DateTime类型确实是org.joda.time.DateTime

使用JDBC Timestamp代替

此处最简单的方法是手动将DateTime数据类型转换为JDBC Timestamp

new Timestamp(new DateTime().getMillis());

仅偶尔使用转换器。

使用转换器和数据类型当您不使用代码生成器时,绑定会更加繁琐。我个人会反对它。

但是,您可以通过创建包含转换器的新DataType来间接地将转换器传递给绑定变量:

// This will be your converter
class DateTimeConverter implements Converter<Timestamp, DateTime> { ... }

// This is how you create a new data type:
public static final DataType<DateTime> DATETIME = 
    SQLDataType.TIMESTAMP.asConvertedDataType(new DateTimeConverter);

现在,您可以在构建绑定变量的任何位置重用上述DATETIME数据类型,如下所示:

Field<DateTime> value = DSL.val(new DateTime(), DATETIME);

然后插入。

定期使用转换器。

比使用DSL.val()调用显式包装单个绑定值要好得多,您可以像这样声明表的各个字段:

Field<Integer> id = field(name("id"), Integer.class);
Field<Integer> rollNo = field(name("roll_no"), Integer.class);
Field<String> name = field(name("name"), String.class);
Field<DateTime> dateEnrolled = field(name("date_enrolled"), DATETIME);
Field<Object> sex = field(name("sex")); // Don't know what this type is in your code

现在,您可以使用上述字段使用转换器插入数据:

create.insertInto(table, 
          id, rollNo, name, dateEnrolled, sex)
      .values(
          "1",
          12,
          "Raman",
          new DateTime(),
          Sex.Male)
      .getSQL(ParamType.INLINED);

正如您所看到的,经过一段时间的这样做,您将通过使用代码生成器来节省大量时间......