使用带有查询中可能存在或不存在的参数的java进行sql查询。
例如,http请求参数为:
在jsp中,我做了类似的事情。
if (request.getParameter("query") != null) {
query = request.getParameter("query");
}
if (request.getParameter("start") != null) {
start = Integer.parseInt(request.getParameter("start"));
}
if (request.getParameter("limit") != null) {
limit = Integer.parseInt(request.getParameter("limit"));
}
....
if (query != null) {
sql += " AND dbo.TABLENAME.namelike '%?%'";
}
if (start != null) {
sql += " AND RowNum >= ?";
}
if (limit != null) {
sql += " AND RowNum <= ?";
if (start == null)
start =0;
}
使用PreparedStatement有什么简单的方法吗?或者有更干净的方法来做到这一点。如果我没有弄错,必须首先在预准备语句中指定SQL字符串,而不是后者。
答案 0 :(得分:1)
在您的特定情况下,您应该可以执行以下操作
sql += "AND dbo.TABLENAME.namelike '%?%' AND RowNum >= ? AND RowNum <= ?";
如果没有启动,则可以将RowNum设置为0,如果没有结束,则可以将RowNum设置为Integer.MAX_INTEGER。此外,如果没有传入任何查询,那么无论如何它都将返回所有内容。
这样效率很低,所以你可以使用CASE语句来提高效率。
答案 1 :(得分:0)
尝试使用SQL标记。 JSTL提供此sql标记,因为您只能使用JSP。 它是Java EE标准的一部分。
它比在jsp中编写java代码更清晰,更容易。
这是链接。 http://download.oracle.com/javaee/1.4/tutorial/doc/JSTL7.html
希望它有所帮助!
答案 2 :(得分:0)
为了在没有框架帮助的情况下使其更清晰,您可以在您的示例中外化单独的查询,使用和不使用分页参数,并将它们放在属性文件中,例如queries.properties:
query.paging=SELECT * FROM dbo.TABLENAME WHERE namelike ? AND RowNum >= ? AND RowNum <= ?
query.nopaging=SELECT * FROM dbo.TABLENAME WHERE namelike ?
然后在您的代码中区分用例并访问相应的查询:
ResourceBundle queries = ResourceBundle.getBundle("queries");
String nameLike = request.getParameter("nameLike");
String startRow= request.getParameter("startRow");
String endRow= request.getParameter("endRow");
if (nameLike == null) {
nameLike = ""; // or you could report an error here
}
Connection connection = ...get a JDBC Conection...
PreparedStatement st;
if (startRow != null && endRow != null) {
st = connection.prepareStatement(queries.get("query.paging"));
st.setString(1, nameLike);
st.setString(2, startRow);
st.setString(3, endRow);
}
else {
st = connection.prepareStatement(queries.get("query.nopaging"));
st.setString(1, nameLike);
}
使用PreparedStatement可以避免SQL注入攻击的安全风险。