Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

Метки:
Теги Теги
database sqlite база данных

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

  • Да

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

    2 голосов 33,3%

  • Опрос закрыт .

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, а после него!!!
Теперь мы получили результат и работаем с ним как захотим.
Итог:
Я научил вас основам, если захотите буду рассказывать дальше о многом другом.
Всем спасибо кто читал! Жду критики, без этого никак)
Если заметите опечатку или ошибку, сообщите мне!
 
Последнее редактирование:
Последнее редактирование:
Если честно, то говно. Статей в интернете по этому поводу миллион и постоянно появляются новые, которые намного лучше этой. Так что смысла в этой статье не вижу.
 
Серьезно? Не учитесь говну, юзайте H2
https://github.com/alexandrage/Example/blob/master/src/Example/H2.java
H2 не тормозит, в отличие от sqlite и синтаксис запросов можно переключить в любой привычный для вас mode=MySQL и тп.
С рождения привык к sqlite, если там можно использовать синтаксис Sqlite, то я вполне могу перейти на неё.
 
Если честно, то говно. Статей в интернете по этому поводу миллион и постоянно появляются новые, которые намного лучше этой. Так что смысла в этой статье не вижу.
Ну да согласен, просто вопросов стало много про SQlite на форуме, вот и решил Стартап сделать.
 
Если есть кто живой?
Можно пример того, как это можно использовать в создании плагинов?
Например я хочу для теста сделать команду /players, которая в чат отправит все никнеймы игроков, которые есть в базе данных.
 
Если есть кто живой?
Можно пример того, как это можно использовать в создании плагинов?
Например я хочу для теста сделать команду /players, которая в чат отправит все никнеймы игроков, которые есть в базе данных.
Тут и дб не нужны, можно через yml файл сделать
 

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

Назад
Верх