Nano Hash - криптовалюты, майнинг, программирование

PreparedStatement: Могу ли я указать имя столбца в качестве параметра?

Допустим, у меня есть таблица с 3 столбцами: C1, C2, C3.

Я делаю поиск на основе столбца C1. Могу ли я сделать что-то подобное (это не работает - потому что это не так, как prepareStatement используется :)) )

String c;// the name of the column

...    
String sql = "select * from table where ?  = ?";
                pre = con.prepareStatement(sql);
                pre.setString(1, c);
                pre.setString(1, i);
                rs = pre.executeQuery();

Основная идея, я не хочу иметь 3 if для каждого столбца. Элегантное решение?

03.10.2009

  • разве это не должно быть..... pre.setString(1, 'c1'); pre.setString(2, я); 04.10.2009

Ответы:


1

вы можете закодировать набор запросов sql и сохранить их на карте, а затем получить один на основе рассматриваемого столбца.

enum column { a, b, c}

Map<column, string> str;

static {
 str.put(a, "select * from tbl where a = ? ");
 ...
}

затем просто возьмите один из карты позже на основе перечисления. Добавление строк в операторы sql может стать проблемой безопасности в будущем.

03.10.2009

2

Это не сработает. Оператор подготовки анализирует SQL, отправляет в базу данных для проверки и компиляции. Если бы вопросительные знаки могли заменить части SQL, вы потеряли бы весь смысл связанных переменных - скорость и безопасность. Вы бы снова ввели SQL-инъекцию, и операторы должны были бы перекомпилироваться для всех параметров.

Не лучше ли что-то вроде SELECT * FROM table WHERE c1 = ? OR c2 = ? OR c3 = ? (конечно, в зависимости от индексов и размеров таблиц).

03.10.2009

3

Используйте динамический запрос и java.sql.Statement:

String whereClause = c + " = " + i;

// Form the dynamic Query
StringBuffer query = new StringBuffer( "SELECT * FROM TABLE" ); 
// Add WHERE clause if any
query.append(" WHERE " + whereClause);

// Create a SQL statement context to execute the Query
Statement stmt = con.createStatement();

// Execute the formed query and obtain the ResultSet
ResultSet resultSet = stmt.executeQuery(query.toString());
03.10.2009
  • просто будьте осторожны с этим, потому что это может привести к инъекции sql 04.10.2009

  • 4

    ты не можешь сделать это:

    String c;// the name of the column
    
    ...    
    String sql = "select * from table where " + c + "  = ?";
                    pre = con.prepareStatement(sql);
                    pre.setString(1, i);
                    rs = pre.executeQuery();
    

    ?

    Если нет, то это может быть решением:

    String c;// the name of the column
    
    ...    
    String sql = "select * from table where ('C1' = ? AND C1 = ?) 
                                         OR ('C2' = ? AND C2 = ?) 
                                         OR ('C3' = ? AND C3 = ?)"
                    pre = con.prepareStatement(sql);
                    pre.setString(1, c);
                    pre.setString(2, i);
                    pre.setString(3, c);
                    pre.setString(4, i);
                    pre.setString(5, c);
                    pre.setString(6, i);
                    rs = pre.executeQuery();
    
    03.10.2009
  • Я знаю. Я написал в вопросе. :) 04.10.2009
  • не видел обновление; Я удалил часть о передаче имен столбцов в PreparedStatement. 04.10.2009
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..