Gibt es Parameter in JDBC anstelle von Positions diejenigen genannt, wie die @name
, @city
in der ADO.NET Abfrage unten?
select * from customers where name=@name and city = @city
Gibt es Parameter in JDBC anstelle von Positions diejenigen genannt, wie die @name
, @city
in der ADO.NET Abfrage unten?
select * from customers where name=@name and city = @city
I think Oracle JDBC driver supports calling regular SQL statements with named parameters when using CallableStatement
.
Antworten:
JDBC unterstützt keine benannten Parameter. Sofern Sie nicht an die Verwendung von einfachem JDBC gebunden sind (was Schmerzen verursacht, lassen Sie mich das sagen), würde ich die Verwendung von Springs Excellent JDBCTemplate empfehlen, das ohne den gesamten IoC-Container verwendet werden kann.
NamedParameterJDBCTemplate unterstützt benannte Parameter. Sie können sie folgendermaßen 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);
spring-jdbc
Modul ist abhängig von spring-core
, spring-framework
, und spring-tx
. NamedParameterJdbcTemplate
würde ein Umschreiben erfordern, um Standalone zu verwenden. repo1.maven.org/maven2/org/springframework/spring-jdbc/…
Um ein großes Framework zu vermeiden, kann meiner Meinung nach eine einfache hausgemachte Klasse den Trick machen.
Beispiel einer Klasse 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<String> fields = new ArrayList<String>();
}
Beispiel für den Aufruf der Klasse:
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();
Bitte beachten Sie, dass das obige einfache Beispiel die zweimalige Verwendung des benannten Parameters nicht behandelt. Es funktioniert auch nicht mit dem: -Zeichen in Anführungszeichen.
(?!\\B'[^']*)(:\\w+)(?![^']*'\\B)
funktioniert besser für mich.
Vanilla JDBC unterstützt nur benannte Parameter in einem CallableStatement
(z. B. setString("name", name)
), und selbst dann vermute ich, dass die zugrunde liegende Implementierung gespeicherter Prozeduren dies 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önnen versuchen, das Spring-Framework zu verwenden, da es einige Erweiterungen enthält, die die Verwendung benannter Parameter in Abfragen ermöglichen.
Plain Vanilla JDBC unterstützt keine benannten Parameter.
Wenn Sie DB2 verwenden, verwenden Sie DB2-Klassen direkt:
NamedParameterStatement
ist keine Klasse in der Java-API.