Рубрики
Без рубрики

JDBC подготовил SQL-запрос В состоянии

– JDBC подготовил SQL-запрос В состоянии

Java JDBC Подготовленный оператор пример создания SQL В состоянии.

1. Подготовленный оператор + Массив

В JDBC мы можем использовать createArrayOf для создания Подготовленного заявления В запросе.

	@Override
    public List getPostIdByTagId(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 List getPostIdByTagId(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;

    }

Рекомендации

Оригинал: “https://mkyong.com/jdbc/jdbc-preparedstatement-sql-in-condition/”