我正在对家庭卷进行最后的润色QueryBuilder
具有 postgresql 数据库的 Web 应用程序的类。它用PreparedStatement
适用于所有查询,并防止 SQL 注入。
然而我想要一种“快速而肮脏”的方式来表示QueryBuilder
以其toString()
方法,仅用于调试目的。该方法将按照通常传递到的方式组装查询字符串PreparedStatement
,然后简单地替换每个?
在字符串中及其相应的单引号值。这toString()
javadoc 将警告其他开发人员,这是一个不安全的近似值,仅用于调试等。
我知道这些值应该将单引号加倍(即O'Connell
逃到O''Connell
)。还有其他我忘记的特殊字符需要处理吗?我寻找类似的问题,但只发现人们被骂使用PreparedStatement
(他们应该这样做,让记录显示)。
EDIT:不想使用第三方工具来完成这个特定的任务,我真的只是想要快速而肮脏的工具。尽管如此,我还是很欣赏这些链接——我可能会考虑将它们用于其他用途。
最后编辑:感谢大家的有用指点。我只是想补充一点,对于任何从谷歌偶然发现这里的人,请做not使用这些技巧来处理任何访问数据库的事情,使用PreparedStatement
.
对于“快速而肮脏”的转义,将撇号加倍就足够了。不过,请注意字符串文字中已经存在的问号:
SELECT column FROM table WHERE column = 'A question?' or column = ?
您不想替换第一个问号。此外,还应该注意这些极端情况:
SELECT /* Is this a comment?? */ * FROM table
-- -- -- Another comment??
WHERE column = ?
该语句中只有一个绑定值。对于不太快速和肮脏的解决方案,您可以使用类似的库jOOQ http://www.jooq.org不过,对于这个问题(免责声明:我在 jOOQ 背后的公司工作)。它会为你做内联,也为更讨厌的数据类型做内联:
DSLContext ctx = DSL.using(SQLDialect.POSTGRES);
Object[] bindValues = { 1, "a'bc", Date.valueOf("2012-09-24"), "xy".getBytes() };
String string = ctx.query(
"SELECT 1 WHERE A = ? AND B = ? AND C = ? AND D = ?",
bindValues).toString();
上面将呈现
SELECT 1
WHERE A = 1
AND B = 'a''bc'
AND C = date '2012-09-24'
AND D = E'\\170\\171::bytea
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)