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本身添加任何例程)
# 1 楼答案
您能够对表名应用限制吗?这可能比引用更容易。例如,如果您可以说所有表名都必须匹配
[0-9A-Za-z_]+
的正则表达式,那么我认为您不需要任何引用。如果您需要空格,您可以使用`table name`
而不必担心“完整”引用限制可用内容通常比处理所有可能性要简单得多:)
# 2 楼答案
如果您想更加安全,可以准备一个查询并使用提供的表名调用它,以检查它是否确实存在:
(这个
WHERE
条件可能需要一些更正,因为我现在没有mysql)