我知道很多不同方面都有过这方面的问题,但是我无法做到这一点。
我想使用JDBC将类似bottom-border: none;
的内容插入到mysql数据库中。我试图使用Java String替换方法来查找所有反斜杠并将它们转换为双反斜杠。在Java本身,我必须通过双反斜杠来逃避每个反斜杠,所以在我的理解中应该是它:
\mytext
我使用insert语句发送到数据库的结果字符串,用单引号括起来'像这样:
String sqlProcessed = sqlString.replace("\\", "\\\\")
但是,我没有显示预期结果,而是在数据库中得到双反斜杠,即String query = "INSERT INTO table VALUES ('" + sqlProcessed + "')";
。另一方面,没有处理,反斜杠就省略了,即我在数据库中得到\\mytext
。
我做错了什么?
答案 0 :(得分:3)
不要将值连接到查询字符串中(唯一有效的例外是,如果您需要动态确定表和列名)。
相反,您应该使用参数化(或准备好的)语句:
例如
try (PreparedStatement preparedStatement = connection.prepareStatement(
"insert into myTable (column1, column2, column3) values (?, ?, ?)")) {
preparedStatement.setString(1, "value1");
preparedStatement.setInt(2, 2);
preparedStatement.setString(3, "value3");
preparedStatement.executeUpdate();
}
使用预准备语句将消除数据库转义的需要(驱动程序负责此操作,或者参数值以不需要转义的方式发送到服务器),您只需要处理正常的Java String转义。
作为额外的奖励,您可以获得可重复使用的声明,您可以使用不同的值执行多次。在大多数数据库系统上(但是IIRC不在MySQL上,使用Connector / J驱动程序的默认设置),使用预准备语句可以(并且通常会)在重用时具有性能优势。
答案 1 :(得分:-1)
我会使用查询参数来代替使用params发短信进行查询。司机会帮助你喂养。