Помогите 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.8.8 до 1.12.2 подключил SpigotAPI 1.12.2 и в результате, с ранее работающего плагина получаю такой вот результат:
Код:
java.sql.SQLException: Values not bound to statement
<------>at org.sqlite.core.CorePreparedStatement.checkParameters(CorePreparedStatement.java:64) ~[middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.sqlite.jdbc3.JDBC3PreparedStatement.executeQuery(JDBC3PreparedStatement.java:73) ~[middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.wealth_mc.mystery.db.Database.initialize(Database.java:41) [Mystery.jar:?]
<------>at net.wealth_mc.mystery.db.SQLite.load(SQLite.java:98) [Mystery.jar:?]
<------>at net.wealth_mc.mystery.Mystery.onEnable(Mystery.java:88) [Mystery.jar:?]
<------>at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:337) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:403) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugin(CraftServer.java:382) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugins(CraftServer.java:331) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.MinecraftServer.t(MinecraftServer.java:422) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.MinecraftServer.l(MinecraftServer.java:383) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.MinecraftServer.a(MinecraftServer.java:338) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.DedicatedServer.init(DedicatedServer.java:272) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:545) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at java.lang.Thread.run(Thread.java:748) [?:1.8.0_151]

Код:
package net.wealth_mc.mystery.db;

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;

import net.wealth_mc.mystery.Mystery;

public class SQLite extends Database{

    private String dbname;

    public SQLite(Mystery instance){
        super(instance);
        dbname =  "Mystery";
    }
          
    public Connection getSQLConnection() {
        File dataFolder = new File(plugin.getDataFolder(), dbname+".db");
        if (!dataFolder.exists()){
            try {
                dataFolder.createNewFile();
            } catch (IOException e) {
                plugin.getLogger().log(Level.SEVERE, "File write error: "+dbname+".db");
            }
        }
        try {
            if(connection!=null && !connection.isClosed()){
                return connection;
            }
            Class.forName("org.sqlite.JDBC");
            connection = DriverManager.getConnection("jdbc:sqlite:" + dataFolder);
            return connection;
        } catch (SQLException ex) {
            plugin.getLogger().log(Level.SEVERE,"SQLite exception on initialize", ex);
        } catch (ClassNotFoundException ex) {
            plugin.getLogger().log(Level.SEVERE, "You need the SQLite JBDC library. Google it. Put it in /lib folder.");
        }
        return null;
    }
 
    public void load() {
        connection = getSQLConnection();   
        try {
            Statement s = connection.createStatement();
            s.executeUpdate("CREATE TABLE IF NOT EXISTS mystery_player_list ("
/* 1*/                + "`uniqueId` TEXT varchar(255) NOT NULL UNIQUE, "
/* 2*/                + "`displayName` TEXT varchar(100) NOT NULL UNIQUE, "
/* 3*/                + "`legacy` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/* 4*/                + "`legacy_info` TEXT varchar(255), "
/* 5*/                + "`legacy1` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/* 6*/                + "`legacy_info1` TEXT varchar(255), "
/* 7*/                + "`legacy2` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/* 8*/                + "`legacy_info2` TEXT varchar(255), "
/* 9*/                + "`legacy3` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/*10*/                + "`legacy_info3` TEXT varchar(255), "
/*11*/                + "`legacy4` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/*12*/                + "`legacy_info4` TEXT varchar(255), "
/*13*/                + "`gender` TEXT varchar(50) NOT NULL DEFAULT 'ASEX', "
/*14*/                + "`level` INTEGER, "
/*15*/                + "`timeLevel` INTEGER, "
/*16*/                + "`gamehours` INTEGER, "
/*17*/                + "`killLevel` INTEGER, "
/*18*/                + "`killTheirLegacy` INTEGER, "
/*19*/                + "`killAlienLegacy` INTEGER, "
/*20*/                + "`killNotLegacy` INTEGER, "
/*21*/                + "`IPadress` TEXT varchar(15) NOT NULL, "
/*22*/                + "`nomult` INTEGER, "
/*23*/                + "`register` INTEGER, "
/*24*/                + "`online` INTEGER,"
/*25*/                + "`grp` TEXT,"
/*26*/                + "`family` TEXT varchar(100),"
/*27*/                + "`bal0` TEXT,"
/*28*/                + "`bal1` TEXT,"
/*39*/                + "`bal2` TEXT,"
/*30*/                + "`bal3` TEXT,"
/*31*/                + "`bal4` TEXT,"
/*32*/                + "`bal5` TEXT,"
/*33*/                + "`bal6` TEXT,"
/*34*/                + "`bal7` TEXT,"
/*35*/                + "`bal8` TEXT, PRIMARY KEY (`uniqueId`));");
            s.executeUpdate("CREATE TABLE IF NOT EXISTS three_legacy ("
/* 1*/                + "`legacy` TEXT varchar(255) NOT NULL UNIQUE,"
/* 2*/                + "`lord_uniqueId` TEXT varchar(255) NOT NULL UNIQUE,"
/* 3*/                + "`legacyLevel` INTEGER,"
/* 4*/                + "`legacyInteger` INTEGER,"
/* 5*/                + "`legacyInfo`, PRIMARY KEY (`legacy`));");

            s.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        initialize(); // ***************Это строка № 98*************
    }

}

Код:
package net.wealth_mc.mystery.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.regex.Pattern;

import net.wealth_mc.mystery.Mystery;
import net.wealth_mc.mystery.family.HomeLoc;

public abstract class Database {

