您更喜欢哪种方法来创建动态SQL查询?格式化或流式传输?它只是偏好或有什么理由比其他更好吗?或者你使用它的任何特殊库.
编辑:请回答c ++的情况.
总是使用"prepare"会有一个与prepareStatement等价的东西,但确切的函数名将取决于你的数据库和驱动程序组合.
预处理执行(String)的优点很多: -
解析语句并且访问计划仅在执行"prepare"语句时确定一次.根据您运行语句的次数,这可以带来更好的性能.
通过setString()传递时,您不必担心字符串数据中的特殊字符.在execute(String)中,数据中的任何单引号或分号都将导致解析错误.
更糟糕的是,"sql注入"攻击是如何工作的.如果字符串类似于来自cust_table的"x";从cust_table中删除;选择"作为数据输入,则可能导致删除语句被解析和执行.
处理数字更有效率.setInt调用采用整数值,就像必须转换为字符的等价SQL字符串一样,然后DBMS必须将其转换回整数.
可读性.您编写一个带有几个问号的SQL语句,其中变量相对容易阅读,而不是精神分析和分析一系列字符串连接将为转义引号等提供额外的噪音.
然而,有几种情况下execute(String)实际上更好.
你的钥匙分布非常不均匀的地方.EG如果您的95%的客户居住在美国,并且您想列出居住在加拿大的4%,那么"where country =?" 通常会导致表空间扫描,而"country ='CA'"则有可能使用索引.
另一种情况是用户可以输入或省略多个搜索条件.为给出的条件构建SQL字符串要好得多,而不是构造一个复杂的查询来处理输入条件的所有可能的排列.