所以我正在开发一个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查询?
答案 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 );
}
现在,您可以执行该语句并获取结果集。