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