Java SQL查询prepare语句动态参数

时间:2011-08-22 08:25:19

标签: java sql sql-server

使用带有查询中可能存在或不存在的参数的java进行sql查询。

例如,http请求参数为:

  1. 名称
  2. 启动
  3. 限制
  4. 在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字符串,而不是后者。

3 个答案:

答案 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注入攻击的安全风险。