>  기사  >  Java  >  JDBC: 종합 가이드를 사용하여 IN 절을 매개변수화하는 방법은 무엇입니까?

JDBC: 종합 가이드를 사용하여 IN 절을 매개변수화하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-01 09:34:30515검색

How to Parameterize an IN Clause with JDBC: A Comprehensive Guide?

JDBC를 사용한 IN 절 매개변수화: 종합 가이드

SQL 쿼리 매개변수화는 SQL 삽입 공격을 방지하는 중요한 보안 조치입니다. 여러 값과 일치하는 IN 절을 처리할 때 다양한 데이터베이스에서 이를 매개변수화하는 표준화된 접근 방식을 찾는 것이 어려울 수 있습니다.

JDBC의 맥락에서 데이터베이스 연결을 위한 Java의 표준 API에는 전용 IN 절을 매개변수화하는 방법은 딜레마를 야기합니다. 일부 JDBC 드라이버는 preparedStatement#setArray()를 지원할 수 있지만 데이터베이스 간 호환성은 여전히 ​​불확실합니다.

실행 가능한 솔루션 중 하나는 Java의 String#join() 및 Collections#nCopies()를 활용하여 자리 표시자를 생성하는 도우미 메서드를 활용하는 것입니다. 그리고PreparedStatement#setObject()를 사용하여 반복적으로 값을 설정합니다.

다음 도우미 메서드를 고려하세요.

<code class="java">public static String preparePlaceHolders(int length) {
    return String.join(",", Collections.nCopies(length, "?"));
}

public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
    for (int i = 0; i < values.length; i++) {
        preparedStatement.setObject(i + 1, values[i]);
    }
}

이러한 메서드는 사용자 정의 JDBC 메서드에 통합되어 IN 절을 매개 변수화할 수 있습니다. 예를 들면 다음과 같습니다.

<code class="java">private static final String SQL_FIND = "SELECT id, name, value FROM entity WHERE id IN (%s)";

public List<Entity> find(Set<Long> ids) throws SQLException {
    List<Entity> entities = new ArrayList<Entity>();
    String sql = String.format(SQL_FIND, preparePlaceHolders(ids.size()));

    try (
        Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(sql);
    ) {
        setValues(statement, ids.toArray());

        try (ResultSet resultSet = statement.executeQuery()) {
            while (resultSet.next()) {
                entities.add(map(resultSet));
            }
        }
    }

    return entities;
}

private static Entity map(ResultSet resultSet) throws SQLException {
    Enitity entity = new Entity();
    entity.setId(resultSet.getLong("id"));
    entity.setName(resultSet.getString("name"));
    entity.setValue(resultSet.getInt("value"));
    return entity;
}</code>

Oracle과 같은 일부 데이터베이스에서는 IN 절에 허용되는 값 수에 제한을 적용한다는 점에 유의하는 것이 중요합니다. 따라서 JDBC에서 IN 절을 매개변수화할 때 이러한 제한 사항을 고려하는 것이 좋습니다.

위 내용은 JDBC: 종합 가이드를 사용하여 IN 절을 매개변수화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.