在MYSQL查询中传递空/非空变量(使用Java)

在MYSQL查询中传递空/非空变量(使用Java),java,mysql,sql,Java,Mysql,Sql,所以我正在用Java编写一个小程序。基本上,我希望用户搜索一个数据库与一个或1-3搜索查询,他们可以使用任何组合 一个搜索查询示例是:书名、ISBN、作者姓名 用户可以使用任意组合进行搜索(仅按书名搜索,或按书名和作者姓名搜索,或按全部3种搜索等等) 我想基本上编写一个主SQL语句(MYSQL),它将从数据库中提取结果问题是,我不知道如何处理空白输入 假设用户输入: 书名=哈利波特与密室 ISBN=> 作者姓名=JK罗琳 SQL查询示例如下: SELECT * FROM booklist W

所以我正在用Java编写一个小程序。基本上,我希望用户搜索一个数据库与一个或1-3搜索查询,他们可以使用任何组合

一个搜索查询示例是:书名、ISBN、作者姓名

用户可以使用任意组合进行搜索(仅按书名搜索,或按书名和作者姓名搜索,或按全部3种搜索等等)

我想基本上编写一个主SQL语句(MYSQL),它将从数据库中提取结果问题是,我不知道如何处理空白输入

假设用户输入:

  • 书名=哈利波特与密室

  • ISBN=>

  • 作者姓名=JK罗琳

SQL查询示例如下:

SELECT *
FROM booklist
WHERE book_name = "Harry Potter and the Chamber of Secrets"
AND ISBN = ""
AND Author = "JK Rowling"; 
String temp =  " SELECT * " + 
               " FROM booklist " + 
               " WHERE Title = " + title + 
               " AND Author = \"" + author + "\"" + 
               " AND ISBN = \"" + isbn + "\""; 
在Java代码中,我使用的是PreparedStatement,字符串是:

SELECT *
FROM booklist
WHERE book_name = "Harry Potter and the Chamber of Secrets"
AND ISBN = ""
AND Author = "JK Rowling"; 
String temp =  " SELECT * " + 
               " FROM booklist " + 
               " WHERE Title = " + title + 
               " AND Author = \"" + author + "\"" + 
               " AND ISBN = \"" + isbn + "\""; 
由于用户没有输入ISBN,SQL查询失败(因此代码失败)。如果我使用null而不是,那么查询仍然会失败

By fail意味着它在数据库中找不到正确的图书(即使它存在),因为它仍在列中查找“”或null

有没有什么方法可以像传递“ghost”或不可见变量一样传递SQL查询,使其按照我的预期工作


或者我必须走很长的路,对每个可能的组合进行SQL查询吗?

使用
而不是

更改

String temp =  " SELECT * " + 
               " FROM booklist " + 
               " WHERE Title = " + title + 
               " AND Author = \"" + author + "\"" + 
               " AND ISBN = \"" + isbn + "\""; 
String temp =  " SELECT * FROM booklist " + 
               " WHERE Title = ? OR Author = ?" + 
               " OR ISBN = ?"; 

String temp =  " SELECT * " + 
               " FROM booklist " + 
               " WHERE Title = " + title + 
               " AND Author = \"" + author + "\"" + 
               " AND ISBN = \"" + isbn + "\""; 
String temp =  " SELECT * FROM booklist " + 
               " WHERE Title = ? OR Author = ?" + 
               " OR ISBN = ?"; 
然后为prepared语句设置参数

pst.setString( 1, title );  
pst.setString( 2, author );
pst.setString( 3, isbn );
int paramIndex = 1;

if( title != null && title.trim().length() > 0 ) {
    pst.setString( paramIndex++, title );  
}
if( isbn != null && isbn.trim().length() > 0 ) {
    pst.setString( paramIndex++, isbn );  
}
if( author != null && author.trim().length() > 0 ) {
    pst.setString( paramIndex++, author );  
}
使用
,如果找到任何匹配的记录,则会提取它们

而且,如果您仍然希望使用
进行比较,并且不希望包含空输入,那么您必须在
JAVA
中动态准备语句

StringBuilder sql = new StringBuilder( 1024 );
sql.append( " SELECT * FROM booklist " );
String whereCondition = "";
if( title != null && title.trim().length() > 0 ) {
    whereCondition += " title = ?";
}
if( isbn != null && isbn.trim().length() > 0 ) {
    whereCondition += (whereCondition.length() > 0 ? " AND " : "" );
    whereCondition += " isbn = ?";
}
if( author != null && author.trim().length() > 0 ) {
    whereCondition += (whereCondition.length() > 0 ? " AND " : "" );
    whereCondition += " author = ?";
}

sql.append( " where " ).append( whereCondition );
pst = con.prepareStatement( sql.toString() );
现在按如下方式设置准备好的参数:
然后为prepared语句设置参数

pst.setString( 1, title );  
pst.setString( 2, author );
pst.setString( 3, isbn );
int paramIndex = 1;

if( title != null && title.trim().length() > 0 ) {
    pst.setString( paramIndex++, title );  
}
if( isbn != null && isbn.trim().length() > 0 ) {
    pst.setString( paramIndex++, isbn );  
}
if( author != null && author.trim().length() > 0 ) {
    pst.setString( paramIndex++, author );  
}

现在,您可以执行语句并获取结果集。

您需要动态构建
WHERE
子句,不包括用户保留为空的列。谢谢,这太棒了!我完全理解你在做什么。我唯一的问题是我不明白你的最后一段代码,你对准备好的语句做了什么?执行pst.setString(paramIndex++,title)的目的是什么?@user1861967:使用
PreparedStatement
,我们可以设置查询参数值。它在内部转义值中不允许的任何特殊字符,除非转义。它还可以防止SQL注入。除非您
设置…
值,否则它们不会传递到数据库,执行将通过
SQLException