【发布时间】:2014-07-07 20:30:17
【问题描述】:
我已经为 mySQL 编写了通用 DAO 层(它可以使用 Reflection 和 ResultSetMetaData 保存\获取任何将实体扩展到\from 表的类对象)。我的实现在 sql 查询中几乎没有串联。是浪费了准备好的语句的所有优势,还是我只是失去了连接字符串的一点性能,仅此而已?
例如删除实体的一段代码:
PreparedStatement prepStatement = con.prepareStatement("DELETE FROM "
+ tableName + " WHERE id = ?");
prepStatement.setLong(1, id);
【问题讨论】:
-
是否浪费了准备好的语句的所有优点?不,这不对。阅读When we use PreparedStatement instead of Statement?和阅读when to use StringBuilder in java
-
我知道 StringBuilder 以及它相对于字符串连接的优势。如果只添加表名,我认为 StringBuilder 是多余的。
-
您的问题的答案在第一个链接中。第二个只是建议。
-
Prepared 语句准备和一次执行通常比简单语句慢。但这绝对是要走的路。您应该考虑在启动时为每个实体类上的每个操作准备一个语句,并根据需要经常重用它们。在运行时间很长的应用程序中,我建议不时重新准备语句。
-
您的数据库将为每个表名重用查询。因此,您不会从仅在数据库级别重用 1 个查询中受益,而是与您使用的表一样多。但是,
DELETE FROM TABLE1 WHERE ID = 1和DELETE FROM TABLE1 WHERE ID = 2将作为具有不同参数的相同查询处理,您仍然可以从中受益。但是,DELETE FROM TABLE1 WHERE ID = 1和DELETE FROM TABLE2 WHERE ID = 1将被视为两个不同的查询。