Сохранение данных

Spokers

Пользователь
Сообщения
70
Решения
1
Как правильно сохраняются данные из бд (Информация об игроке)
 
Ну вообще, как меня учили, надо создать отдельный класс, в котором будут храниться все переменные из бд, а потом этот класс пихать в List<CustomPlayer>, и уже с ним работать.
Java:
public class CustomPlayer {
    private int id;
    private UUID uuid;
    private long balance;
    private long level;
    private long xp;
    //До бесконечности
    
    public CustomPlayer(ResultSet rs) {
        try {
            this.id = rs.getInt("id");
            this.uuid = UUID.fromString(rs.getString("uuid"));
            //И т.д.
        }catch(SQLException ex) {
            ex.printStackTrace();
        }
    }
}
 
Java:
 ((HashMap<UUID, PrisonPlayer>)MessageManager.PLAYER_STATS.getO()).put(p.getUniqueId(), new PrisonPlayer(rs.getInt("id"), rs.getFloat("Balance"), rs.getInt("Lvl"), rs.getInt("Block")));
Получаю данные из бд
Java:
public class PrisonPlayer {
      
    private int id;
    private float gold;
    private int level;
    private int block;

    public PrisonPlayer(int id, float gold, int level, int block) {
        this.id = id;
        this.gold = gold;
        this.level = level;
        this.setBlock(block);
    }

    public int getLevel() {
        return level;
    }

    public float getGold() {
        return gold;
    }

    public int getId() {
        return id;
    }
    public void setLevel(int level) {
        this.level = level;
    }

    public void setGold(float gold) {
        this.gold = gold;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getBlock() {
        return block;
    }

    public void setBlock(int block) {
        this.block = block;
    }
}
 
BuseSo, ты сам каких-то вопросах говоришь что у меня не гуд в коде, кода использую HashMap, да и я видел в коде 1-ом что он не использовал этот хэш мап, вот и спросил
Объединено

Возможно не так поняли, но мне надо из бд сохранять данные в переменные, я использую метод HashMap но BuseSo ругается за это, хотелось бы узнать как вы сохраняете эти данные
Код который я использую
Java:
package Prison;

public class PlayerPrison {

    int Dead;
    int id;
    int Block;
    int Lvl;
    float Balance;
    int Kills;
    int Rat;

    public PlayerPrison (int id, float Balance, int Lvl, int Kills, int Rat, int Dead, int Block) {
        this.id = id;
        this.Balance = Balance;
        this.Lvl = Lvl;
        this.Kills = Kills;
        this.Rat = Rat;
        this.Dead = Dead;
        this.Block = Block;
    }

    public int getId() {
        return this.id;
    }

    public int getDead() {
        return this.Dead;
    }

    public int getBlock() {
        return this.Block;
    }

    public float getBalance() {
        return  this.Balance;
    }

    public int getLvl() {
        return this.Lvl;
    }

    public int getRat() {
        return this.Rat;
    }

    public int getKills() {
        return this.Kills;
    }

    public void setLvl(int lvl) {
        this.Lvl = lvl;
    }

    public void setRat(int rat) {
        this.Rat = rat;
    }

    public void setKills(int kills) {
        this.Kills = kills;
    }

    public void setBalance(float balance) {
        Balance = balance;
    }

    public void setBlock(int block) {
        Block = block;
    }

    public void setDead(int Dead) {
        this.Dead = Dead;
    }

    public void setId(int id) {
        this.id = id;
    }
}
Java:
package Prison.Events;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import Prison.PlayerPrison;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;

import Prison.Message.MessageManager;

public class CustomPlayer implements Listener {
    
    
    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        e.setJoinMessage(null);
        Player p = e.getPlayer();
        loadStats(p);
    }

    private void loadStats(Player p) {
        try {
            ResultSet rs = ((Statement)MessageManager.STATEMENT.getO()).executeQuery("SELECT * FROM `PrisonServer` WHERE uuid = '" + p.getUniqueId() + "';");
            if (rs.next()) {
                
            } else {
                ((Statement)MessageManager.STATEMENT.getO()).executeUpdate("INSERT INTO `PrisonServer`(`uuid`, `Nick`, `Balance`, `Lvl`, `Kills`, `RAT`, `Dead`, `Block`, `Frac`, `IP`) VALUES ('"+p.getUniqueId()+"','"+p.getName()+"','0','1','0','0','0','0','Zack','"+p.getAddress().getAddress()+":"+p.getAddress().getPort()+"')");
                new PlayerPrison(rs.getInt("id"),rs.getFloat("Balance"),rs.getInt("Lvl"),rs.getInt("Kills"),rs.getInt("Rat"),rs.getInt("Dead"),rs.getInt("Block"));
                loadStats(p);
            }
        } catch (SQLException e) {
            Bukkit.broadcastMessage(MessageManager.Error.getO()+"[1] Ошибка - Бд несуществует, проверьте правильность заполнение форм в [Config|CODE]!");
            e.printStackTrace();
        }
     }
}
 
