无法从 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 中的数据库完全不同。
- 这是一个安全漏洞。
假设 s
是:`"whatever' OR true; DROP TABLE player CASCADE; EXEC 'format c: /y'; --"
正确的方法是使用PreparedStatement
。
- 像筛子一样漏水
连接、语句、和结果集全部使用后需要关闭。即使抛出异常。使用 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")));
}
}
}
}
我想用 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 中的数据库完全不同。
- 这是一个安全漏洞。
假设 s
是:`"whatever' OR true; DROP TABLE player CASCADE; EXEC 'format c: /y'; --"
正确的方法是使用PreparedStatement
。
- 像筛子一样漏水
连接、语句、和结果集全部使用后需要关闭。即使抛出异常。使用 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")));
}
}
}
}