当前位置: 首页 > 知识库问答 >
问题:

在PreparedStatement上仅返回1行的IN子句

轩辕欣可
2023-03-14
public ArrayList<String> getDadosIn(ArrayList<String> lista)
{
    PreparedStatement ps = null;
    ResultSet rs = null;
    ArrayList< String > listaDados = new ArrayList< String >();

    Connection conn = ConnectionUtil.getDBConnection();

    try
    {
        StringBuilder query = new StringBuilder();
        Calendar calendar = Calendar.getInstance();
        NumberFormat numberFormat = new DecimalFormat( "00" );

        System.out.println( "Begin query: " +
                            numberFormat.format( calendar.get( Calendar.DAY_OF_MONTH ) ) + "/" + // Dia
                            numberFormat.format( calendar.get( Calendar.MONTH ) + 1 )    + "/" + // Mês
                            calendar.get( Calendar.YEAR )                                + "-" + // Ano
                            numberFormat.format( calendar.get( Calendar.HOUR_OF_DAY ) )  + ":" + // Hora
                            numberFormat.format( calendar.get( Calendar.MINUTE ) )       + ":" + // Minuto
                            numberFormat.format( calendar.get( Calendar.SECOND ) ) );            // Segundo

        query.append( "SELECT ID_CLIENTE FROM CLIENTE WHERE ID_CLIENTE IN (" );

        int i = 1;
        int countAux = 0;
        int countElements = 0;

        for ( int k = 0; k < lista.size(); k++ )
        {
            query.append( "?," );

            countAux++;
            countElements++;

            if(countAux >= 1000)
            {
                query.deleteCharAt( query.length() - 1 );
                query.append( ")" );
                ps = conn.prepareStatement(String.valueOf( query ) );

                for ( int j = 0; j < 1000; j++ )
                {
                    ps.setInt( i++, Integer.parseInt(lista.get(countElements - 1)) );
                }

                rs = ps.executeQuery();

                while ( rs.next() )
                {
                    listaDados.add( rs.getString("id_cliente") );
                }

                ps.close();

                query.delete( 0, query.length() );
                query.append( "SELECT ID_CLIENTE FROM CLIENTE WHERE ID_CLIENTE IN (" );

                i = 1;
                countAux = 0;

                System.out.println( "Registros selecionados: " + countElements + " - lista.size = " + listaDados.size());
            }
        }

        // verifica se ainda há registros para selecionar, uma vez que os selects acima eram executados a cada N vezes
        if(countAux > 0)
        {
            i = 1;

            query.deleteCharAt( query.length() - 1 );
            query.append( ")" );

            ps = conn.prepareStatement(String.valueOf( query ) );

            for ( int j = 0; j < 1000; j++ )
            {
                ps.setInt( i++, Integer.parseInt(lista.get(countElements - 1)) );
            }

            rs = ps.executeQuery();

            while ( rs.next() )
            {
                listaDados.add( rs.getString("id_cliente") );
            }
            ps.close();
        }

        calendar = Calendar.getInstance();

        System.out.println( "End query: " +
                            numberFormat.format( calendar.get( Calendar.DAY_OF_MONTH ) ) + "/" + // Dia
                            numberFormat.format( calendar.get( Calendar.MONTH ) + 1 )    + "/" + // Mês
                            calendar.get( Calendar.YEAR )                                + "-" + // Ano
                            numberFormat.format( calendar.get( Calendar.HOUR_OF_DAY ) )  + ":" + // Hora
                            numberFormat.format( calendar.get( Calendar.MINUTE ) )       + ":" + // Minuto
                            numberFormat.format( calendar.get( Calendar.SECOND ) ) );            // Segundo

        ps.close();
        conn.close();
    }
    catch ( SQLException e )
    {
        e.printStackTrace();
    }

    return listaDados;
}

共有1个答案

杜海
2023-03-14

几件事:

>

  • 在带有integer.parseint()的for循环中,Lista.Get(countelements-1)的计数器需要更改为j:

        for ( int j = 0; j < 1000; j++ )
        {
            ps.setInt( i++, Integer.parseInt(lista.get(countElements - 1)) );
        }
    
                    for ( int j = 0; j < lista.size(); j++ )
                    {
                        ps.setInt( i++, Integer.parseInt(lista.get( j )) );
                    }
    
                for ( int j = 0; j < lista.size(); j++ )
                {
                    ps.setInt( i++, Integer.parseInt(lista.get( j )) );
                }
    

  •  类似资料:
    • 问题内容: 将SQL IN子句与的实例一起使用的最佳解决方法是什么,由于SQL注入攻击安全性问题,多个值不支持该子句:一个占位符代表一个值,而不是值列表。 考虑以下SQL语句: 使用本质上是一种不可行的尝试,它是首先解决使用原因的方法?。 有哪些解决方法? 问题答案: 建议的选项是: 准备,对每个值执行它,并在客户端对结果进行UNION。只需要一个准备好的语句。缓慢而痛苦。 准备并执行它。每个IN

    • 问题内容: 结合使用子句和实例的最佳解决方法是什么,由于注入攻击安全性问题,多个值不支持该子句:一个?占位符代表一个值,而不是值列表。 考虑以下SQL语句: 使用;本质上是一种不可行的尝试,它是首先解决使用原因的解决方法?。 有哪些解决方法? 问题答案: 建议的选项是: 准备,对每个值执行它,并在客户端对结果进行。只需要一个准备好的语句。缓慢而痛苦。 准备并执行它。每个大小需要一个准备好的语句。快

    • 我试图从一个MySQL数据库中创建一个select语句来选择id用户(雇员或领导或经理)和全名。根据id部门,id优先级。代码是:

    • 我不知道当我在Mysql中运行查询时,会出现此错误。 #1242-子查询返回超过1行 谁能帮我解决这个问题?

    • 问题内容: 我正在研究分配液体的应用程序。这是数据库的组织 罐: canister_id {PK} Ingredient_id {FK} 成分: Ingredient_id {PK} 成分名称 喝: Drink_id {PK} 饮料名称 成分: instance_id {PK} Drink_id {FK} Ingredient_id {FK} 数量 每种饮料都有多种成分(保存在Ingredient

    • 问题内容: 执行查询时如何在JDBC的prepareStatement中设置in子句的值。 例: 如果此条款可 问题答案: 我要做的是添加一个“?” 对于每个可能的值。 例如: 然后愉快地设置参数