Java SQL查询准备语句动态参数

Java SQL查询准备语句动态参数,java,sql,sql-server,Java,Sql,Sql Server,我正在使用java进行sql查询,其中的参数可能存在于查询中,也可能不存在于查询中 例如,有一个http请求参数: 名字 开始 极限 在jsp中,我做了类似的事情 if (request.getParameter("query") != null) { query = request.getParameter("query"); } if (request.getParameter("start") != null) { start = Integer.parseIn

我正在使用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;
    }
    
    if(request.getParameter(“查询”)!=null){
    query=request.getParameter(“查询”);
    }
    if(request.getParameter(“start”)!=null){
    start=Integer.parseInt(request.getParameter(“start”);
    }
    if(request.getParameter(“limit”)!=null){
    limit=Integer.parseInt(request.getParameter(“limit”);
    }
    ....
    if(查询!=null){
    sql+=”和dbo.TABLENAME.namelike“%?%”;
    }
    如果(开始!=null){
    sql+=“和RowNum>=?”;
    }
    如果(限制!=null){
    
    sql+=”和RowNum在您的特定场景中,您应该可以执行以下操作

    sql += "AND dbo.TABLENAME.namelike '%?%' AND RowNum >= ? AND RowNum <= ?";
    

    sql+=”和dbo.TABLENAME.namelike“?%”和RowNum>=?和RowNum尝试使用sql标记。JSTL提供此sql标记,因为您只能使用JSP。
    它是JavaEE标准的一部分

    它比在jsp中编写java代码更简洁、更容易

    这里是链接。


    希望有帮助!

    如果不借助框架,您可以将单独的查询外部化,在您的示例中,使用分页参数和不使用分页参数,并将它们放在属性文件中,例如querys.properties:

    query.paging=SELECT * FROM dbo.TABLENAME WHERE namelike ? AND RowNum >= ? AND RowNum <= ?
    query.nopaging=SELECT * FROM dbo.TABLENAME WHERE namelike ?
    

    使用PravaReScript避免SQL注入攻击的安全风险。

    你会考虑使用iBATIS或Hibernate吗?就是这样,这个项目不应该使用ORM,只是JSP。这不是我的电话,我知道这是疯狂的。Codemwnci的回答是不够的,你需要考虑很多。特别是照顾特殊的字符。是的,我明白,我真的很想使用ORM,但我们的客户端不接受。你不能像“%”?%%“
    那样使用
    。你必须像“
    那样使用
    ”,并将
    %
    字符放在绑定字符串参数的周围。如果有另一个参数,那么该查询看起来像
    sql+=“和dbo.TABLENAME.name类似“%”?%%和gender='F'和RowNum>=?以及RowNum上述语句工作的唯一原因是,您使用的元素可以模拟不存在的元素(通过使用最大值和最小值或空值)。如果您想在不存在性别的情况下默认性别,那么这很好,因为您可以默认,但是如果您想忽略性别,如果不传入性别,则必须使用LIKE语句,这将使其效率越来越低
    
    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);
    }