Paramétrage JDBC dans une clause IN
En Java JDBC, paramétrer les arguments dans une clause IN nécessite un peu plus d'ingéniosité par rapport à d'autres programmations langues.
Le problème se pose lorsque nous devons exécuter une requête telle que :
SELECT * FROM MYTABLE WHERE MYCOL IN (?)
Défis
JDBC ne fournit pas de moyen simple pour paramétrer la clause IN. Certains pilotes JDBC peuvent prendre en charge l'utilisation de PreparedStatement#setArray(), mais cette prise en charge varie selon les bases de données.
Solution
Pour surmonter ce défi, nous pouvons utiliser des méthodes d'assistance pour construire chaînes d'espace réservé et définissez les valeurs des paramètres dans une boucle.
<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]); } }
Utilisation
Nous pouvons utiliser ces méthodes d'assistance dans notre code comme suit :
<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<>(); 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; }</code>
Limitations
Notez que certaines bases de données, comme Oracle, peuvent imposer une limite sur le nombre de valeurs autorisées dans une clause IN.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!