如何在 JDBC PreparedStatement 中设置公式

Posted

技术标签:

【中文标题】如何在 JDBC PreparedStatement 中设置公式【英文标题】:How to set a formula in a JDBC PreparedStatement 【发布时间】:2011-06-27 14:29:53 【问题描述】:

我有一个 PreparedStatement,我用它来插入一堆包含大量列数据的行。但是,对于其中一列(时间戳),如果值为 null,我希望它在服务器上执行 getDate()

我知道我可以只做 new Date() 但这并不真正奏效,因为由于遗留报告,它需要完全匹配具有自动插入值的另一列。

假设我无法更改架构并向列添加默认值。

有什么方法可以将公式设置为 PreparedStatement 中的参数?

编辑添加: 目前基本上是这样的:

PreparedStatement statement = connection.prepareStatement("insert into row (name, starttime) values (?, ?)")
statement.setString(1, name);
statement.setDate(2, date);

我想要的是,类似:

PreparedStatement statement = connection.prepareStatement("insert into row (name, starttime) values (?, ?)")
statement.setString(1, name);
if(date != null)
  statement.setDate(2, date);
else
  statement.setFormula(2, "getdate()");

我明白:

if(date == null)
  date = new Date();

本质上是一样的,但在我们的例子中,它真的不是。

【问题讨论】:

您能详细说明一下吗?我对手头的实际问题感到困惑。你提到了什么样的公式,它作为preparedStatement的一部分有什么好处? @Peaches491 编辑以获得更好的信息 【参考方案1】:

简单地准备表格的陈述是否有效

insert into row(name, starttime)
   values(?, coalesce(?, getdate())

?然后设置一个空的第二个参数应该会导致一个 getdate() 调用?

【讨论】:

@reverend-gonzo @araqnid 我用了你的逻辑 conn.prepareStatement("INSERT INTO TableA (colA) VALUES(IFNULL(?, 1))") 但这失败了,但有异常 org.hsqldb.HsqlException: incompatible data type in operation 你能建议吗?谢谢【参考方案2】:

我能想到的唯一选择是,因为您无法更改架构,所以有 2 个准备好的语句,一个在查询中使用默认的 getdate(),另一个带有参数。然后您可以简单地执行以下操作:

PreparedStatement ps = (date == null) ? prepareWithDefault : prepareWithoutDefault;

// Set all variables //

if (date != null) 
  ps.setDate(date);


ps.execute();

【讨论】:

是的......我认为这确实是解决这个问题的唯一方法......这很糟糕,因为我已经抽象出了 sql

以上是关于如何在 JDBC PreparedStatement 中设置公式的主要内容,如果未能解决你的问题,请参考以下文章

Java JDBC高级特性

mybatis入门_mybatis基本原理以及入门程序

2020-2-24

PreparedStatement和Statement

mybatis 查询 orderby

数据库工具类(我老师写的 感觉很好用)