2012-12-20 12 views
6

mam jakiś kod JDBC następująco:Jak przekazać PreparedStatement setArray do tablicy znaków

String selectSQL = "SELECT * FROM DBUSER WHERE USER_ID = ? and PASSWORD = ?"; 

Integer userId = 1000; 
char[] passwordString = new char[] { 't', 'e', 's', 't' }; 

PreparedStatement preparedStatement = dbConnection.prepareStatement(selectSQL); 
preparedStatement.setInt(1, 1001); 
preparedStatement.setArray(2,... ??? // how to do this part? 

// execute select SQL statement 
ResultSet rs = preparedStatement.executeQuery(); 

Jak mogę zadzwonić preparedStatement.setArray ustawić drugi parametr w kwerendzie? Nie chcę używać tutaj parametru string do ochrony hasła.

Uwaga Korzystam z Hipersonicznej DB, ale planuję przenieść się do MySql, jeśli jest to przydatne.

+0

Nie jestem pewien, czy chcesz to zrobić. – duffymo

+2

Dlaczego? Nie chcę używać "Stringa", ponieważ rozumiem, że istnieje pewne ryzyko bezpieczeństwa z hasłem w jednym. – user1882491

+0

W tym przypadku nie ma problemu, jest problem, jeśli nie używasz przygotowań (iniekcji sql) –

Odpowiedz

1

Wystarczy popatrzeć na tego kodu

final PreparedStatement statement = connection.prepareStatement(
     "SELECT my_column FROM my_table " + 
     "where search_column IN (SELECT * FROM unnest(?))" 
); 
final String[] values = getValues(); 
statement.setArray(1, connection.createArrayOf("text", values)); 
final ResultSet rs = statement.executeQuery(); 
try { 
    while(rs.next()) { 
     // do some... 
    } 
} finally { 
    rs.close(); 
} 

również proszę spojrzeć na ten artykuł odsyłającego http://people.apache.org/~djd/derby/publishedapi/java/sql/PreparedStatement.html

+0

Który używa ciągu znaków i chcę uniknąć użycia ciągu znaków. Czy to możliwe z tablicą 'char'? – user1882491

6

PreparedStatement#setArray otrzymał java.sql.Array najpierw trzeba zastosować createArrayOf metody JDBC Conncetion do stworzenia tablicy , tylko wtedy możesz przekazać ją do setArray.

Jako metoda akceptuj tylko Object[] powinieneś utworzyć tablicę z Character zamiast char.

Na przykład:

Character[] passwordString = new Character[] { 't', 'e', 's', 't' }; 
Array sqlArray = con.createArrayOf("CHAR", passwordString); 
preparedStatement.setArray(2, sqlArray); 
+0

Najpierw powinieneś wiedzieć, że typem w db jest ARRAY –

+0

Musisz podać 'nazwę SQL typu elementów mapy tablicy do' (tj. Typ elementów, a nie samą tablicę) –

+0

Nie zrobiłeś undestand . Następnie typ kolumny w dabase powinien być [Array] (http://hsqldb.org/doc/2.0/guide/sqlgeneral-chapt.html#sgc_array). Następnie możesz użyć 'java.sql.Array'. Ten typ pozwala przechowywać wiele danych w jednym wierszu, bez żadnych dodatkowych relacji. Nie został zaprojektowany tak, jak próbujesz to sugerować. –

2

Jeśli chcesz przekazać tablicę w przygotowanym oświadczeniu zadzwoń

preparedStatemtn.setArray(index,array);

Ale co trzeba zapewnić pierwsze, w DB kolumna jest również a ARRAY. Aby uzyskać więcej szczegółów, zobacz odpowiedź Avirama Sagala.


Ale twoja baza jest idealna do ochrony hasła.

To rozwiązanie będzie chronić tylko przed odczytaniem hasła z puli napisów Java. To i tak jest bardzo satysfakcjonujące. Przekazywany jest password Ans jako zwykły tekst.

Moja sugestia polega na tym, że zamiast komplikować schemat bazy danych, należy skorzystać z zalet kryptografii. Po wprowadzeniu wartości hasła należy przekazać password digest.

Prosty przykład funkcji skrótu.

public static String getDigest(byte[] password) { 

    return new String(Hex.encodeHex(new MessageDigest.getInstance("SHA").digest(password))); 

} 

Następnie przechowuj w db podsumowanie przy użyciu jest bezpieczne i używasz prosty ciąg w kwerendach.

0

Inną alternatywą jest użycie CharArrayReader i zadzwonić pod numer statement.setCharacterStream.

char[] passwordString = new char[] { 't', 'e', 's', 't' }; 
statement.setCharacterStream(1, new CharArrayReader(passwordString)); 
+0

Czy ta metoda byłaby odpowiednia do wstawiania haseł w postaci zwykłego tekstu? – jon5477

+0

Teoretycznie tak. Po prostu pamiętaj, by ustawić wartość null dla odwołań, aby oznaczyć obiekt jako kandydat do pobrania – ssedano

Powiązane problemy