版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vcshcn/article/details/48243357
PreparedStatement只能按?设置参数,简单写了一个按名字设置参数的类,实际用了PreparedStatement,简单写了,可以扩充,没有测试
public class NamedStatement {
private Pattern NAME_PARSE = Pattern.compile("(:\\w+)");
private PreparedStatement statement;
private String sql;
private Map<String, Integer> names;
public NamedStatement(Connection conn, String sql) throws SQLException {
parse(sql);
statement = conn.prepareStatement(this.sql);
}
public void setString(String name, String value) throws SQLException {
statement.setString(names.get(name), value);
}
public void setInt(String name, int value) throws SQLException {
statement.setInt(names.get(name), value);
}
.....
.....
public void close() throws SQLException {
statement.close();
statement = null;
}
private void parse(String query) {
int index = 1;
int pos = 0;
StringBuilder sb = new StringBuilder();
Matcher matcher = NAME_PARSE.matcher(query);
while (matcher.find()) {
String s = matcher.group();
int start = matcher.start();
int end = matcher.end();
sb.append(query.substring(pos, start));
sb.append('?');
pos = end;
names.put(s, index++);
}
sb.append(query.substring(pos, query.length()));
this.sql = sb.toString();
}
}
这样使用
String sql = "select * from table where a=:a and b=:param and c=5
NamedStatement s = new NamedStatement (conn, sql);
s.....