【问题标题】:Binding NULL in JAVA for MySQL PreparedStatment?在 JAVA 中为 MySQL PreparedStatment 绑定 NULL?
【发布时间】:2012-08-11 06:53:06
【问题描述】:

MySQL 使用“IS NULL”而不是“NULL”,那么我如何绑定变量来实现相同的效果?

现在我尝试了这个

selectStmt.setNull( 2, java.sql.Types.VARCHAR );

当我打印“java.sql.Types.VARCHAR”时显示值 = 12?如果是这样,如何在preparedstatment中设置“IS NULL”?

更多详情:

即,如果我在输入中有 string = "",我有兴趣在 (MySQL) 中查询 null。所以逻辑是这样的,

Connection c = SQLCon.connect();
PreparedStatement selectStmt = c.prepareStatement( "select * from "
                                    + TableName
                                    + " where P = ? AND M = ? AND PR = ? AND DR = ? " );


if ( P.trim().equals( "" ) ) 
{
   selectStmt.setNull( 1, java.sql.Types.VARCHAR );
} else 
{
   selectStmt.setString( 1, P );
}

if ( M.trim().equals( "" ) ) 
{
   selectStmt.setNull( 2, java.sql.Types.VARCHAR );
} else 
{
   selectStmt.setString( 2, M );
}

请指教

【问题讨论】:

  • 如果第二个绑定变量是 VARCHAR 列,这确实是您将第二个绑定变量设置为 null 的方式。你有什么问题?
  • @PaulTomblin :它是 varchar 列,但查询没有获取我需要的结果。
  • 不要使用空字符串作为 null。为空值使用空值。它们是两种完全不同的动物。

标签: java mysql data-binding prepared-statement


【解决方案1】:

这是一个 xml 输入,在 UI 上,用户看到 NULL 为空白,因此将空白作为输入发送

if ( P.trim().equals( "" ) )
  {
    sql += "P IS NULL";
  }
   else
  {
    sql += "P = ?";
  }

PreparedStatement selectStmt = c.prepareStatement( sql );

int i = 1;
// used to prevent index out of range issues

// Binding values for non-null strings ONLY
 if ( !(P.trim().equals( "" )) )
  {
    selectStmt.setString( i, P );
  i++;
  }

【讨论】:

    【解决方案2】:

    如果您想将 where 子句中可能为 null 的列与可能为 null 的参数匹配,您实际上需要将其绑定两次,因为在 SQL 中,null 不等于其他任何内容,甚至是另一个 null。

    PreparedStatement stmt = conn.prepareStatement("select * from foo where (? is null and bar is null) or (bar = ?)");
    col = 1;
    setVarchar(stmt, col++, var);
    setVarchar(stmt, col++, var);
    
    void setVarchar(PreparedStatement stmt, int col, String var)
    {
      if (var == null)
        stmt.setNull(col, java.sql.Types.VARCHAR);
      else
        stmt.setString(col, var);
    }
    

    【讨论】:

    • 你也可以使用 WHERE IFNULL(?,-1)=IFNULL(bar,-1)。将 -1 替换为不应出现在数据或绑定变量中的合适值。
    【解决方案3】:

    这看起来很奇怪,但你确实这样做了:

    if (variable == null) {
      selectStmt.setNull(2, java.sql.Types.VARCHAR);
    } else {
      ...
    }
    

    这背后的原因是因为NULL 是数据库中的一个值,而在Java 中没有值是null。有时,您需要区分从数据库中取回 NULL 与从数据库中取回任何内容。

    【讨论】:

    • 然后检查基础知识。也许你有错误的java.sql.Types.*** 数据类型,你已经断开或丢失了你的数据库连接,你没有一个带有两个参数的selectStmt,或者你没有创建一个selectStmt。相信我,“setNull”是在数据库中存储“NULL”的正确方法,而在 java 端 variable == null 是检查变量是否没有引用的正确方法。
    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多