【发布时间】:2010-09-29 13:59:04
【问题描述】:
您更喜欢哪种方法来创建动态 sql 查询? 格式化还是流式传输? 只是偏好还是有任何理由比其他更好?或者您使用的任何特殊库。
编辑: 如果是c++请回答。
【问题讨论】:
标签: java c++ sql format stream
您更喜欢哪种方法来创建动态 sql 查询? 格式化还是流式传输? 只是偏好还是有任何理由比其他更好?或者您使用的任何特殊库。
编辑: 如果是c++请回答。
【问题讨论】:
标签: java c++ sql format stream
始终使用“prepare”,这将与 prepareStatement 等效,但确切的函数名称取决于您的数据库和驱动程序组合。
prepared statement 相对于 execute(String) 的优势有很多:-
当“prepare”语句被执行时,语句被解析并且访问计划只确定一次。根据您运行该语句的次数,这可以 带来更好的性能。
在传递字符串数据时无需担心特殊字符 设置字符串()。在 execute(String) 中,数据中的任何单引号或分号都会导致解析错误。
更糟糕的是“sql 注入”攻击的工作方式。如果像 "x' from cust_table; delete from cust_table; select " 这样的字符串作为数据输入,很可能会导致删除语句被解析和执行。
处理数字的效率要高得多。 setInt 调用采用整数值,对于等效的 SQL 字符串,您必须将其转换为字符,然后 DBMS 必须将其转换回整数。
可读性。您编写一个带有几个问号的单个 SQL 语句,变量所在的位置相对容易阅读,而不是在心理上解析和分析一系列字符串连接会为转义引号等带来额外的噪音。
然而,在某些情况下 execute(String) 实际上更好。
您的密钥分布非常不均匀。例如。如果您 95% 的客户居住在美国,并且您想列出居住在加拿大的 4%,那么“国家/地区 = 哪里?”通常会导致表空间扫描,而使用 "where country = 'CA'" 您有一些机会使用索引。
另一种情况是用户可以输入或省略多个搜索条件。为给定的条件构建一个 SQL 字符串比构建一个复杂的查询来处理输入条件的所有可能排列要好得多。
【讨论】:
在 Java 中,您应该使用 PreparedStatement。
PreparedStatement statement = connection.prepareStatement("SELECT * FROM Table WHERE ID = ?");
statement.setInt(1, 17);
ResultSet resultSet = statement.executeQuery();
【讨论】:
对于 C++,有一些叫做 SOCI - The C++ Database Access Library 的东西
【讨论】:
当无法使用准备好的语句时,我发现使用 C++ 流是编写查询的最佳方式:
std::ostringstream sql;
sql << "exec loadStuff(" << param1 << ", " << param2 << ")";
不用担心参数的类型和字符串的长度很棒!
【讨论】: