JDBC의 매개변수화된 IN 절에 대한 모범 사례
배경:
매개변수화된 SQL 쿼리는 SQL 삽입 공격을 방지하고 코드 효율성을 높이는 데 매우 중요합니다. IN 절로 작업할 때 일반적인 작업은 여러 값을 매개변수로 전달하는 것입니다. 이 질문은 Java에서 JDBC를 사용하여 다양한 데이터베이스 플랫폼에서 이를 달성하기 위한 모범 사례를 탐색합니다.
정답:
안타깝게도 JDBC에서는 IN 절을 직접 매개변수화하는 방법을 제공하지 않습니다. 그러나 일부 JDBC 드라이버는 이 목적으로 preparedStatement#setArray() 사용을 지원할 수 있습니다. 그러나 이 지원은 데이터베이스에 따라 다릅니다.
이 제한 사항을 해결하려면 String#join() 및 Collections#nCopies()를 사용하는 사용자 정의 도우미 함수를 사용하여 IN 절에 필요한 자리 표시자를 생성하는 것이 좋습니다. 또한 헬퍼 함수를 사용하여 ReadyStatement#setObject()를 사용하여 루프에서 값을 설정할 수 있습니다.
코드 예:
다음은 이러한 도우미 기능을 사용하는 방법을 보여주는 코드 예제입니다.
<code class="language-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]); } }</code>
이 코드는 매개변수화된 IN 절을 사용하는 메소드에 통합될 수 있습니다.
<code class="language-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<>(); 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)); // 假设map方法已定义 } } } return entities; }</code>
참고: 일부 데이터베이스에는 IN 절에 허용되는 값 개수에 제한이 있습니다. 예를 들어 Oracle의 프로젝트 수는 1000개로 제한됩니다.
이러한 도우미 함수를 사용하면 JDBC에서 IN 절을 안전하고 효율적으로 매개변수화할 수 있으므로 SQL 삽입 취약점을 방지하고 코드 이식성을 보장할 수 있습니다. map(resultSet)
메소드는 entity
클래스에 따라 적절하게 구현되어야 한다는 점을 기억하세요.
위 내용은 SQL 주입을 방지하기 위해 JDBC에서 IN 절을 가장 잘 매개변수화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!