Java JDBC Подготовленный оператор
пример создания SQL В состоянии.
1. Подготовленный оператор + Массив
В JDBC мы можем использовать createArrayOf
для создания Подготовленного заявления
В запросе.
@Override public ListgetPostIdByTagId(List tagIds) { List result = new ArrayList<>(); String sql = "SELECT tr.object_id as post_id FROM wp_term_relationships tr " + " JOIN wp_term_taxonomy tt JOIN wp_terms t " + " ON tr.term_taxonomy_id = tt.term_taxonomy_id " + " AND tt.term_id = t.term_id " + " WHERE t.term_id IN (?) AND tt.taxonomy= 'post_tag'"; try (Connection connection = dataSource.getConnection(); PreparedStatement ps = connection.prepareStatement(sql)) { Array tagIdsInArray = connection.createArrayOf("integer", tagIds.toArray()); ps.setArray(1, tagIdsInArray); try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { result.add(rs.getInt("post_id")); } } } catch (SQLException e) { logger.error("Unknown error : {}", e); } return result; }
Но этот тип массив
не является стандартным вариантом JDBC. Если мы запустим это с MYSQL, появится следующее сообщение об ошибке:
java.sql.SQLFeatureNotSupportedException
MySQL не поддерживает массив
тип, протестированный с
mysql mysql-connector-java 5.1.47
2 Подготовленное заявление + Присоединиться
Эта версия работает в MySQL, и любая база данных, поддерживающая SQL В состоянии, без магии, просто вручную присоединяется и заменяет (?)
@Override public ListgetPostIdByTagId(List tagIds) { List result = new ArrayList<>(); String sql = "SELECT tr.object_id as post_id FROM wp_term_relationships tr " + " JOIN wp_term_taxonomy tt JOIN wp_terms t " + " ON tr.term_taxonomy_id = tt.term_taxonomy_id " + " AND tt.term_id = t.term_id " + " WHERE t.term_id IN (?) AND tt.taxonomy= 'post_tag'"; String sqlIN = tagIds.stream() .map(x -> String.valueOf(x)) .collect(Collectors.joining(",", "(", ")")); sql = sql.replace("(?)", sqlIN); try (Connection connection = dataSource.getConnection(); PreparedStatement ps = connection.prepareStatement(sql)) { try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { result.add(rs.getInt("post_id")); } } } catch (SQLException e) { logger.error("Unknown error : {}", e); } return result; }
Рекомендации
- Подготовленные документы Java
- Java 8 – Пример соединителя строк – Mkyong.com
Оригинал: “https://mkyong.com/jdbc/jdbc-preparedstatement-sql-in-condition/”