我想知道有什么区别以及何时使用Statement
,PreparedStatement
和CallableStatement
。
使用其中每种方法的最佳做法和典型方案是什么?
答案 0 :(得分:7)
声明与PreparedStatement
使用PreparedStatement可以提高性能,但与数据库有关。
使用PreparedStatement可以避免SQL注入。 How does a PreparedStatement avoid or prevent SQL injection?
使用setInt更好地检查prepareStatement,setString where where语句,你只是继续附加到主SQL。
类似的帖子:
Difference between Statement and PreparedStatement
CallableStatement - 在所有数据库中访问StoredProcedures的Java答案。
类似的帖子
CallableStatement vs Statement
使用PreparedStatement和Callable你已经有了缓存,缓存也是一个很大的话题,你不想做所有这些而是看ehcache
您几乎总是更喜欢PreparedStatement而不是Statement
如果你必须操作StoredProcedure,你只有一个选项CallableStatement。
答案 1 :(得分:4)
我建议您在传递参数时使用PreparedStatement,无论您是否重复使用该语句。在实践中,我将PreparedStatement用于除过程调用之外的所有内容,并让DB和JDBC驱动程序决定要缓存的内容和方式。过程调用应使用CallableStatement来处理缺少一致的跨数据库过程调用语法。
在PostgreSQL上,JDBC驱动程序在客户端缓存预准备语句,直到达到某个重用阈值。此时,将发出服务器端PREPARE,并且将来的执行将使用服务器端预准备语句及其缓存计划。由于PostgreSQL基于统计的查询规划器,这可能有一些......有趣......以及意想不到的效果。如果您的表具有某些值分布(或由于缺少ANALYZE,错误的random_page_cost或太低的stats阈值而导致的错误统计信息),则计划程序可能会选择一个不同且较慢的查询计划,当它具有未知参数时,如果它将选择它知道你要搜索的实际价值。如果您在第5次(默认情况下)重复某个特定语句后遇到查询突然大幅减速,您可能会被此类操作所困扰,并且可以在PgJDBC中通过turning off server-side PREPARE解决它。通过检查特定参数是否与未知值情况具有非常不同的统计数据来检测服务器中的这些问题情况正在进行中,但AFAIK尚未点击HEAD。另见this question。搜索pgsql-general邮件列表和stackOverflow以获取更多信息。