Java 使用已准备语句查询列表(JDBC)

Java 使用已准备语句查询列表(JDBC),java,sql,database,jdbc,prepared-statement,Java,Sql,Database,Jdbc,Prepared Statement,我目前有一个如下所示的方法: public void foo(Date date) { PreparedStatement stmt; ResultSet rs; java.sql.Date sDate = new java.sql.Date(date.getTime()); try { String sql = "select * from some_table p where p.start_date <=? and ?<= p

我目前有一个如下所示的方法:

public void foo(Date date) {
    PreparedStatement stmt; 
    ResultSet rs;
    java.sql.Date sDate = new java.sql.Date(date.getTime());

    try {
        String sql = "select * from some_table p where p.start_date <=? and ?<= p.end_date";
        stmt = getConnection().preparedStatement(sql);
        stmt.setDate(1, sDate);
        stmt.setDate(2, sDate);
        rs = stmt.executeQuery();
        //... 
    } finally {
        if (rs != null) { rs.close(); }
        if (stmt != null) { stmt.close(); }
    }
}
public void foo(日期){
编制报表;
结果集rs;
java.sql.Date sDate=new java.sql.Date(Date.getTime());
试一试{

String SQL=“从某个表P中选择*.PraseStordDe>P>而不是传递单个日期对象,考虑将日期对象的数组列表传递给您的<代码> FoO(…)>代码>方法并与之一起工作。

你有两个选择可以一起工作

选项1:通过更改参数多次执行PreparedStatement

public void foo(ArrayList<Date> dateList) {
    if(dateList == null)
        return;

    PreparedStatement stmt = null;
    ResultSet rs = null;    
    java.sql.Date sDate = null;
    try{
        stmt = getConnection().preparedStatement("select * from some_table p where p.start_date <=? and ?<= p.end_date");

        for(Date date: dateList){
            try{
                sDate = new java.sql.Date(date.getTime());
                stmt.clearParameters(); //Clear current parameter values
                stmt.setDate(1, sDate);
                stmt.setDate(2, sDate);
                rs = stmt.executeQuery();

                //perform your operations
            }finally{
                sDate = null;
                //mange your resultset closing
            }
        }
    }finally{
        //your resource management code
    }  
}
public void foo(ArrayList日期列表){
如果(日期列表==null)
返回;
PreparedStatement stmt=null;
结果集rs=null;
java.sql.Date sDate=null;
试一试{

stmt=getConnection().preparedStatement(“从某个表p中选择*,其中p.start\u date这是一个只使用一个数据库调用的解决方案。它不检查null或空
日期列表,相反,它假定至少有一个元素

public void foo(List<Date> dateList) {
    PreparedStatement stmt; 
    ResultSet rs;

    try {
        // Step 1 : build the query string, based on the number of elements in the list
        StringBuilder sql = new StringBuilder("select * from some_table p where (p.start_date <=? and ?<= p.end_date)");
        if (dateList.size() > 1) {
            for (int i = 1; i < dateList.size(); i++) {
                sql.append(" or (p.start_date <=? and ?<= p.end_date)");
            }
        }

        stmt = getConnection().preparedStatement(sql.toString());

        // Step 2 : pass the actual list of dates to the query
        for (int i = 0; i < dateList.size(); i++) {
            java.sql.Date date = new java.sql.Date(dateList.get(i).getTime());
            stmt.setDate((i * 2) + 1, date);
            stmt.setDate((i * 2) + 2, date);
        }

        rs = stmt.executeQuery();
        //... 
    } finally {
        if (rs != null) { rs.close(); }
        if (stmt != null) { stmt.close(); }
    }
}
public void foo(列表日期列表){
编制报表;
结果集rs;
试一试{
//步骤1:根据列表中元素的数量构建查询字符串

StringBuilder sql=new StringBuilder(“从某些表p中选择*,其中(p.start\u日期我们可以应用吗?您必须多次调用它,所以迭代是我唯一的选择吗?我认为您应该修改查询条件以检查范围,而不是尝试传入日期列表。您没有告诉我们您最终要实现的目标。@alexispigeon-woops,没有看到这种混淆。谢谢您的编辑:)
public void foo(List<Date> dateList) {
    PreparedStatement stmt; 
    ResultSet rs;

    try {
        // Step 1 : build the query string, based on the number of elements in the list
        StringBuilder sql = new StringBuilder("select * from some_table p where (p.start_date <=? and ?<= p.end_date)");
        if (dateList.size() > 1) {
            for (int i = 1; i < dateList.size(); i++) {
                sql.append(" or (p.start_date <=? and ?<= p.end_date)");
            }
        }

        stmt = getConnection().preparedStatement(sql.toString());

        // Step 2 : pass the actual list of dates to the query
        for (int i = 0; i < dateList.size(); i++) {
            java.sql.Date date = new java.sql.Date(dateList.get(i).getTime());
            stmt.setDate((i * 2) + 1, date);
            stmt.setDate((i * 2) + 2, date);
        }

        rs = stmt.executeQuery();
        //... 
    } finally {
        if (rs != null) { rs.close(); }
        if (stmt != null) { stmt.close(); }
    }
}