您更喜欢哪种方法来创建动态 sql 查询?格式化还是流式传输?它只是偏好还是有任何理由比其他更好?或者您使用的任何特殊库。
编辑:请在 c++ 的情况下回答。
始终使用“prepare”将有一个等价于 prepareStatement 但确切的函数名称将取决于您的数据库和驱动程序组合。
与 execute(String) 相比,prepared statement 的优点有很多:-
当执行“准备”语句时,该语句被解析并且访问计划仅确定一次。根据您运行该语句的次数,这可以带来更好的性能。
当您通过 setString() 传递字符串数据时,您无需担心字符串数据中的特殊字符。在 execute(String) 中,数据中的任何单引号或分号都会导致解析错误。
更糟糕的是“sql 注入”攻击的工作方式。如果像 "x' from cust_table; delete from cust_table; select " 这样的字符串作为数据输入,它很可能会导致删除语句被解析和执行。
处理数字要高效得多。setInt 调用采用整数值,对于等效的 SQL 字符串,您必须将其转换为字符,然后 DBMS 必须将其转换回整数。
可读性。您编写一个带有几个问号的单个 SQL 语句,变量所在的位置相对容易阅读,而不是在心理上解析和分析一系列字符串连接,因为转义引号等会产生额外的噪音。
然而,在某些情况下 execute(String) 实际上更好。
您的密钥分布非常不均匀。EG 如果您的客户中有 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++ 流是编写查询的最佳方式:
std::ostringstream sql;
sql << "exec loadStuff(" << param1 << ", " << param2 << ")";
不必担心参数的类型和字符串的长度很棒!
有一些东西叫做SOCI - C++ 的 C++ 数据库访问库