- Баллы
- 66
- Имя в Minecraft
- Klavy
Итак, приветствую. В этом туториале я расскажу и покажу на наглядном примере работу с MySQL на Bukkit.
Если вы не знакомы с малейшими основами Java или Bukkit, рекомендую сначала обратиться к туториалам, часто названных как "Первый плагин Bukkit" и тп.
Использовать мы будем драйвер JDBC, он уже содержится в Bukkit'е, импортировать ничего дополнительного не надо.
С MySQL работать желательно только в асинхронном потоке, что мы и будем делать.
Для начала, следует создать отдельный класс для БД. В моём случае он будет называться SQLConnection. Класс будет объектом, конструктор будет пустым (все самое необходимое в connect() будет).
Далее создаём метод для соединения. Он будет у нас публичным, не статическим. В нём запрашиваем данные для соединения - хост, имя пользователя, пароль, имя базы. Если вы хотите добавить поддержку нестандартного порта (не 3306), добавьте еще int port
Теперь, добавим приватную переменную типа Connection (пакета java.sql). В ней будем держать соединение к базе. Назову её connection. Содержание - null
Так как мы работаем в асинхронном потоке. добавим запрос на BukkitScheduler в connect()
На месте Main.getInstance() идёт JavaPlugin, инициализированный класс plugin.yml
После этого, можем добавить содержимое метода connect. Для начала рекомендую проверить, не открыто ли уже соединение. В метод добавим:
Метода close() пока нет, добавим его в скором времени.
Добавляем само соединение. Так как DriverManager#getConnection бросает SQLException, используем try и catch. getConnection требует MySQL-ссылку, имя пользователя и пароль.
Как вы могли заметить, я добавил 3 парамента к соединению. Первые 2 для нормального отображения кодировки utf8. autoReconnect можете заменить по вкусу; он отвечает за автоподключение при потере соединения, запрашивает булеан.
С методом close() все достаточно просто. У Connection есть метод close, чем мы и воспользуемся. public/private - решайте по нужде.
Можете уже себя похвалить. Осталось только сделать пару методов на запросы. Если будете их ставить в сторонние классы, не забудьте про getter connection'а. Я делаю это в классе SQLConnection, мне геттер не требуется.
Рассмотрим мы 3 метода PreparedStatement и их использование.
executeQuery() - Этот метод используется для получения каких либо данных из базы. Возвращает ResultSet - еще один класс, содержащий в себе ответ.
executeUpdate() - Используется для модификации содержимого базы данных (например: INSERT, DELETE, UPDATE). Возвращает int, содержащий в себе кол-во модифицированных строк.
execute() - Используется для любого типа запроса. Возвращает boolean, зависимый от наличия ResultSet в ответе
Пример использования:
Используйте в асинхронном потоке.
Запрашивать в главном классе очень просто.
На этом всё.
Будут какие либо вопросы, пишите
(Это лишь первая версия туториала. Могут содержаться опечатки, я не робот
)
Если ничего не понятно, вот вам первая помощь:
Если вы не знакомы с малейшими основами Java или Bukkit, рекомендую сначала обратиться к туториалам, часто названных как "Первый плагин Bukkit" и тп.
Использовать мы будем драйвер JDBC, он уже содержится в Bukkit'е, импортировать ничего дополнительного не надо.
С MySQL работать желательно только в асинхронном потоке, что мы и будем делать.
Для начала, следует создать отдельный класс для БД. В моём случае он будет называться SQLConnection. Класс будет объектом, конструктор будет пустым (все самое необходимое в connect() будет).
Код:
public SQLConnection() {}
Далее создаём метод для соединения. Он будет у нас публичным, не статическим. В нём запрашиваем данные для соединения - хост, имя пользователя, пароль, имя базы. Если вы хотите добавить поддержку нестандартного порта (не 3306), добавьте еще int port
Код:
public void connect(String host, String username, String password, String databaseName)
{
}
Теперь, добавим приватную переменную типа Connection (пакета java.sql). В ней будем держать соединение к базе. Назову её connection. Содержание - null
Код:
private Connection connection;
Так как мы работаем в асинхронном потоке. добавим запрос на BukkitScheduler в connect()
Код:
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () ->
{
});
После этого, можем добавить содержимое метода connect. Для начала рекомендую проверить, не открыто ли уже соединение. В метод добавим:
Код:
if (connection != null)
{
close();
}
Добавляем само соединение. Так как DriverManager#getConnection бросает SQLException, используем try и catch. getConnection требует MySQL-ссылку, имя пользователя и пароль.
Код:
try
{
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://" + host + ":3306/" + databaseName + "?useUnicode=true&characterEncoding=utf8&autoReconnect=true" , username, password);
}
catch (SQLException ex)
{
ex.printStackTrace();
}
С методом close() все достаточно просто. У Connection есть метод close, чем мы и воспользуемся. public/private - решайте по нужде.
Код:
public void close()
{
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () ->
{
try {
connection.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
});
}
Можете уже себя похвалить. Осталось только сделать пару методов на запросы. Если будете их ставить в сторонние классы, не забудьте про getter connection'а. Я делаю это в классе SQLConnection, мне геттер не требуется.
Рассмотрим мы 3 метода PreparedStatement и их использование.
executeQuery() - Этот метод используется для получения каких либо данных из базы. Возвращает ResultSet - еще один класс, содержащий в себе ответ.
executeUpdate() - Используется для модификации содержимого базы данных (например: INSERT, DELETE, UPDATE). Возвращает int, содержащий в себе кол-во модифицированных строк.
execute() - Используется для любого типа запроса. Возвращает boolean, зависимый от наличия ResultSet в ответе
Пример использования:
Код:
try
{
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
}
catch (SQLException ex)
{
ex.printStackTrace();
}
Запрашивать в главном классе очень просто.
Код:
private SQLConnection connection;
public void onEnable()
{
connection = new SQLConnection();
connection.connect(/* Параметры */);
}
На этом всё.
Будут какие либо вопросы, пишите

(Это лишь первая версия туториала. Могут содержаться опечатки, я не робот
Если ничего не понятно, вот вам первая помощь:
Могу добавить свой класс для примера.
Код:package Example.db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; public class MySQL { private Connection conn; private Statement statmt; private PreparedStatement preparedStatement = null; public MySQL(String url, String dbName, String user, String pass) { try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection( "jdbc:mysql://" + url + "/" + dbName + "?useUnicode=true&characterEncoding=utf8&autoReconnect=true", user, pass); statmt = conn.createStatement(); statmt.execute( "CREATE TABLE IF NOT EXISTS `users` (`user` varchar(255) PRIMARY KEY,`time` varchar(255) NOT NULL)"); } catch (Exception e) { e.printStackTrace(); } } public void insert(String user, Long time) { try { PreparedStatement e = conn .prepareStatement("INSERT INTO users (user,time) VALUES (?,?) ON DUPLICATE KEY UPDATE time = ?;"); e.setString(1, user); e.setLong(2, time); e.setLong(3, time); e.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } } public ArrayList<String> select(String user) { try { preparedStatement = conn.prepareStatement("SELECT * FROM users WHERE user = ?;"); preparedStatement.setString(1, user); ResultSet e = preparedStatement.executeQuery(); ArrayList<String> item = new ArrayList<String>(); if (e.next()) { item.add(e.getString("user")); item.add(e.getString("time")); return item; } } catch (Exception e) { e.printStackTrace(); } return null; } }
Последнее редактирование:
(Все же так хотят MySQL)
