Некоторые соображения:
При проверке, содержит ли база данных определенное значение, это хорошая практика, чтобы сделать это, используя запрос, который возвращает одно значение (а не SELECT *
, который возвращает все столбцы всех строк, которые соответствуют WHERE
состояние). Вы можете сделать это, например. путем выбора одного проверки флага (SELECT 1
) с пунктом строки ограничения (LIMIT 1
):
SELECT 1 FROM playerinfo WHERE Username = ? LIMIT 1
Этот запрос гарантированно возвращать только одну строку (с одной колонке, «1»), если игрок с данное имя существует, или нет строк, если нет игроков с указанным именем.
Как указывали другие, когда вы вводите параметры в запрос, вы должны использовать PreparedStatement
вместо простого оператора с конкатенированными входами. Таким образом, вы можете избежать SQL-инъекции, и база данных также может повторно использовать/кэшировать запрос (или курсор) внутренне.
И, наконец, вы должны закрыть ресурсы, которые используете, даже если во время выполнения выдается Exception
. Это лучше всего сделать в предложении finally
, или если вы используете Java 7 или более позднюю версию, используя try-with-resources statement.
С этими вещами в виду, повторно написать свой код может выглядеть следующим образом:
PreparedStatement ps = null;
try {
ps = mySQL.getConnection()
.prepareStatement("SELECT 1 FROM playerinfo WHERE Username = ? LIMIT 1");
ps.setString(1, player.getName());
ResultSet rs = ps.executeQuery();
// the first invocation of rs.next() returns true if
// there are rows in the result set, or false if no rows were found
if (rs.next()) {
System.out.println("2");
Bukkit.getConsoleSender().sendMessage(ChatColor.RED
+ "Player already in database");
}
rs.close();
} finally {
if (ps != null) {
ps.close();
}
}
Первое, что нужно сделать: начать использовать параметризованный SQL вместо [SQL Injection Attack] (HTTP: // bobby-tables.com). Уязвимость у вас есть сейчас. –
'check' не будет' null', потому что вы назначаете ему значение. Вместо этого проверьте содержимое набора результатов, например. с 'check.next()'. –
Сколько строк в вашем 'check' ResultSet? Вы не проверяете это. –