炎炎设计
为了避免包含大型框架,我认为一个简单的自制类可以做到这一点。处理命名参数的类示例: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>();}调用类的示例: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();请注意,上面的简单示例不会处理两次使用命名参数。它也不处理使用:引号内的符号。