Помогите Java & SQLite

Korvinius

Активный участник
Пользователь
Баллы
88
Пришло время, когда мне понадобилась база данных. В моем случае, самый оптимальный вариант, это SQLite. Долго гуглил, ковырялся в чужих плагинах, но, что то у меня обучение работы с БД почти не продвигается, поэтому прошу совета у Вас, подскажите где можно об этом почитать, на русском, украинском или белорусском языках.
Я вот навырезал с чужих плагинов кусков:
Java:
    public static Connection conn = null;
    public static ResultSet rset = null;

    public static void connect() {
        try {
            Class.forName("org.sqlite.JDBC").newInstance();
            conn = DriverManager.getConnection("jdbc:sqlite://" + Mystery.instance.getDataFolder().getAbsolutePath() + "/Mystery.db");
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        executeSync("CREATE TABLE IF NOT EXISTS `three_legacy` (`id` INTEGER PRIMARY KEY, "
                + "`legacy` TEXT varchar(255) NOT NULL UNIQUE, "
                + "`lord_uniqueId` TEXT varchar(255) NOT NULL UNIQUE, "
                + "`legacyLevel` INTEGER NOT NULL");
    }

    public static void executeSync(String query) {
        if(!hasConnected()) {
            connect();
        }
        try {
            conn.createStatement().execute(strip(query));
        } catch (Exception e) {
        }
    }

    public static boolean hasConnected() {
        try {
            return !conn.isClosed();
        } catch (Exception e) {
            return false;
        }
    }

    public static String strip(String str) {
        str = str.replaceAll("<[^>]*>", "");
        str = str.replace("\\", "\\\\");
        str = str.trim();
        return str;
    }

    public static ResultSet executeQuery(String query) {
        if(!hasConnected()) {
            connect();
        }
        ResultSet res = null;
        try {
            res = conn.createStatement().executeQuery(strip(query));
        } catch (Exception e) {
        }

        return res;
    }
насколько я смог понять, метод connect() нужен для подключения к БД, чтения данных или создания таблиц, если она пуста, остальные методы как бы воспомогательные, или есть среди них ненужные? Что мне сюда нужно еще добавить, для полноценной работы с БД, то есть, записи, перезаписи, сохранения и так далее? Или это, что я наваял вообще никуда не годится? Короче прошу советов и ссылок на обучающие материалы 🙂
 
И не используйте статические методы там, где можно обойтись без них.
 
Бзз.. Бзз.. Только не вздумайте подключать либы. А то бывает народ который чтоб 1 число сейвнуть включают в плагин либу на 4 мб
Почти все средства вам необходимые уже есть в самой Java / Spigot'e
https://www.spigotmc.org/threads/how-to-sqlite.56847/
Ну не нужно.
 
А ещё пользуйтесь подготовленными выражениями, для защиты от инъекций. Костыли в прошлом.
Java:
public static String strip(String str) {
        str = str.replaceAll("<[^>]*>", "");
        str = str.replace("\\", "\\\\");
        str = str.trim();
        return str;
    }

    public static ResultSet executeQuery(String query) {
        if(!hasConnected()) {
            connect();
        }
        ResultSet res = null;
        try {
            res = conn.createStatement().executeQuery(strip(query));
        } catch (Exception e) {
        }

        return res;
    }
Твой strip не поможет, если я захочу дропнуть базу явно. Если уж и делать executeQuery статическим, то только с передачей conn и с предварительной проверкой conn на валидность.
 
Почти все средства вам необходимые уже есть в самой Java / Spigot'e
https://www.spigotmc.org/threads/how-to-sqlite.56847/
Спасибо большое, вроде начинаю понимать это дело, по немножку.
И не используйте статические методы там, где можно обойтись без них.
то есть вообще в плагине стараться не использовать статические методы или только в работе с базой данных?
 
Спасибо большое, вроде начинаю понимать это дело, по немножку.


то есть вообще в плагине стараться не использовать статические методы или только в работе с базой данных?
Просто пугают начинающего. Ничего страшного в статичных методах/константах нет, просто нужно уметь ими пользоваться.
https://stackoverflow.com/questions/2671496/java-when-to-use-static-methods
 
Спасибо большое, вроде начинаю понимать это дело, по немножку.


то есть вообще в плагине стараться не использовать статические методы или только в работе с базой данных?

Всегда пожалуйста 🙂

Просто пугают начинающего. Ничего страшного в статичных методах/константах нет, просто нужно уметь ими пользоваться.
https://stackoverflow.com/questions/2671496/java-when-to-use-static-methods
Вообще он прав. Очень даже.

А вот меня порой переклинивает и мне например начинает казаться что вполне хорошая идея писать без статиков или например без if'ов 😊
 
Просто пугают начинающего. Ничего страшного в статичных методах/константах нет, просто нужно уметь ими пользоваться.
https://stackoverflow.com/questions/2671496/java-when-to-use-static-methods
Ничего страшного нет до тех пор пока не познакоишься с класслоадером баккита, и не узнаешь что ссылка на синглтоны останется на старый инстанс и всё разъедется к чертям при перезагрузке плагина.
Короче аккуратно очёнь надо работать.
 
Ничего страшного нет до тех пор пока не познакоишься с класслоадером баккита, и не узнаешь что ссылка на синглтоны останется на старый инстанс и всё разъедется к чертям при перезагрузке плагина.
Короче аккуратно очёнь надо работать.
w8. То есть если реализовать классический синглтон со статиком в мейн классе, методом getInstance и присваиванием значения в onLoad, то все может пойти очень печально?
 
Всегда пожалуйста 🙂


Вообще он прав. Очень даже.

А вот меня порой переклинивает и мне например начинает казаться что вполне хорошая идея писать без статиков или например без if'ов 😊
У меня бывает приступ замены if на switch, везде, где возможно и невозможно. Правда вроде перестал так делать.
 
У меня бывает приступ замены if на switch, везде, где возможно и невозможно. Правда вроде перестал так делать.
Я это прошел. Сейчас порой отключаю себе поддержку Java 8 чтоб весь код незалямбдить 😁
 
Я это прошел. Сейчас порой отключаю себе поддержку Java 8 чтоб весь код незалямбдить 😁
По сути, нужно подталкивать слоупоков, чтобы ставили java 8, ибо потом сами жалуются на производительность.(В майне не хватает многопоточности, жаль все из-за этого хейтят java)
 
По сути, нужно подталкивать слоупоков, чтобы ставили java 8, ибо потом сами жалуются на производительность.(В майне не хватает многопоточности, жаль все из-за этого хейтят java)
Да хейтят потому что модно
И великие мыслители мыслят "ОХ ЕСЛИБ НА с++ ПЕРЕПИСАТЬ"
Если бы сервер писался на С++ так же "хорошо" как он написан на Java, то к лагам у нас бы еще добавились утечки памяти 😁

Я пишу для себя, потому Optional.ofNullable(event.getItem()).ifPresent <3
 
Да хейтят потому что модно
И великие мыслители мыслят "ОХ ЕСЛИБ НА с++ ПЕРЕПИСАТЬ"
Если бы сервер писался на С++ так же "хорошо" как он написан на Java, то к лагам у нас бы еще добавились утечки памяти 😁

Я пишу для себя, потому Optional.ofNullable(event.getItem()).ifPresent <3
Я тебе больше скажу, утечки памяти есть там даже сейчас.
 
w8. То есть если реализовать классический синглтон со статиком в мейн классе, методом getInstance и присваиванием значения в onLoad, то все может пойти очень печально?
Такой нет, потому что ссылка обновляется на onLoad.

Проблема будет когда статическая ссылка присваивается тольк на статик инициализации класса.
 
Просто пугают начинающего. Ничего страшного в статичных методах/константах нет, просто нужно уметь ими пользоваться.
https://stackoverflow.com/questions/2671496/java-when-to-use-static-methods
Страшного в них нету ничего, спору нет. Но когда в коде ты видишь 2-3 ссылки на одно и то же - проиграть как раз плюнуть.
Ну и как шевчик написал, синглтоны могут всё попортить (если что то пойдёт не так, разумеется), так что ссылку на основной класс приятнее передавать явно.
 
Назад
Верх