    protected Mystery plugin;
    protected Connection connection;
    public String three_legacy;
    public String mystery_player_list;

    public Database(Mystery instance){
        this.plugin = instance;
        this.three_legacy = "three_legacy";
        this.mystery_player_list = "mystery_player_list";
    }

    public abstract Connection getSQLConnection();

    public abstract void load();

    /**
     * Инициализация БД
     */
    public void initialize(){
        connection = getSQLConnection();
        try{
            PreparedStatement ps = connection.prepareStatement("SELECT * FROM " + mystery_player_list + " WHERE uniqueId = ?");
            ResultSet rs = ps.executeQuery(); //**********Это строка № 41************
            close(ps,rs);
      
        } catch (SQLException ex) {                                                                                                                                                                                                                                                                                                                                                                   
            plugin.getLogger().log(Level.SEVERE, "Unable to retreive connection", ex);
        }
    }

    /**
     * Закрыть подключение к БД
     * @param ps
     * @param rs
     */
    public void close(PreparedStatement ps,ResultSet rs){
        try {
            if (ps != null)
                ps.close();
            if (rs != null)
                rs.close();
        } catch (SQLException ex) {
            Error.close(plugin, ex);
        }
    }
    /**
     * Получить double из String
     * @param bal
     * @return
     */
    public double getBalToStrins(String bal) {
        double balance = Double.parseDouble(bal);
        return balance;
    }
    /**
     * Получить List<UUID> из String
     * @param str
     * @return
     */
    public List<UUID> stringKindToList(String str) {
        List<UUID> uulist = new ArrayList<>();
        String newstr = str.replace("[", "").replace("]", "");
        List<String> list = new ArrayList<String>(Arrays.asList(newstr.split(", ")));
        for (int i = 0; i < list.size(); i++) {
            uulist.add(UUID.fromString(list.get(i)));
        }
        return uulist;
    }

    /**
     *
     * @param get HomeLoc to String
     * @return
     */

    public HomeLoc getHomeLoc(String str) {
        Pattern pattern = Pattern.compile(" ");
        String[] locitem = pattern.split(str);
        HomeLoc loc = new HomeLoc(
                Mystery.getInstance().getServer().getWorld(locitem[1]),
                getIntToString(locitem[2]),
                getIntToString(locitem[3]),
                getIntToString(locitem[4]));
        return loc;
    }


    /**
     *
     * @param get int to String
     * @return
     */
    private int getIntToString(String str) {
        int i = 0;
      
        try {
            i = Integer.parseInt(str);
        } catch (NumberFormatException e) {
        }
      
        return i;
    }
}

Не подскажете где мне что нужно копать?
параметр не указал
 
Зачем вы апаете уже ужасную связку java sqlite. Ставте H2 и радуйтесь быстрой скоростью работы.
 
Назад
Верх