在JAVA中为MySQL PreparedStation绑定NULL?

在JAVA中为MySQL PreparedStation绑定NULL?,java,mysql,data-binding,prepared-statement,Java,Mysql,Data Binding,Prepared Statement,MySQL使用的是NULL而不是NULL,那么如何绑定变量以实现相同的效果呢 现在我试着用这个 selectStmt.setNull( 2, java.sql.Types.VARCHAR ); 打印java.sql.Types.VARCHAR时显示值=12?如果是这样的话,在preparedstatment中该集合如何为NULL 更多详情: i、 如果输入中有string=的话,我对查询MySQL中的null感兴趣。所以逻辑是这样的 Connection c = SQLCon.connect(

MySQL使用的是NULL而不是NULL,那么如何绑定变量以实现相同的效果呢

现在我试着用这个

selectStmt.setNull( 2, java.sql.Types.VARCHAR );
打印java.sql.Types.VARCHAR时显示值=12?如果是这样的话,在preparedstatment中该集合如何为NULL

更多详情:

i、 如果输入中有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 );
}

请告诉我这似乎很奇怪,但你确实:

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

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

这似乎有些奇怪,但您确实做到了:

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

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

如果要将where子句中可能为NULL的列与可能为NULL的参数相匹配,实际上需要将其绑定两次,因为在SQL中,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子句中可能为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);
}

这是一个xml输入,用户在UI上看到blank表示NULL,因此发送blank作为输入

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++;
  }

这是一个xml输入,用户在UI上看到blank表示NULL,因此发送blank作为输入

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++;
  }

如果第二个绑定变量是VARCHAR列,那么实际上就是这样将其设置为null的。你的问题是什么?@PaulTomblin:这是varchar列,但query没有获取我需要的结果。不要使用空字符串表示null。使用null表示null。它们是两种完全不同的动物。如果第二个绑定变量是VARCHAR列,那么实际上就是这样将其设置为null的。你的问题是什么?@PaulTomblin:这是varchar列,但query没有获取我需要的结果。不要使用空字符串表示null。使用null表示null。它们是两种完全不同的动物。然后检查基本情况。可能您使用了错误的java.sql.Types.**datatype,您已断开或丢失了数据库连接,您没有具有两个参数的selectStmt,或者您没有创建selectStmt。相信我,setNull是在数据库中存储NULL的正确方法,在java端,变量==NULL是检查变量是否没有引用的正确方法。可能您使用了错误的java.sql.Types.**datatype,您已断开或丢失了数据库连接,您没有具有两个参数的selectStmt,或者您没有创建selectStmt。相信我,setNull是在数据库中存储NULL的正确方法,而在java端,变量==NULL是检查变量是否没有引用的正确方法。您还可以使用WHERE-IFNULL?,-1=IFNULLbar,-1。用数据或绑定变量中不应出现的适当值替换-1。还可以使用WHERE-IFNULL?,-1=IFNULLbar,-1。将-1替换为数据或bind变量中不应出现的适当值。