【问题标题】:JavaDB anonymous column nameJavaDB 匿名列名
【发布时间】:2013-07-16 13:38:38
【问题描述】:

我正在尝试创建一个像这样的通用UPDATE-statement,其中只有表名是固定的。

updateValueQuery = conn.prepareStatement("UPDATE TABLENAME SET (?)=(?)");

这失败了,SQLException 抱怨语法。只要我像这样指定列名:

updateValueQuery = conn.prepareStatement("UPDATE TABLENAME SET COL_NAME=(?)");

SQL 愉快地编译。有没有办法让列名也匿名?

我正在使用 Apache derby。

【问题讨论】:

  • 仅通过将其构建为字符串并将其传递给 prepareStatment 方法(其中包含所有 SQL 注入问题)
  • 差不多prepareStatement("?");你自己的模板也是如此,w.r.t.列名:String.format("UPDATE TABLENAME SET %s=?", "COL_NAME")
  • 是的,我就是这样解决的。我希望有一种更清洁的方法,但显然没有:(

标签: sql database prepared-statement derby javadb


【解决方案1】:

不,PreparedStatement 只有值的持有者。 我通过以下方式解决了类似的问题:

    private final String FIND_STRING = "select * from TABLENANE where {0} = ?";
       .
       .
       .
    private final Map<String, PreparedStatement> statements = new HashMap<String, PreparedStatement>();

    private PreparedStatement prepareStatement(String field, String toFind) throws SQLException{
       PreparedStatement statement = null;
       if (statements.contains(field)){
          statement = statements.get(field);
       }else{
          String findInHelpDefinition = MessageFormat.format(FIND_STRING, field));
          statement = connection.prepareStatement(findInHelpDefinition);
          statemnts.put(field, statement);
       }
       statement.setString(1, toFind);
       return statement;
    }

【讨论】:

  • 谢谢,看起来很有希望!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 2017-01-17
  • 2011-03-13
  • 2011-04-12
相关资源
最近更新 更多