无法从 MySql 获取特定数据

Can't get specific data from MySql

我想用 MySQL 数据库中的玩家填充 TableView。加载我正在使用的所有播放器

public void loadPlayerData() throws SQLException, ClassNotFoundException {
    Connection conn = ConnectionDB.connector();

    ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM player") ;

    while (rs.next()) { playersList.add(new Players
            (rs.getString("name"), rs.getString("familyName"),
                    rs.getString("email"), rs.getString("activeTeam")));

    }
    rs.close();

而且效果很好.. 但我只需要加载属于某个团队的特定玩家(团队名称显示在 TextField 中)并且我执行了以下操作:

    public void loadPlayerData() throws SQLException, ClassNotFoundException {
        Connection conn = ConnectionDB.connector();
        String s = teamName.getText();
        ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM player WHERE activeTeam='" + s + "'") ;
        while (rs.next()) { playersList.add(new Players
                (rs.getString("name"), rs.getString("familyName"),
                        rs.getString("email"), rs.getString("activeTeam")));
        }
        rs.close(); 

但它没有加载任何东西...我想我在语法上做错了,写错了 WHERE 子句,但我研究的所有内容都指向了同样的事情所以我想我必须在这里问

这与 java 中的数据库完全不同。

  1. 这是一个安全漏洞

假设 s 是:`"whatever' OR true; DROP TABLE player CASCADE; EXEC 'format c: /y'; --"

正确的方法是使用PreparedStatement

  1. 像筛子一样漏水

连接、语句、结果集全部使用后需要关闭。即使抛出异常。使用 try-with-resources 来解决这个问题。

可能 'doesnt work' 因为在 teamName 字段或诸如此类的地方还有一个额外的 space。

@Rzwitserloot 给出了很好的解释,我建议采用以下方法

编辑

添加了尝试使用资源构造 以防止泄漏。

 public void loadPlayerData() throws SQLException, ClassNotFoundException {

        try (Connection connection = ConnectionDb.connector) {
            String s = teamName.getText();
            PreparedStatement myStmt;
            myStmt = conn.prepareStatement("select * from player where activeTeam = ?");
            myStmt.setString(1, s);
            try (ResultSet rs = myStmt.executeQuery()) {
                while (rs.next()) {
                    playersList.add(new Players
                            (rs.getString("name"), rs.getString("familyName"),
                                    rs.getString("email"), rs.getString("activeTeam")));
                }
            }
        }
    }