【问题标题】:create sql query in c++/java?在 C++/Java 中创建 sql 查询?
【发布时间】:2010-09-29 13:59:04
【问题描述】:

您更喜欢哪种方法来创建动态 sql 查询? 格式化还是流式传输? 只是偏好还是有任何理由比其他更好?或者您使用的任何特殊库。

编辑: 如果是c++请回答。

【问题讨论】:

    标签: java c++ sql format stream


    【解决方案1】:

    始终使用“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 字符串比构建一个复杂的查询来处理输入条件的所有可能排列要好得多。

    【讨论】:

      【解决方案2】:

      在 Java 中,您应该使用 PreparedStatement

      PreparedStatement statement = connection.prepareStatement("SELECT * FROM Table WHERE ID = ?");
      statement.setInt(1, 17);
      ResultSet resultSet = statement.executeQuery();
      

      【讨论】:

      • 不知道,C++ 不是我的一杯茶。 :)
      【解决方案3】:

      对于 C++,有一些叫做 SOCI - The C++ Database Access Library 的东西

      【讨论】:

        【解决方案4】:

        当无法使用准备好的语句时,我发现使用 C++ 流是编写查询的最佳方式:

        std::ostringstream sql;
        sql << "exec loadStuff(" << param1 << ", " << param2 << ")";
        

        不用担心参数的类型和字符串的长度很棒!

        【讨论】:

        • 我对否决投票犹豫不决,但我担心 SQL 注入攻击在该技术中的威胁。 :(
        • 很公平,但是当使用没有准备好的语句的库时,在主要处理数字的内部应用程序中,我发现这种模式对调用存储过程非常有用且有效。面向世界的网络应用程序将是另一回事。
        • 对不起,小鸭子。我没有抓住“无法使用准备好的语句时”位。我打算撤销我的反对票,但它声称我的反对票太老了,无法撤销。但是,如果您编辑答案,我可以撤销它。也许你可以加粗“不可能”来帮助和我有同样缺陷的人。 :)
        • 我推翻了反对票。现在我不能投票了,因为它太旧了!大声笑:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多