我应该使用PreparedStatements来处理Java中的所有数据库插入操作吗?

问题描述:

在将变量插入到Java数据库中之前,转换变量的建议方法是什么?我应该使用PreparedStatements来处理Java中的所有数据库插入操作吗?

据我所知,我可以使用PreparedStatement.setString()来转义数据,但PreparedStatement似乎有点不切实际,如果我不打算再次运行相同的查询..有没有更好的方式来做到这一点没有准备每个查询?

+0

你可以一个进一步此,并且使用Hibernate(或其他ORM):那么你可以(主要)避免在完全Java代码混合SQL。 有一点与它的学习曲线(ESP集合。),但很多周围的文档和教程。 如果现有数据已构建为Java bean的,则Hibernate可以使用这些:它甚至可以基于你的班表 - 或创建基于数据库表你的Java bean。 – monojohnny 2010-01-15 00:49:15

是的,使用准备好的语句的一切。

  1. 它们被解析一次。

  2. 它们免受SQL注入攻击。

  3. 它们是一个更好的设计,因为你必须考虑你的SQL以及它的使用方式。

如果您认为他们只使用过一次,那么您并没有看大图。有一天,你的数据或你的应用程序将会改变。


编辑。

为什么准备好的语句让你思考你的SQL?

  • 当你组装一个字符串(或简单地执行文本的文本块)你是不是创建一个新的PreparedStatement对象。你只是在执行SQL - 它可以非常随便地完成。

  • 当你必须创建(并保存)一个PreparedStatement时,你必须更多地考虑封装,责任分配。准备语句是进行任何SQL处理之前的有状态事件。

额外的工作是小的,但不是微不足道的。这就是人们开始思考ORM和数据缓存层的原因,以及类似的东西来优化他们的数据库访问。

通过Prepared语句,数据库访问不那么随意,更有意。

+0

我不会说免疫,但保护。 – Milhous 2008-12-29 02:22:04

+0

@Milhous。不同意。使用绑定变量和静态SQL文本准备的语句是免疫的。完全。 – 2008-12-29 02:27:20

+0

你假定绑定中没有错误。不要误解我的意思,我所使用的都是准备好的陈述。 – Milhous 2008-12-29 03:37:08

准备一个陈述并不昂贵。它比大多数替代品更安全。

您不应该使用字符串连接自己构造SQL查询。构建SQL查询时,绝不应该手动转义变量/用户数据。所需的实际转义取决于您的基础数据库,并且在某些时候有人会忘记转义。

重点是这样的:用准备好的语句,它是不可能来创建一个SQL注入语句。随着自定义转义,这是可能的。选择是显而易见的。

我听说过PreparedStatement比普通Statement花费一点额外开销的观点,如果我没有将用户输入连接到我的查询中,它应该是安全的。这可能是事实,但额外的成本并没有那么多,并且SQL查询随着时间而改变。如果你开始今天使用语句,因为你已经证明自己,你的查询是注射证明,你是在和自己的上一个维护程序员改变SQL来接受用户输入的一天失败,但不认为将该声明更改为PreparedStatement。我的建议是在找到你之前总是使用PreparedStatement来避免麻烦。

更妙的是,不要直接使用JDBC API,因为它是如此容易出错(例如无法在所有情况下正确清理所有资源)。使用Spring的JdbcOperations接口等JDBC助手对象,这可以大大减少代码的大小和繁琐程度。如果您只使用Spring来实现这一功能,那么与直接使用JDBC API相比,您仍然对自己产生了极大的兴趣。