在MYSQL查询中传递空白/非空VARIABLE(使用Java)

时间:2014-04-08 01:16:18

标签: java mysql sql

所以我正在开发一个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"; 

在Java代码中我使用 PreparedStatement ,字符串将是:

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

由于用户未输入ISBN,因此SQL查询失败(因此代码失败)。如果我使用 null 而不是"" ,则查询仍会失败。

失败意味着它无法在数据库中找到正确的书籍(即使它存在),因为它仍在寻找""或列中的null。

有没有什么方法可以通过像鬼一样的#39;或隐形变量,以使SQL查询像我打算一样工作?

或者我是否需要做很长的事情并为每种可能的组合进行SQL查询?

1 个答案:

答案 0 :(得分:1)

使用OR代替AND

更改

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 = ?"; 

然后设置准备语句的参数。

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

如果找到任何匹配的记录,则使用OR,然后获取它们。

并且,如果您仍想使用AND进行比较并且不想包含空输入,则必须在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() );

现在设置准备好的参数如下:
然后设置准备语句的参数。

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

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