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

Допустим, у меня есть таблица с 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 для каждого столбца. Элегантное решение?

Ответы [ 4 ]

3 голосов
/ 04 октября 2009

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

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

2 голосов
/ 04 октября 2009

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

enum column { a, b, c}

Map<column, string> str;

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

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

0 голосов
/ 04 октября 2009

Используйте динамический запрос и 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());
0 голосов
/ 04 октября 2009

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

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...