1

我有这样的代码和平:

String query = "SELECT * FROM utilisateurs WHERE pseudo = '" +  pseudo.getText()+ "' AND password = '" + new String(password.getPassword()) + "'";

我的问题是:没有其他方法可以将这些变量与字符串连接起来吗?

在 C# 中,我使用 String.Format() 方法作为:

String query = String.Format("SELECT * FROM utilisateurs WHERE pseudo = '{0}' AND password = '{1}'", pseudo.getText(), new String(password.getPassword()));
4

4 回答 4

17

String.format()可用于格式化字符串、Javadoc

public static String format(String format, Object... args)

返回使用指定格式字符串和参数的格式化字符串。

但是,在构建 SQL 查询字符串时,首选方法是使用PreparedStatement( Javadoc ):

  • 保护您免受 SQL 注入
  • 允许数据库缓存您的查询(构建一次查询计划)

您使用 a 的代码PreparedStatement可能如下所示:

final PreparedStatement pstmt = con.prepareStatement(
    "SELECT * FROM utilisateurs WHERE pseudo = ? AND password = ?");
pstmt.setString(1, pseudo.getText());
pstmt.setString(2, new String(password.getPassword()));
final ResultSet rs = pstmt.executeQuery();
于 2013-05-14T20:50:20.330 回答
4

正如其他人所说,String.format是直接等价的,但您应该使用 aPreparedStatement代替。从文档中

在以下设置参数的示例中,con 表示活动连接:

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                  SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)

使用 aPreparedStatement而不是String.format将保护您的代码免受 SQL 注入。

于 2013-05-14T20:54:02.693 回答
1

Java 有类似的方法来格式化你的字符串。String.format()

但是,如果您选择使用,您可以在此处PreparedStatement阅读文档

从文档中:

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
于 2013-05-14T20:52:57.420 回答
0

要直接回答您的问题,正如其他人所提到的,请使用 String.Format,这里有一个很好的资源:如何在 Scala 中使用 java.String.format?.

但是,在这个特定示例中,真正的答案不是进行字符串替换,而是在 SQL 语句中使用参数。

就像是:

query = 
String query = "SELECT * FROM utilisateurs WHERE pseudo = ? AND password = ?";
PreparedStatement ps = connection.prepareStatement(query);
ps.setString(1, pseudo.getText());
ps.setString(2, password.getPassword());
ResultSet rs = ps.executeQuery();
于 2013-05-14T20:57:29.217 回答