Последнее редактирование:
Я бы создал мапу UUID-PlayerPrison и после получения данных из БД добавлял игрока.
Либо можно пострадать фигнёй с NMS. Расширить класс PlayerAbilities и в него добавить свои переменные, после чего заменив значение поля в EntityHuman -> abilities с помощью рефлексии на своё ¯\_(ツ)_/¯

[OFFTOPIC]
BuseSo, ты сам каких-то вопросах говоришь что у меня не гуд в коде, кода использую HashMap, да и я видел в коде 1-ом что он не использовал этот хэш мап, вот и спросил
Объединено

Возможно не так поняли, но мне надо из бд сохранять данные в переменные, я использую метод HashMap но BuseSo ругается за это, хотелось бы узнать как вы сохраняете эти данные
Код который я использую
Java:
package Prison;

public class PlayerPrison {

    int Dead;
    int id;
    int Block;
    int Lvl;
    float Balance;
    int Kills;
    int Rat;

    public PlayerPrison (int id, float Balance, int Lvl, int Kills, int Rat, int Dead, int Block) {
        this.id = id;
        this.Balance = Balance;
        this.Lvl = Lvl;
        this.Kills = Kills;
        this.Rat = Rat;
        this.Dead = Dead;
        this.Block = Block;
    }

    public int getId() {
        return this.id;
    }

    public int getDead() {
        return this.Dead;
    }

    public int getBlock() {
        return this.Block;
    }

    public float getBalance() {
        return  this.Balance;
    }

    public int getLvl() {
        return this.Lvl;
    }

    public int getRat() {
        return this.Rat;
    }

    public int getKills() {
        return this.Kills;
    }

    public void setLvl(int lvl) {
        this.Lvl = lvl;
    }

    public void setRat(int rat) {
        this.Rat = rat;
    }

    public void setKills(int kills) {
        this.Kills = kills;
    }

    public void setBalance(float balance) {
        Balance = balance;
    }

    public void setBlock(int block) {
        Block = block;
    }

    public void setDead(int Dead) {
        this.Dead = Dead;
    }

    public void setId(int id) {
        this.id = id;
    }
}
В чём был смысл делать геттеры/сеттеры и нарушать принцип инкапсуляции (защита данных от неправомерного использования)?
Как по мне в твоём случае все поля должны быть приватными
[OFFTOPIC]
Java:
    int Dead;
    int Block;
    int Lvl;
    int Kills;
    int Rat;
Кстати название переменных должно начинаться с маленькой буквы
[/OFFTOPIC]
[/OFFTOPIC]
 
Последнее редактирование:
private void loadStats(Player p) { try { ResultSet rs = ((Statement)MessageManager.STATEMENT.getO()).executeQuery("SELECT * FROM `PrisonServer` WHERE uuid = '" + p.getUniqueId() + "';"); if (rs.next()) { } else { ((Statement)MessageManager.STATEMENT.getO()).executeUpdate("INSERT INTO `PrisonServer`(`uuid`, `Nick`, `Balance`, `Lvl`, `Kills`, `RAT`, `Dead`, `Block`, `Frac`, `IP`) VALUES ('"+p.getUniqueId()+"','"+p.getName()+"','0','1','0','0','0','0','Zack','"+p.getAddress().getAddress()+":"+p.getAddress().getPort()+"')"); new PlayerPrison(rs.getInt("id"),rs.getFloat("Balance"),rs.getInt("Lvl"),rs.getInt("Kills"),rs.getInt("Rat"),rs.getInt("Dead"),rs.getInt("Block")); loadStats(p); } } catch (SQLException e) { Bukkit.broadcastMessage(MessageManager.Error.getO()+"[1] Ошибка - Бд несуществует, проверьте правильность заполнение форм в [Config|CODE]!"); e.printStackTrace(); } }
Метод бредовый, ты сам не знаешь что там делаешь. Просто так создал объект иииии заново используешь этот метод?.
Кстати, тут Redis очень подходит, ибо все сводится к ключ-значение.
 
Назад
Сверху Снизу