1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Стартап Работа с базой данных SQLite.

Тема в разделе "Разработка плагинов для новичков", создана пользователем DzinLer, 18 сен 2017.

?

Продолжать ли?

Голосование закрыто 22 сен 2017.
  1. Да

    4 голосов
    66,7%
  2. Нет

    2 голосов
    33,3%
  1. Автор темы
    DzinLer

    DzinLer Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    PashkaNy6ashka
    Приветствую всех читателей! В этом Стартапе я расскажу о том, как подключаться к базе данных, как создавать таблицы, как добавлять туда данные и многое другое...
    Иногда надоедает использовать конфиги для хранения информации, и вам придётся использовать Базы Данных. Работать с ними не очень сложно.
    Нам необходимо:
    - Умение писать плагины.
    - Любая IDE, в моём случае Eclipse
    - JDBC драйвер - https://bitbucket.org/xerial/sqlite-jdbc/downloads/
    - Терпение
    - Базовое знание синтаксиса SQLite - https://ruseller.com/lessons.php?id=2277&rub=34 и http://xbb.uz/db/Tipy-dannyh-v-SQLite-versii-3
    Глава 1 - Подготовка среды.
    Введение:

    Ну что же, пришла пора начинать!
    В этой главе мы настроим среду, создадим необходимые классы.
    Начало:
    Создаём проект в нашей IDE или используем уже готовый, в моём случаи Eclipse, и добавляем туда библиотеки JDBC и Bukkit/Spigot API. (Я думаю показывать это не надо, если вы не знаете как это делать, то научитесь сначала делать плагины). Делаем главный класс и другие необходимые для вас классы. Примерно так выглядит у меня проект:
    upload_2017-9-18_18-43-20.png
    У вас он может выглядеть по другому.
    Далее мы начинаем делать классы для Базы Данных.
    Нам необходимо сделать пакет, назвать его можно как угодно, я же назову его database.
    И в этом пакете сделать два класса:
    Первый: Абстрактный класс, его имя может быть любым, я назову его DataBaseCore. P.S - Если вы не знаете что это такое, то я рекомендую вам почитать статьи об этом виде классов.
    Второй: Класс для самого подключения к Базе Данных, его имя может быть любым, в моём случаи SQLite.
    Как сделать Абстрактный класс?
    Код:
    package Имя вашего пакета;
    
    public abstract class Имя абстрактного класса {
    
    }
    Итог:
    Мы завершили Главу #1. Эта глава была очень лёгкой.
    Можно приступить ко второй!!!
    Глава 2 - Подключение к Базе Данных.
    Введение:

    В этой главе мы научимся делать подключение к нашей Базе Данных.
    Начало:
    И так, пожалуй начнём с настройки класса DataBaseCore.
    Нам нужно написать код, который пригодится вам при подключении.
    Код:
    package Имя вашего пакета;
    
    import java.sql.Connection;
    
    import Местонахождение главного класса;
    
    public abstract class Имя абстрактного класса {
    
        Имя главного класса plugin;
     
         public Имя вашего абстрактного класса(Имя вашего главного класса instance){
              plugin = instance;
         }
    
         public abstract Connection getDBConnection();
    
         public abstract void load();
    }
    Нам нужно создать Абстрактные методы, то есть обязательные.
    Первый: Метод получения подключения, называем его как угодно, я же назову его getDBConnection
    Второй: Метод создания таблиц, которые нам будут нужны, называем к вам угодно, я назову его load
    Делается это так:
    Код:
    package Имя вашего пакета;
    
    import java.sql.Connection;
    
    public abstract class Имя абстрактного класса {
    
        public abstract Connection getDBConnection();
     
        public abstract void load();
    }
    P.S - Обязательно при импорте Connection используем: java.sql.Connection
    С этим классом мы временно закончили, в следующих главах мы будем настраивать его. Там будут храниться все ваши методы для работы с Базой Данных.
    Так же в этом классе нужно объявить переменную типа Connection под именем con, Statement под именем stat, ResultSet под именем rs;
    Код:
    package Имя вашего пакета;
    
    import java.sql.Connection;
    
    public abstract class Имя абстрактного класса {
    
        Connection con;
        Statement stat;
        ResultSet rs;
    
        Имя главного класса plugin;
     
         public Имя вашего абстрактного класса(Имя вашего главного класса instance){
              plugin = instance;
         }
    
        public abstract Connection getDBConnection();
     
        public abstract void load();
    }
    Теперь сделаем настройку класса SQLite.
    Для начала сделаем этот класс главным для нашего Абстрактного Класса.
    Код:
    package Имя пакета;
    
    public class Имя класса для подключения extends Имя Абстрактного класса {
    
    }
    Далее вылетает нам ошибка! Нужно создать конструктор, значит делаем его.
    Код:
    package Местонахождение главного класса;
    
    import место нахождения вашего главного класса ;
    
    public class Имя класса с подключением extends Имя абстрактного класса {
    
        public Имя класса подключения(Имя главного класса instance) {
            super(instance);
        }
    
    }
    Опять же нам вылетает ошибка! Мы должны сделать два метода: getDBConnection и load
    Вот так всё выглядит:
    Код:
    package Имя пакета;
    
    import java.sql.Connection
    
    import Местонахождение главного класса;
    
    public class Имя класса с подключением extends Имя абстрактного класса {
    
        public Имя класса с подключением(Имя главного класса instance) {
            super(instance);
        }
    
        public Connection getDBConnection() {
            return null;
        }
    
        public void load() {
         
        }
    
    }
    Пришло время делать подключение!
    Начнём с метода getDBConnection:
    Нам необходимо сделать файл в котором будет находиться База Данных.
    Я думаю многие знают как это сделать, но я покажу на всякий случай:
    Код:
    package Имя пакета;
    
    import java.sql.Connection;
    
    import Местонахождение главного класса;
    
    public class Имя класса с подключением extends Имя абстрактного класса {
    
        public Имя класса с подключением(Имя главного класса instance) {
            super(instance);
        }
    
        File dbFile = new File(plugin.getDataFolder() + File.separator + "Имя Базы Данных.db");
    
     
         public Connection getDBConnection() {
               if(plugin.getDataFolder().mkdirs()) {
                   plugin.getDataFolder().mkdirs();
               }
               if(!dbFile.exists()) {
                   try {
                       dbFile.createNewFile();
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
               }
         }
      
    
    
        public void load() {
         
        }
    
    }
    При помощи этого кода мы создаём файл Базы Данных.
    Теперь, мы точно знаем что файл Базы Данных существует.
    Можно сделать само подключение.
    Код:
    package Имя пакета;
    
    import java.sql.Connection;
    
    import Местонахождение главного класса;
    
    public class Имя класса с подключением extends Имя абстрактного класса {
    
        public Имя класса с подключением(Имя главного класса instance) {
            super(instance);
        }
    
        File dbFile = new File(plugin.getDataFolder() + File.separator + "Имя Базы Данных.db");
    
     
         public Connection getDBConnection() {
               if(plugin.getDataFolder().mkdirs()) {
                   plugin.getDataFolder().mkdirs();
               }
               if(!dbFile.exists()) {
                   try {
                       dbFile.createNewFile();
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
                   try {
                Class.forName("org.sqlite.JDBC");
                con = DriverManager.getConnection("jdbc:sqlite:" + dbFile);
                return con;
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
                    return null;
               }
         }
      
    
    
        public void load() {
        
        }
    
    }
    Сделаю объяснение кода.
    При помощи кода:
    Код:
    try {
                Class.forName("org.sqlite.JDBC");
                con = DriverManager.getConnection("jdbc:sqlite:" + dbFile);
                return con;
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
    Мы создаём подключение. В качестве пути для подключения мы используем наш файл dbFile.
    Ну и на этом подключение к Базе Данных установлено!
    P.S - Обязательно прочтите статью про основной синтаксис SQLite, https://ruseller.com/lessons.php?id=2277&rub=34 и http://xbb.uz/db/Tipy-dannyh-v-SQLite-versii-3
    Далее настроим метод load:
    В этом методе нам нужно присвоить значение переменной con, значением является метод getDBConnection, и создать переменную типа String с любым именем, я назову её query и ей нужно присвоить значение, значение будет кодом для создания Таблицы в Базе Данных SQLite.
    Код:
    public void load() {
            con = getDBConnection();
            String query = "CREATE TABLE IF NOT EXISTS players ( id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar(255));";
    }
    У моей таблицы будет имя players, а графы будут id, name
    Я буду сохранять туда игроков при первом заходе на сервер.
    Далее мы должны сделать запрос на обновление Базы Данных, то есть мы должны объявить переменную Statement, я сделаю это с именем stat и дать ей значение con.createStatement()
    И в методе load прописать данный код:
    Код:
        public void load() {
            con = getDBConnection();
            String query = "CREATE TABLE IF NOT EXISTS players ( id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar(255));";
            try {
                stat = con.createStatement();
                stat.executeUpdate(query);
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    Обязательно закрываем statement.
    И таких запросов можно сделать сколько угодно.
    Итог:
    Мы сделали подключение к базе данных, в следующей Главе мы научимся добавлять и получать данные.
    Глава 3 - Работа с данными.
    Введение:

    Мы научимся работать с данными, получать их, добавлять и многое другое.
    Начало:
    Нам нужно вернуться в наш Абстрактный класс. И там мы будем хранить наши методы.
    По типу: Добавление данных, Удаление данных и т.п
    Начнём с добавления данных:
    Сделаем метод insert
    Вот таким образом
    Код:
    public void insert(String name) {
          
        }
    В переменную name мы будем добавлять имя игрока.
    В переменную con добавляем метод getDBConnection
    Вот так это выглядит:
    Код:
        public void insert(String name) {
            con = getDBConnection();
        }
    Далее мы объявляем переменную типа String с именем query.
    И вносим в нее такие данные:
    Код:
        public void insert(String name) {
            con = getDBConnection();
            String query = "INSERT INTO players (name) VALUES ('" + name + "');";
        }
    Так вот, этим кодом мы добавляем значение в таблицу players, в скобках указанно что мы добавляем, а после VALUES в скобках указанно само значения, его нужно поместить в такие скобочки: 'name'
    Далее мы опять делаем запрос на обновление:
    Код:
        public void insert(String name) {
            con = getDBConnection();
            String query = "INSERT INTO players (name) VALUES ('" + name + "');";
            try {
                stat = con.createStatement();
                stat.executeUpdate(query);
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    Ну вот и готов метод добавления данных, теперь используйте его как пожелаете.
    Метод добавления готов!!! Пора сделать метод получения данных.
    Вот как он выглядит:
    Код:
        public void select(String name) {
           
        }
    Далее присваиваем переменной con значение getDBConnection
    Объявляем переменную типа String, под именем query
    Код:
        public void select(String name) {
            con = getDBConnection();
            String query = "SELECT name FROM players;";
        }
    Объясню значение переменной query, SELECT name - Получаем графу name, FROM players - Из таблицы players
    Далее переменной rs присваиваем значение con.createStatement().executeQuery(query)
    Код:
        public void select(String name) {
            con = getDBConnection();
            String query = "SELECT name FROM players;";
            try {
                rs = con.createStatement().executeQuery(query);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    Т.к значений будет много, нам нужно воспользоваться циклом while
    Далее работаем с результатом как угодно.
    Можно его поместить в переменную, лично я помещу его в переменную.
    Делается это так:
    Код:
        public void select(String name) {
            con = getDBConnection();
            String query = "SELECT name FROM players;";
            try {
                rs = con.createStatement().executeQuery(query);
                while(rs.next()) {
                    String name2 = rs.getString("name");
                   
                }
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    Что бы получить определённую строку или число нужно ввести, rs.getString("name"), если вы хотите получить число то, rs.getInt("id').
    Обязательно в конце используем rs.close(), не в цикле while, а после него!!!
    Теперь мы получили результат и работаем с ним как захотим.
    Итог:
    Я научил вас основам, если захотите буду рассказывать дальше о многом другом.
    Всем спасибо кто читал! Жду критики, без этого никак)
    Если заметите опечатку или ошибку, сообщите мне!
     
    Последнее редактирование: 19 сен 2017
  2. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Последнее редактирование: 19 сен 2017
  3. Rider3217

    Rider3217 Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Planet0111
    Если честно, то говно. Статей в интернете по этому поводу миллион и постоянно появляются новые, которые намного лучше этой. Так что смысла в этой статье не вижу.
     
  4. TheZefirrkka

    TheZefirrkka Активный участник Пользователь

    Баллы:
    76
    Читаю начало темы, вижу создание класса и тут конец главы #1, ахах, ор.
     
  5. Автор темы
    DzinLer

    DzinLer Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    PashkaNy6ashka
    С рождения привык к sqlite, если там можно использовать синтаксис Sqlite, то я вполне могу перейти на неё.
     
  6. Автор темы
    DzinLer

    DzinLer Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    PashkaNy6ashka
    Ну да согласен, просто вопросов стало много про SQlite на форуме, вот и решил Стартап сделать.
     
  7. Juicex

    Juicex Ньюби

    Баллы:
    1
    Имя в Minecraft:
    MishaSok
    Если есть кто живой?
    Можно пример того, как это можно использовать в создании плагинов?
    Например я хочу для теста сделать команду /players, которая в чат отправит все никнеймы игроков, которые есть в базе данных.
     
  8. Ande_Gluk

    Ande_Gluk Активный участник

    Баллы:
    61
    Имя в Minecraft:
    _Ande_Gluk_
    Тут и дб не нужны, можно через yml файл сделать
     

Поделиться этой страницей