2013-09-25 39 views
4

声明我的理解是,对象不能用于开发企业应用程序,因为它具有良好应用程序中的各种问题。为什么它在新版本中尚未被弃用?如果“准备”陈述优越,为什么需要“陈述”对象?

+0

欢迎来到Stackoverflow!这听起来像你在谈论SQL语句。你指的是哪种编程语言和哪种数据库访问技术? – Joni

+0

我指的是Java语句,用于JDBC连接的准备语句。 –

+1

看看http://stackoverflow.com/a/3385295/1541533 –

回答

3

Statement是一个非常好的界面。有什么不好的是通过将字符串连接在一起来创建查询,特别是包含用户输入的字符串。如果你只发出不包含变量的常量查询,那么简单的Statement接口就可以很好地工作。

+0

'Statement'是一个接口,实际上 – leonbloy

+0

@leonbloy当然你是对的!固定。 –

2

声明

使用通用访问数据库。在运行时使用静态SQL语句时很有用。 Statement接口不能接受参数。

使用JDBC中声明应该是100%本地化被用于DDL(ALTER, CREATE,GRANT等),因为这些是不能接受BIND 变量唯一的语句类型。

的PreparedStatement

当您计划使用SQL语句多次使用。 PreparedStatement接口在运行时接受输入参数。

PreparedStatements或CallableStatements应该用于每种其他类型的语句 (DML,查询)。因为这些是接受绑定变量的语句类型。

+0

似乎有点过分,像企业风格的导游一样横行;为什么我们应该使用'PreparedStatement'作为''SELECT COUNT(*)FROM USERS'“? –

1

JDBC驱动程序可以以不同的方式处理SQL语句。具体来说,在Oracle中,PreparedStatement想要绑定它看到的所有内容,如:NAME。

这对Oracle触发器是有问题的,它使用:NEW和:OLD名称来表示新旧行。

因此,当您尝试使用PreparedStatement创建Oracle触发器时,它将失败,因为没有任何内容绑定到NEW /:OLD的引用。

您必须使用正常的Statement.execute()调用来执行此操作。

+0

Out of Box答案.. :)谢谢 –

1

另外PreparedStatement比Statement更安全。

当您使用Statement并且您从用户那里获得输入并将其直接传递给查询时请小心。

用户可以使用SQL注入破解您的系统。