如何在java中传递多个参数到PreparedStatement?

问题描述 投票:0回答:1

我使用下面的代码从db2中检索订单数据,当我只传递BranchNumber并使用getWildcards()函数时,它工作得很好,因为有时我传递多个分支号。

public List<Order> getallorders(List<Branch> BranchNumber) throws SQLException {
        List<Order> orders = new ArrayList<Order>();        
        try {               
            StringBuilder sb = new StringBuilder();
            sb.append("SELECT ORDER_NUMBER as ordernumber,SERVICE_TYPE as service"
                    + "FROM ORDER WHERE "
                    + "BRANCH IN(");            
            sb.append(getWildCards(BranchNumber.size())).append(")").append(" WITH UR");
            String query = sb.toString();
            PreparedStatement statement = connection.prepareStatement(query);           
            for(int i=0 ; i<BranchNumber.size() ;i++)
            {
            statement.setInt(i+1,BranchNumber.get(i).getBranch()); 
            }
            ResultSet resultSet  = statement.executeQuery();
            {
            while (resultSet .next()) {
                Order order1 = new Order();
                order1.setOrdernumber(resultSet.getInt("ordernumber")); 
                orders.add(order1);                
            }            
            }            
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        return orders;
}


    private String getWildCards(int size) {
        // TODO Auto-generated method stub
        StringBuilder sb = new StringBuilder();
        for(int i =0 ; i<size ; i++)

        {
             sb = (i == 0) ? sb.append("?") 
                     : sb.append(",").append("?");

        }
        return sb.toString();
    }

现在,我需要在函数中传递startDate和endDate来检索数据,但preparestatement没有用传递的值来格式化select查询。

public List<Order> getallorders(List<Branch> BranchNumber,String startDate,String endDate) throws SQLException {
        List<Order> orders = new ArrayList<Order>();        
        try {               
            StringBuilder sb = new StringBuilder();
            sb.append("SELECT ORDER_NUMBER as ordernumber,SERVICE as service"
                    + "FROM ORDER WHERE "
                    + "BRANCH IN(");            
            sb.append(getWildCards(BranchNumber.size())).append(")");
            sb.append("AND ORDERDATE BETWEEN ? and ?  WITH UR");
            String query = sb.toString();
            PreparedStatement statement = 
 connection.prepareStatement(query);            
            for(int i=0 ; i<BranchNumber.size() ;i++)
            {
            statement.setInt(i+1,BranchNumber.get(i).getBranch()); 
            }
            ResultSet resultSet  = statement.executeQuery();
            {
            while (resultSet .next()) {
                Order order1 = new Order();
                order1.setOrdernumber(resultSet.getInt("ordernumber")); 
                orders.add(order1);                
            }            
            }            
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        return orders;
}

谁能给我解释一下,我在这里做错了什么,我怎么能得到预期的preparestatement,下面是格式化的查询在我的日志和错误信息记录。

SELECT ORDER_NUMBER as ordernumber,SERVICE_TYPE as service FROM .ORDER WHERE 
BRANCH_NUMBER IN(?) + AND ORDERDATE BETWEEN ? AND ? WITH UR

com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, 
SQLSTATE=42601, SQLERRMC=ORDER DATE BETWEEN ? AND;H_NUMBER IN(?) + AND;
<order_siblings_by>, DRIVER=3.63.75
at com.ibm.db2.jcc.am.fd.a(fd.java:679)
java prepared-statement
1个回答
3
投票

每个 ?PrepareStatement 应该被分配一个值。下面是一个例子,采用的是 此处 :

   String updateString =
        "update " + dbName + ".COFFEES " +
        "set SALES = ? where COF_NAME = ?";

   PreparedStatement updateSales = con.prepareStatement(updateString);
   updateSales.setInt(1, 500); //set value to first `?`
   updateSales.setString(2, "roasted"); //set value to second `?` 
© www.soinside.com 2019 - 2024. All rights reserved.