Benannte Parameter in JDBC

Gibt es benannte Parameter in JDBC anstelle von positionierten, wie @name , @city in der folgenden ADO.NET-Abfrage?

 select * from customers where name=@name and city = @city 

Solutions Collecting From Web of "Benannte Parameter in JDBC"

JDBC unterstützt keine benannten Parameter. Wenn Sie nicht einfach JDBC verwenden müssen (was zu Schmerzen führt, lassen Sie mich das sagen), würde ich empfehlen, Springs Excellent JDBCTemplate zu verwenden, das ohne den gesamten IoC-Container verwendet werden kann.

NamedParameterJDBCTemplate unterstützt benannte Parameter, Sie können sie wie folgt verwenden:

  NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); MapSqlParameterSource paramSource = new MapSqlParameterSource(); paramSource.addValue("name", name); paramSource.addValue("city", city); jdbcTemplate.queryForRowSet("SELECT * FROM customers WHERE name = :name AND city = :city", paramSource); 

Um einen großen Rahmen zu vermeiden, denke ich, dass ein einfacher, selbstgebauter Unterricht den Trick leisten kann.

Beispiel für eine class zur Behandlung benannter Parameter:

 public class NamedParamStatement { public NamedParamStatement(Connection conn, String sql) throws SQLException { int pos; while((pos = sql.indexOf(":")) != -1) { int end = sql.substring(pos).indexOf(" "); if (end == -1) end = sql.length(); else end += pos; fields.add(sql.substring(pos+1,end)); sql = sql.substring(0, pos) + "?" + sql.substring(end); } prepStmt = conn.prepareStatement(sql); } public PreparedStatement getPreparedStatement() { return prepStmt; } public ResultSet executeQuery() throws SQLException { return prepStmt.executeQuery(); } public void close() throws SQLException { prepStmt.close(); } public void setInt(String name, int value) throws SQLException { prepStmt.setInt(getIndex(name), value); } private int getIndex(String name) { return fields.indexOf(name)+1; } private PreparedStatement prepStmt; private List fields = new ArrayList(); } 

Beispiel für den Aufruf der class:

 String sql; sql = "SELECT id, Name, Age, TS FROM TestTable WHERE Age < :age OR id = :id"; NamedParamStatement stmt = new NamedParamStatement(conn, sql); stmt.setInt("age", 35); stmt.setInt("id", 2); ResultSet rs = stmt.executeQuery(); 

Beachten Sie, dass das obige einfache Beispiel die Verwendung des benannten Parameters nicht zweimal behandelt. Es funktioniert auch nicht mit dem: Zeichen in Anführungszeichen.

Vanilla JDBC unterstützt nur benannte Parameter in einem CallableStatement (z. B. setString("name", name) ), und selbst dann vermute ich, dass die zugrundeliegende Implementierung der gespeicherten Prozedur es unterstützen muss.

Ein Beispiel für die Verwendung benannter Parameter:

 //uss Sybase ASE sysobjects table...adjust for your RDBMS stmt = conn.prepareCall("create procedure p1 (@id int = null, @name varchar(255) = null) as begin " + "if @id is not null " + "select * from sysobjects where id = @id " + "else if @name is not null " + "select * from sysobjects where name = @name " + " end"); stmt.execute(); //call the proc using one of the 2 optional params stmt = conn.prepareCall("{call p1 ?}"); stmt.setInt("@id", 10); ResultSet rs = stmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString(1)); } //use the other optional param stmt = conn.prepareCall("{call p1 ?}"); stmt.setString("@name", "sysprocedures"); rs = stmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString(1)); } 

Sie können benannte Parameter nicht in JDBC selbst verwenden. Sie könnten das Spring-Framework verwenden, da es einige Erweiterungen enthält, die die Verwendung von benannten Parametern in Abfragen ermöglichen.

Ich habe am Ende nur meinen eigenen Wrapper erstellt.

  1. in dem ich zuerst den gebundenen Wert saniert habe (Sie können Beispiele bei Google finden)

  2. Dann String.replace() nur die String.replace() -Methode von Java, um die placeHolders zu ersetzen.

Der größte Nachteil ist, dass Sie sicherstellen müssen, dass die Variable in der Tat für die Bindung sicher ist.

Edit: Ich benutze jetzt nur Spring’s Hibernate, viel besser

Java JDBC unterstützt keine benannten Parameter.

Wenn Sie DB2 verwenden und dann direkt DB2-classn verwenden:

  1. Verwenden benannter Parametermarken mit PreparedStatement-Objekten
  2. Verwenden benannter Parametermarken mit CallableStatement-Objekten