当我们使用+
运算符连接编译时静态字符串时,编译器会将它们连接在一起并在其位置存储一个新的静态字符串。
现在我有一个策略模式,它提供应该连接成更大的SQL语句的SQL片段。所有部分都是静态的,但由于涉及方法调用,因此上述编译时加入不会发生。
示例:
class MagicDao {
void Object daoMethod(GetStuff cmd) {
String sql = "select ... where " + cmd.getWhereClause() + " order by ...";
// ...
}
}
public interface GetStuff {
String getWhereClause();
Object[] getParameters();
}
class GetFunStuff implements GetStuff {
public String getWhereClause() {
return " abc = ? ";
}
// ...
}
我想知道是否有任何模式/技巧可以使SQL字符串串联再次编译,同时保留上述代码的简单性/可读性。
(如果缓存是唯一的解决方案,那么可以建议一个可读的,线程安全的一个班轮吗?)
(这样做的动机:使事物静态化将在字符串构建过程中每秒节省无数垃圾,并节省在PreparedStatement
缓存中查找字符串的时间。)
答案 0 :(得分:0)
我真的不知道你是如何进行SQL查询的,但你可以考虑使用JDBC \.co\.uk\/(?:[^\/\n]+\/)?([^\/\n]+)
,如:
PreparedStatement
在这种情况下,您的PreparedStatement pstmt = con.prepareStatement("select ... where ? order by ...");
pstmt.setString(1, cmd.getWhereClause());
将被预编译