有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

mysql我可以将表名作为参数传递给java准备的语句吗?

我正在用Java为Tomcat服务器应用程序编写DAO层

我希望使用Prepared语句包装我的查询(1.解析查询一次,2.抵御SQL注入), My db design包含每个数据源系统的MyISAM表。通过DBO的大多数查询都是使用不同的表名作为参数进行选择的

其中一些表可能是动态创建的

我已经读了很多文章,解释了我可能不使用表名作为准备语句的参数

我找到了一些解决方案,建议使用某种类型的函数(例如mysql\u real\u escape\u string)来处理此参数并将结果作为字符串附加到查询中

是否有任何内置的Jave库函数可以以最佳优化的方式完成它,或者您可能建议在DAO层中执行其他操作(我不喜欢向DB it本身添加任何例程)


共 (2) 个答案

  1. # 1 楼答案

    您能够对表名应用限制吗?这可能比引用更容易。例如,如果您可以说所有表名都必须匹配[0-9A-Za-z_]+的正则表达式,那么我认为您不需要任何引用。如果您需要空格,您可以使用`table name`而不必担心“完整”引用

    限制可用内容通常比处理所有可能性要简单得多:)

  2. # 2 楼答案

    如果您想更加安全,可以准备一个查询并使用提供的表名调用它,以检查它是否确实存在:

    PreparedStatement ps = conn.prepareStatement("SHOW TABLES WHERE tables = ?");
    ps.setString(1, nameToCheck);
    if(!ps.executeQuery().next())
      throw new RuntimeException("Illegal table name: " + nameToCheck);
    

    (这个WHERE条件可能需要一些更正,因为我现在没有mysql)