Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java eption(欧洲){ se.printStackTrace(); } }_Java_Jdbc_Prepared Statement_In Clause - Fatal编程技术网

Java eption(欧洲){ se.printStackTrace(); } }

Java eption(欧洲){ se.printStackTrace(); } },java,jdbc,prepared-statement,in-clause,Java,Jdbc,Prepared Statement,In Clause,您可以使用下面javadoc中提到的setArray方法: 代码: 您不希望在动态查询中使用PreparedStation,至少您可以确保始终小于5个变量或这样的小值,但即使如此,我认为这是一个坏主意(不可怕,但不好)。由于元素的数量很大,情况会更糟(也更糟糕) 想象一下你的in条款中有成百上千种可能性: 这会适得其反,因为每次新请求时都会缓存,所以会损失性能和内存,而PreparedStatement不仅仅用于SQL注入,它还与性能有关。在这种情况下,语句更好 您的池有PreparedSt

您可以使用下面javadoc中提到的
setArray
方法:

代码:


您不希望在动态查询中使用PreparedStation,至少您可以确保始终小于5个变量或这样的小值,但即使如此,我认为这是一个坏主意(不可怕,但不好)。由于元素的数量很大,情况会更糟(也更糟糕)

想象一下你的in条款中有成百上千种可能性:

  • 这会适得其反,因为每次新请求时都会缓存,所以会损失性能和内存,而PreparedStatement不仅仅用于SQL注入,它还与性能有关。在这种情况下,语句更好

  • 您的池有PreparedStation的限制(-1 defaut,但您必须限制它),您将达到此限制!若你们并没有限制或者限制非常大,那个么你们就有内存泄漏的风险,在极端情况下,还会发生内存错误。所以,如果你的个人小项目被3个用户使用,这并不引人注目,但如果你在一家大公司,你的应用程序被成千上万的人和百万的请求使用,你不希望这样

  • 一些阅读。 您可以使用:

    for( int i = 0 ; i < listField.size(); i++ ) {
        i < listField.size() - 1 ? request.append("?,") : request.append("?");
    }
    
    例如:

    List<String> listField = new ArrayList<String>();
    listField.add("test1");
    listField.add("test2");
    listField.add("test3");
    
    StringBuilder request = new StringBuilder("SELECT * FROM TABLE WHERE FIELD IN (");
    
    for( int i = 0 ; i < listField.size(); i++ ) {
        request = i < (listField.size() - 1) ? request.append("?,") : request.append("?");
    }
    
    
    DNAPreparedStatement statement = DNAPreparedStatement.newInstance(connection, request.toString);
    
    int i = 1;
    for (String field : listField) {
        statement.setString(i++, field);
    }
    
    ResultSet rs = statement.executeQuery();
    
    List listField=new ArrayList();
    添加(“test1”);
    添加(“test2”);
    添加(“test3”);
    StringBuilder请求=新建StringBuilder(“从表中选择*字段(”);
    对于(int i=0;i
    公共静态结果集getResult(连接,列表值){
    试一试{
    String queryString=“从列名称所在的表名称中选择*”;
    StringBuilder参数builder=新建StringBuilder();
    parameterBuilder.append(“”);
    对于(int i=0;ii+1){
    parameterBuilder.append(“,”);
    }
    }
    parameterBuilder.append(“)”;
    PreparedStatement=connection.prepareStatement(queryString+parameterBuilder);
    对于(int i=1;i
    使用Java 8 API,
    List empNoList=Arrays.asList(123476782432975565563354646);
    列表参数=新的ArrayList();
    empNoList.forEach(empNo->parameters.add(“?”);//使用forEach添加所需数量的“?”
    String commaSepParameters=String.join(,,参数);//使用字符串将“?”与“,”连接起来
    StringBuilder selectQuery=new StringBuilder().append(“从EMP\U ID所在的员工中选择计数(EMP\U ID)”).append(CommasePPAParameters.append(“)”);
    
    尝试使用此代码

     String ids[] = {"182","160","183"};
                StringBuilder builder = new StringBuilder();
    
                for( int i = 0 ; i < ids.length; i++ ) {
                    builder.append("?,");
                }
    
                String sql = "delete from emp where id in ("+builder.deleteCharAt( builder.length() -1 ).toString()+")";
    
                PreparedStatement pstmt = connection.prepareStatement(sql);
    
                for (int i = 1; i <= ids.length; i++) {
                    pstmt.setInt(i, Integer.parseInt(ids[i-1]));
                }
                int count = pstmt.executeUpdate();
    
    stringids[]={“182”、“160”、“183”};
    StringBuilder=新的StringBuilder();
    for(int i=0;i对于(int i=1;i大量重复:,根据列表的最大长度,这可能会导致大量准备好的语句,可能会影响数据库性能。此外,似乎缺少括号…我听说过一种好的做法,其中有几个SQL语句带有不同数量的问号-例如,10、40、160,800.其余部分用零(通常不使用零作为ID)或任何给定参数填充。这减少了存储在DB缓存中的准备语句的数量。添加
    “,?”更容易一些
    然后删除第一个字符。我认为这是一个坏主意,可能会破坏你在大公司的生产。池中有最大数量的准备语句(ofc不使用-1),你可以用这个技巧使最大数量饱和。对我来说,这个答案是危险的,也可能是邪恶的。太多的
    new StringBuilder()
    调用。如果您直接将用户输入放入SQL字符串中,SQL注入变得容易,那么这不是违背了PreparedStatement的要点吗?SQL注入的工作方式高度依赖于数据库。您可能希望包括您使用的数据库+驱动程序。此解决方案听起来不错,但我得到了一个java.SQL.sqlfeaturenotsupportedExceptionmysql驱动程序5.1.39中的n也不适用于Oracle。不适用于H2,在第2条中,这适用于哪个数据库?适用于PostgreSQL。但是您必须编写
    WHERE field=ANY(?)
    而不是
    WHERE field IN(?)
    ,cf.不要这样做!这将打开您的程序进行SQL注入。如果您是通过用户输入进行此操作,他们可以让查询执行任何他们想执行的操作。添加到David的注释中:不要这样做!准备这样的语句是毫无价值和有害的。使用此处发布的其他解决方案之一,包括?占位符,或者,如果您不介意的话关于SQL注入攻击,则只需使用语句对象,而无需准备。
    int index = 1;
    for( Object o : values ) {
       pstmt.setObject(  index++, o ); // or whatever it applies 
    }
       
    
       
    
    String tmptable = "tmp" + UUID.randomUUID();
    
    sql = "create table " + tmptable + "(pagelist text not null)";
    cnn.createStatement().execute(sql);
    
    cnn.setAutoCommit(false);
    stmt = cnn.prepareStatement("insert into "+tmptable+" values(?);");
    for(Object o : rmList){
        Path path = (Path)o;
        stmt.setString(1, path.toString());
        stmt.execute();
    }
    cnn.commit();
    cnn.setAutoCommit(true);
    
    stmt = cnn.prepareStatement(sql);
    stmt.execute("delete from filelist where path + page in (select * from "+tmptable+");");
    stmt.execute("drop table "+tmptable+");");
    
    public class Test1 {
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            System.out.println("helow");
    String where="where task in ";
            where+="(";
        //  where+="'task1'";
            int num[]={1,2,3,4};
            for (int i=0;i<num.length+1;i++) {
                if(i==1){
                    where +="'"+i+"'";
                }
                if(i>1 && i<num.length)
                    where+=", '"+i+"'";
                if(i==num.length){
                    System.out.println("This is last number"+i);
                where+=", '"+i+"')";
                }
            }
            System.out.println(where);  
        }
    }
    
        int paramSizeInClause = 10; // required to be greater than 0!
        String color = "FF0000"; // red
        String name = "Nathan"; 
        Date now = new Date();
        String[] ids = "15,21,45,48,77,145,158,321,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,358,1284,1587".split(",");
    
        // Build sql query 
        StringBuilder sql = new StringBuilder();
        sql.append("UPDATE book SET color=? update_by=?, update_date=? WHERE book_id in (");
        // number of max params in IN clause can be modified 
        // to get most efficient combination of number of batches
        // and number of parameters in each batch
        for (int n = 0; n < paramSizeInClause; n++) {
            sql.append("?,");
        }
        if (sql.length() > 0) {
            sql.deleteCharAt(sql.lastIndexOf(","));
        }
        sql.append(")");
    
        PreparedStatement pstm = null;
        try {
            pstm = connection.prepareStatement(sql.toString());
            int totalIdsToProcess = ids.length;
            int batchLoops = totalIdsToProcess / paramSizeInClause + (totalIdsToProcess % paramSizeInClause > 0 ? 1 : 0);
            for (int l = 0; l < batchLoops; l++) {
                int i = 1;
                pstm.setString(i++, color);
                pstm.setString(i++, name);
                pstm.setTimestamp(i++, new Timestamp(now.getTime()));
                for (int count = 0; count < paramSizeInClause; count++) {
                    int param = (l * paramSizeInClause + count);
                    if (param < totalIdsToProcess) {
                        pstm.setString(i++, ids[param]);
                    } else {
                        pstm.setNull(i++, Types.VARCHAR);
                    }
                }
                pstm.addBatch();
            }
        } catch (SQLException e) {
        } finally {
            //close statement(s)
        }
    
        Connection connection = ConnectionManager.getConnection(); 
        PreparedStatement pstmt = null;
              //if the field values are in ArrayList
            List<String> fieldList = new ArrayList();
    
        try {
    
            StringBuffer sb = new StringBuffer();  
    
            sb.append("  SELECT *            \n");
            sb.append("   FROM TEST          \n");
            sb.append("  WHERE FIELD IN (    \n");
    
            for(int i = 0; i < fieldList.size(); i++) {
                if(i == 0) {
                    sb.append("    '"+fieldList.get(i)+"'   \n");
                } else {
                    sb.append("   ,'"+fieldList.get(i)+"'   \n");
                }
            }
            sb.append("             )     \n");
    
            pstmt = connection.prepareStatement(sb.toString());
            pstmt.executeQuery();
    
        } catch (SQLException se) {
            se.printStackTrace();
        }
    
    }
    
    PreparedStatement statement = connection.prepareStatement("Select * from test where field in (?)");
    Array array = statement.getConnection().createArrayOf("VARCHAR", new Object[]{"A1", "B2","C3"});
    statement.setArray(1, array);
    ResultSet rs = statement.executeQuery();
    
    for( int i = 0 ; i < listField.size(); i++ ) {
        i < listField.size() - 1 ? request.append("?,") : request.append("?");
    }
    
    int i = 1;
    for (String field : listField) {
        statement.setString(i++, field);
    }
    
    List<String> listField = new ArrayList<String>();
    listField.add("test1");
    listField.add("test2");
    listField.add("test3");
    
    StringBuilder request = new StringBuilder("SELECT * FROM TABLE WHERE FIELD IN (");
    
    for( int i = 0 ; i < listField.size(); i++ ) {
        request = i < (listField.size() - 1) ? request.append("?,") : request.append("?");
    }
    
    
    DNAPreparedStatement statement = DNAPreparedStatement.newInstance(connection, request.toString);
    
    int i = 1;
    for (String field : listField) {
        statement.setString(i++, field);
    }
    
    ResultSet rs = statement.executeQuery();
    
    public static ResultSet getResult(Connection connection, List values) {
        try {
            String queryString = "Select * from table_name where column_name in";
    
            StringBuilder parameterBuilder = new StringBuilder();
            parameterBuilder.append(" (");
            for (int i = 0; i < values.size(); i++) {
                parameterBuilder.append("?");
                if (values.size() > i + 1) {
                    parameterBuilder.append(",");
                }
            }
            parameterBuilder.append(")");
    
            PreparedStatement statement = connection.prepareStatement(queryString + parameterBuilder);
            for (int i = 1; i < values.size() + 1; i++) {
                statement.setInt(i, (int) values.get(i - 1));
            }
    
            return statement.executeQuery();
        } catch (Exception d) {
            return null;
        }
    }
    
    Using Java 8 APIs, 
    
        List<Long> empNoList = Arrays.asList(1234, 7678, 2432, 9756556, 3354646);
    
        List<String> parameters = new ArrayList<>();
        empNoList.forEach(empNo -> parameters.add("?"));   //Use forEach to add required no. of '?'
        String commaSepParameters = String.join(",", parameters); //Use String to join '?' with ','
    
    StringBuilder selectQuery = new StringBuilder().append("SELECT COUNT(EMP_ID) FROM EMPLOYEE WHERE EMP_ID IN (").append(commaSepParameters).append(")");
    
     String ids[] = {"182","160","183"};
                StringBuilder builder = new StringBuilder();
    
                for( int i = 0 ; i < ids.length; i++ ) {
                    builder.append("?,");
                }
    
                String sql = "delete from emp where id in ("+builder.deleteCharAt( builder.length() -1 ).toString()+")";
    
                PreparedStatement pstmt = connection.prepareStatement(sql);
    
                for (int i = 1; i <= ids.length; i++) {
                    pstmt.setInt(i, Integer.parseInt(ids[i-1]));
                }
                int count = pstmt.executeUpdate();