From cac0b9173487b1e98beb122e342033ed767a8c4d Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Wed, 19 Jun 2024 21:01:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=9E=E7=8E=B0mysql?= =?UTF-8?q?=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../lunadeer/dominion/dtos/DominionDTO.java | 176 +++++++++--------- .../cn/lunadeer/dominion/dtos/PlayerDTO.java | 85 ++++++--- .../dominion/dtos/PlayerPrivilegeDTO.java | 123 +++++++----- .../dominion/dtos/PrivilegeTemplateDTO.java | 64 +++++-- .../dominion/managers/DatabaseTables.java | 40 ++-- 6 files changed, 292 insertions(+), 198 deletions(-) diff --git a/pom.xml b/pom.xml index 319d6f3..0648b7f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.33.0-beta + 1.33.1-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java index 347b95c..6a757ef 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java @@ -4,14 +4,15 @@ import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Dominion; import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; +import cn.lunadeer.minecraftpluginutils.databse.Field; +import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; +import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; import org.bukkit.Location; import org.bukkit.World; -import java.awt.*; import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; -import java.util.List; public class DominionDTO { private static List query(String sql, Object... args) { @@ -21,37 +22,43 @@ public class DominionDTO { // 如果是更新操作,重新加载缓存 Cache.instance.loadDominions(); } - if (rs == null) return dominions; - while (rs.next()) { - Integer id = rs.getInt("id"); - UUID owner = UUID.fromString(rs.getString("owner")); - String name = rs.getString("name"); - String world = rs.getString("world"); - Integer x1 = rs.getInt("x1"); - Integer y1 = rs.getInt("y1"); - Integer z1 = rs.getInt("z1"); - Integer x2 = rs.getInt("x2"); - Integer y2 = rs.getInt("y2"); - Integer z2 = rs.getInt("z2"); - Integer parentDomId = rs.getInt("parent_dom_id"); - String tp_location = rs.getString("tp_location"); - Map flags = new HashMap<>(); - for (Flag f : Flag.getDominionFlagsEnabled()) { - flags.put(f, rs.getBoolean(f.getFlagName())); - } - String color = rs.getString("color"); - - DominionDTO dominion = new DominionDTO(id, owner, name, world, x1, y1, z1, x2, y2, z2, parentDomId, - rs.getString("join_message"), - rs.getString("leave_message"), - flags, - tp_location, - color - ); - dominions.add(dominion); - } + return getDTOFromRS(rs); } catch (SQLException e) { - Dominion.database.handleDatabaseError("数据库操作失败: ", e, sql); + DatabaseManager.handleDatabaseError("数据库操作失败: ", e, sql); + } + return dominions; + } + + private static List getDTOFromRS(ResultSet rs) throws SQLException { + List dominions = new ArrayList<>(); + if (rs == null) return dominions; + while (rs.next()) { + Integer id = rs.getInt("id"); + UUID owner = UUID.fromString(rs.getString("owner")); + String name = rs.getString("name"); + String world = rs.getString("world"); + Integer x1 = rs.getInt("x1"); + Integer y1 = rs.getInt("y1"); + Integer z1 = rs.getInt("z1"); + Integer x2 = rs.getInt("x2"); + Integer y2 = rs.getInt("y2"); + Integer z2 = rs.getInt("z2"); + Integer parentDomId = rs.getInt("parent_dom_id"); + String tp_location = rs.getString("tp_location"); + Map flags = new HashMap<>(); + for (Flag f : Flag.getDominionFlagsEnabled()) { + flags.put(f, rs.getBoolean(f.getFlagName())); + } + String color = rs.getString("color"); + + DominionDTO dominion = new DominionDTO(id, owner, name, world, x1, y1, z1, x2, y2, z2, parentDomId, + rs.getString("join_message"), + rs.getString("leave_message"), + flags, + tp_location, + color + ); + dominions.add(dominion); } return dominions; } @@ -111,33 +118,34 @@ public class DominionDTO { } public static DominionDTO insert(DominionDTO dominion) { - StringBuilder sql = new StringBuilder("INSERT INTO dominion (" + - "owner, name, world, x1, y1, z1, x2, y2, z2, "); - for (Flag f : Flag.getAllDominionFlags()) { - sql.append(f.getFlagName()).append(", "); + Field owner = new Field("owner", dominion.getOwner().toString()); + Field name = new Field("name", dominion.getName()); + Field world = new Field("world", dominion.getWorld()); + Field x1 = new Field("x1", dominion.getX1()); + Field y1 = new Field("y1", dominion.getY1()); + Field z1 = new Field("z1", dominion.getZ1()); + Field x2 = new Field("x2", dominion.getX2()); + Field y2 = new Field("y2", dominion.getY2()); + Field z2 = new Field("z2", dominion.getZ2()); + Field parentDomId = new Field("parent_dom_id", dominion.getParentDomId()); + Field joinMessage = new Field("join_message", "欢迎来到 ${DOM_NAME}!"); + Field leaveMessage = new Field("leave_message", "你正在离开 ${DOM_NAME},欢迎下次光临~"); + Field tpLocation = new Field("tp_location", "default"); + InsertRow insert = new InsertRow().returningAll().table("dominion").onConflictDoNothing(new Field("id", null)); + insert.field(owner).field(name).field(world).field(x1).field(y1).field(z1).field(x2).field(y2).field(z2) + .field(parentDomId).field(joinMessage).field(leaveMessage).field(tpLocation); + for (Flag f : Flag.getDominionFlagsEnabled()) { + insert.field(new Field(f.getFlagName(), f.getDefaultValue())); } - sql.append("tp_location, join_message, leave_message"); - sql.append(") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, "); - for (Flag f : Flag.getAllDominionFlags()) { - sql.append(f.getDefaultValue()).append(", "); + try (ResultSet rs = insert.execute()) { + Cache.instance.loadDominions(); + List dominions = getDTOFromRS(rs); + if (dominions.size() == 0) return null; + return dominions.get(0); + } catch (SQLException e) { + DatabaseManager.handleDatabaseError("数据库操作失败: ", e, insert.toString()); + return null; } - sql.append("'default', ?, ?"); - sql.append(") RETURNING *;"); - List dominions = query(sql.toString(), - dominion.getOwner(), - dominion.getName(), - dominion.getWorld(), - dominion.getX1(), - dominion.getY1(), - dominion.getZ1(), - dominion.getX2(), - dominion.getY2(), - dominion.getZ2(), - "欢迎来到 ${DOM_NAME}!", - "你正在离开 ${DOM_NAME},欢迎下次光临~" - ); - if (dominions.size() == 0) return null; - return dominions.get(0); } public static void delete(DominionDTO dominion) { @@ -153,34 +161,36 @@ public class DominionDTO { Location loc = dominion.getTpLocation(); tp_location = loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ(); } - StringBuilder sql = new StringBuilder("UPDATE dominion SET " + - "owner = ?," + - "name = ?," + - "world = ?," + - "x1 = " + dominion.getX1() + ", " + - "y1 = " + dominion.getY1() + ", " + - "z1 = " + dominion.getZ1() + ", " + - "x2 = " + dominion.getX2() + ", " + - "y2 = " + dominion.getY2() + ", " + - "z2 = " + dominion.getZ2() + ", " + - "parent_dom_id = " + dominion.getParentDomId() + ", " + - "join_message = ?," + - "leave_message = ?," + - "color = ?,"); + Field owner = new Field("owner", dominion.getOwner().toString()); + Field name = new Field("name", dominion.getName()); + Field world = new Field("world", dominion.getWorld()); + Field x1 = new Field("x1", dominion.getX1()); + Field y1 = new Field("y1", dominion.getY1()); + Field z1 = new Field("z1", dominion.getZ1()); + Field x2 = new Field("x2", dominion.getX2()); + Field y2 = new Field("y2", dominion.getY2()); + Field z2 = new Field("z2", dominion.getZ2()); + Field parentDomId = new Field("parent_dom_id", dominion.getParentDomId()); + Field joinMessage = new Field("join_message", dominion.getJoinMessage()); + Field leaveMessage = new Field("leave_message", dominion.getLeaveMessage()); + Field tpLocation = new Field("tp_location", tp_location); + Field color = new Field("color", dominion.getColor()); + Field id = new Field("id", dominion.getId()); + UpdateRow update = new UpdateRow().returningAll(id).table("dominion").where("id = ?", id.value); for (Flag f : Flag.getDominionFlagsEnabled()) { - sql.append(f.getFlagName()).append(" = ").append(dominion.getFlagValue(f)).append(","); + update.field(new Field(f.getFlagName(), dominion.getFlagValue(f))); + } + update.field(owner).field(name).field(world).field(x1).field(y1).field(z1).field(x2).field(y2).field(z2) + .field(parentDomId).field(joinMessage).field(leaveMessage).field(tpLocation).field(color); + try { + List dominions = getDTOFromRS(update.execute()); + Cache.instance.loadDominions(); + if (dominions.size() == 0) return null; + return dominions.get(0); + } catch (SQLException e) { + DatabaseManager.handleDatabaseError("数据库操作失败: ", e, update.toString()); + return null; } - sql.append("tp_location = ?" + " WHERE id = ").append(dominion.getId()).append(" RETURNING *;"); - List dominions = query(sql.toString(), - dominion.getOwner().toString(), - dominion.getName(), - dominion.getWorld(), - dominion.getJoinMessage(), - dominion.getLeaveMessage(), - dominion.getColor(), - tp_location); - if (dominions.size() == 0) return null; - return dominions.get(0); } private DominionDTO(Integer id, UUID owner, String name, String world, diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java index 4825423..99d6eb1 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java @@ -1,10 +1,15 @@ package cn.lunadeer.dominion.dtos; -import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; +import cn.lunadeer.minecraftpluginutils.databse.Field; +import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; +import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; import org.bukkit.entity.Player; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -30,18 +35,24 @@ public class PlayerDTO { private static List query(String sql, Object... params) { List players = new ArrayList<>(); - try (ResultSet rs = Dominion.database.query(sql, params)) { - if (rs == null) return players; - while (rs.next()) { - Integer id = rs.getInt("id"); - UUID uuid = UUID.fromString(rs.getString("uuid")); - String lastKnownName = rs.getString("last_known_name"); - Long lastJoinAt = rs.getTimestamp("last_join_at").getTime(); - PlayerDTO player = new PlayerDTO(id, uuid, lastKnownName, lastJoinAt); - players.add(player); - } + try (ResultSet rs = DatabaseManager.instance.query(sql, params)) { + return getDTOFromRS(rs); } catch (SQLException e) { - Dominion.database.handleDatabaseError("查询玩家信息失败: ", e, sql); + DatabaseManager.handleDatabaseError("查询玩家信息失败: ", e, sql); + } + return players; + } + + private static List getDTOFromRS(ResultSet rs) throws SQLException { + List players = new ArrayList<>(); + if (rs == null) return players; + while (rs.next()) { + Integer id = rs.getInt("id"); + UUID uuid = UUID.fromString(rs.getString("uuid")); + String lastKnownName = rs.getString("last_known_name"); + Long lastJoinAt = rs.getTimestamp("last_join_at").getTime(); + PlayerDTO player = new PlayerDTO(id, uuid, lastKnownName, lastJoinAt); + players.add(player); } return players; } @@ -72,24 +83,44 @@ public class PlayerDTO { } private static PlayerDTO insert(PlayerDTO player) { - String sql = "INSERT INTO player_name (uuid, last_known_name, last_join_at) " + - "VALUES" + - " (?, ?, CURRENT_TIMESTAMP) " + - "RETURNING *;"; - List players = query(sql, player.getUuid().toString(), player.getLastKnownName()); - if (players.size() == 0) return null; - return players.get(0); + Field uuid = new Field("uuid", player.getUuid().toString()); + Field lastKnownName = new Field("last_known_name", player.getLastKnownName()); + Field lastJoinAt = new Field("last_join_at", Timestamp.valueOf(LocalDateTime.now())); + InsertRow insertRow = new InsertRow() + .table("player_name") + .field(uuid) + .field(lastKnownName) + .field(lastJoinAt) + .returningAll() + .onConflictOverwrite(new Field("id", null)); + try (ResultSet rs = insertRow.execute()) { + List players = getDTOFromRS(rs); + if (players.size() == 0) return null; + return players.get(0); + } catch (SQLException e) { + DatabaseManager.handleDatabaseError("插入玩家信息失败: ", e, insertRow.toString()); + return null; + } } private static PlayerDTO update(PlayerDTO player) { - String sql = "UPDATE player_name SET " + - "last_known_name = ?, " + - "last_join_at = CURRENT_TIMESTAMP " + - "WHERE uuid = ? " + - "RETURNING *;"; - List players = query(sql, player.getLastKnownName(), player.getUuid().toString()); - if (players.size() == 0) return null; - return players.get(0); + Field lastKnownName = new Field("last_known_name", player.getLastKnownName()); + Field uuid = new Field("uuid", player.getUuid().toString()); + Field lastJoinAt = new Field("last_join_at", Timestamp.valueOf(LocalDateTime.now())); + UpdateRow updateRow = new UpdateRow() + .table("player_name") + .field(lastKnownName) + .field(lastJoinAt) + .where("uuid = ?", uuid.value) + .returningAll(uuid); + try (ResultSet rs = updateRow.execute()) { + List players = getDTOFromRS(rs); + if (players.size() == 0) return null; + return players.get(0); + } catch (SQLException e) { + DatabaseManager.handleDatabaseError("更新玩家信息失败: ", e, updateRow.toString()); + return null; + } } private PlayerDTO(Integer id, UUID uuid, String lastKnownName, Long lastJoinAt) { diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java index ec11ef1..1ffcbef 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java @@ -1,35 +1,84 @@ package cn.lunadeer.dominion.dtos; import cn.lunadeer.dominion.Cache; -import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; +import cn.lunadeer.minecraftpluginutils.databse.Field; +import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; +import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; import java.sql.ResultSet; import java.util.*; public class PlayerPrivilegeDTO { + private static List getDTOFromRS(ResultSet rs) { + List players = new ArrayList<>(); + if (rs == null) return players; + try { + while (rs.next()) { + Map flags = new HashMap<>(); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + flags.put(f, rs.getBoolean(f.getFlagName())); + } + PlayerPrivilegeDTO player = new PlayerPrivilegeDTO( + rs.getInt("id"), + UUID.fromString(rs.getString("player_uuid")), + rs.getBoolean("admin"), + rs.getInt("dom_id"), + flags + ); + players.add(player); + } + } catch (Exception e) { + DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, ""); + } + return players; + } + + private static PlayerPrivilegeDTO update(PlayerPrivilegeDTO player) { + Field admin = new Field("admin", player.getAdmin()); + Field domID = new Field("dom_id", player.getDomID()); + Field id = new Field("id", player.getId()); + UpdateRow updateRow = new UpdateRow().returningAll(id) + .table("player_privilege") + .field(admin) + .field(domID) + .where("id = ?", id.value); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + updateRow.field(new Field(f.getFlagName(), player.getFlagValue(f))); + } + try (ResultSet rs = updateRow.execute()) { + Cache.instance.loadPlayerPrivileges(); + List players = getDTOFromRS(rs); + if (players.size() == 0) return null; + return players.get(0); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("更新玩家权限失败: ", e, ""); + return null; + } + } + public static PlayerPrivilegeDTO insert(PlayerPrivilegeDTO player) { - StringBuilder sql = new StringBuilder("INSERT INTO player_privilege (player_uuid, admin, dom_id, "); - - for (Flag f : Flag.getAllPrivilegeFlags()) { - sql.append(f.getFlagName()).append(", "); + Field playerUUID = new Field("player_uuid", player.getPlayerUUID().toString()); + Field admin = new Field("admin", player.getAdmin()); + Field domID = new Field("dom_id", player.getDomID()); + InsertRow insertRow = new InsertRow().returningAll().onConflictDoNothing(new Field("id", null)) + .table("player_privilege") + .field(playerUUID) + .field(admin) + .field(domID); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + insertRow.field(new Field(f.getFlagName(), player.getFlagValue(f))); } - sql = new StringBuilder(sql.substring(0, sql.length() - 2)); - - sql.append(") VALUES ('") - .append(player.getPlayerUUID()).append("', ") - .append(player.getAdmin()).append(", ") - .append(player.getDomID()).append(", "); - - for (Flag f : Flag.getAllPrivilegeFlags()) { - sql.append(player.getFlagValue(f)).append(", "); + try (ResultSet rs = insertRow.execute()) { + Cache.instance.loadPlayerPrivileges(); + List players = getDTOFromRS(rs); + if (players.size() == 0) return null; + return players.get(0); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("插入玩家权限失败: ", e, ""); + return null; } - sql = new StringBuilder(sql.substring(0, sql.length() - 2)); - - sql.append(") RETURNING *;"); - List players = query(sql.toString()); - if (players.size() == 0) return null; - return players.get(0); } public static PlayerPrivilegeDTO select(UUID playerUUID, Integer dom_id) { @@ -125,44 +174,16 @@ public class PlayerPrivilegeDTO { private static List query(String sql, Object... params) { List players = new ArrayList<>(); - try (ResultSet rs = Dominion.database.query(sql, params)) { + try (ResultSet rs = DatabaseManager.instance.query(sql, params)) { if (sql.contains("UPDATE") || sql.contains("DELETE") || sql.contains("INSERT")) { // 如果是更新操作,重新加载缓存 Cache.instance.loadPlayerPrivileges(); } - if (rs == null) return players; - while (rs.next()) { - Map flags = new HashMap<>(); - for (Flag f : Flag.getPrivilegeFlagsEnabled()) { - flags.put(f, rs.getBoolean(f.getFlagName())); - } - PlayerPrivilegeDTO player = new PlayerPrivilegeDTO( - rs.getInt("id"), - UUID.fromString(rs.getString("player_uuid")), - rs.getBoolean("admin"), - rs.getInt("dom_id"), - flags - ); - players.add(player); - } + return getDTOFromRS(rs); } catch (Exception e) { - Dominion.database.handleDatabaseError("查询玩家权限失败: ", e, sql); + DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, sql); } return players; } - private static PlayerPrivilegeDTO update(PlayerPrivilegeDTO player) { - String sql = "UPDATE player_privilege SET " + - "admin = " + player.getAdmin() + ", " + - "dom_id = " + player.getDomID() + ", "; - for (Flag f : Flag.getPrivilegeFlagsEnabled()) { - sql += f.getFlagName() + " = " + player.getFlagValue(f) + ", "; - } - sql = sql.substring(0, sql.length() - 2); - sql += " WHERE id = " + player.getId() + " " + - "RETURNING *;"; - List players = query(sql); - if (players.size() == 0) return null; - return players.get(0); - } } diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java index 67484e7..b12e1ad 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java @@ -1,6 +1,9 @@ package cn.lunadeer.dominion.dtos; -import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; +import cn.lunadeer.minecraftpluginutils.databse.Field; +import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; +import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; import java.sql.ResultSet; import java.util.*; @@ -9,8 +12,18 @@ public class PrivilegeTemplateDTO { private static List query(String sql, Object... params) { List templates = new ArrayList<>(); - try (ResultSet rs = Dominion.database.query(sql, params)) { - if (rs == null) return templates; + try (ResultSet rs = DatabaseManager.instance.query(sql, params)) { + return getDTOFromRS(rs); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("查询权限模版失败: ", e, sql); + } + return templates; + } + + private static List getDTOFromRS(ResultSet rs) { + List templates = new ArrayList<>(); + if (rs == null) return templates; + try { while (rs.next()) { Map flags = new HashMap<>(); for (Flag f : Flag.getPrivilegeFlagsEnabled()) { @@ -26,16 +39,26 @@ public class PrivilegeTemplateDTO { templates.add(template); } } catch (Exception e) { - Dominion.database.handleDatabaseError("查询权限模版失败: ", e, sql); + DatabaseManager.handleDatabaseError("查询权限模版失败: ", e, null); } return templates; } public static PrivilegeTemplateDTO create(UUID creator, String name) { - String sql = "INSERT INTO privilege_template (creator, name) VALUES (?, ?) RETURNING *;"; - List templates = query(sql, creator.toString(), name); - if (templates.size() == 0) return null; - return templates.get(0); + Field creatorField = new Field("creator", creator.toString()); + Field nameField = new Field("name", name); + InsertRow insertRow = new InsertRow().table("privilege_template").onConflictDoNothing(new Field("id", null)) + .field(creatorField) + .field(nameField) + .returningAll(); + try (ResultSet rs = insertRow.execute()) { + List templates = getDTOFromRS(rs); + if (templates.size() == 0) return null; + return templates.get(0); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("创建权限模版失败: ", e, null); + return null; + } } public static PrivilegeTemplateDTO select(UUID creator, String name) { @@ -102,16 +125,25 @@ public class PrivilegeTemplateDTO { } private static PrivilegeTemplateDTO update(PrivilegeTemplateDTO template) { - StringBuilder sql = new StringBuilder("UPDATE privilege_template SET " + - "name = ?, " + - "admin = ?, "); + Field name = new Field("name", template.getName()); + Field admin = new Field("admin", template.getAdmin()); + Field id = new Field("id", template.getId()); + UpdateRow updateRow = new UpdateRow().table("privilege_template") + .field(name) + .field(admin) + .returningAll(id) + .where("id = ?", id.value); for (Flag f : Flag.getPrivilegeFlagsEnabled()) { - sql.append(f.getFlagName()).append(" = ").append(template.getFlagValue(f)).append(", "); + updateRow.field(new Field(f.getFlagName(), template.getFlagValue(f))); + } + try (ResultSet rs = updateRow.execute()) { + List templates = getDTOFromRS(rs); + if (templates.size() == 0) return null; + return templates.get(0); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("更新权限模版失败: ", e, updateRow.toString()); + return null; } - sql = new StringBuilder(sql.substring(0, sql.length() - 2) + " WHERE id = ? RETURNING *;"); - List templates = query(sql.toString(), template.getName(), template.getAdmin(), template.getId()); - if (templates.size() == 0) return null; - return templates.get(0); } } diff --git a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java index 4d87c8a..f141507 100644 --- a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java +++ b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java @@ -11,9 +11,9 @@ import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; public class DatabaseTables { public static void migrate() { // player name - TableColumn player_name_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); - TableColumn player_name_uuid = new TableColumn("uuid", FieldType.STRING, false, false, true, true, null); - TableColumn player_name_last_known_name = new TableColumn("last_known_name", FieldType.STRING, false, false, true, false, null); + TableColumn player_name_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); + TableColumn player_name_uuid = new TableColumn("uuid", FieldType.STRING, false, false, true, true, "''"); + TableColumn player_name_last_known_name = new TableColumn("last_known_name", FieldType.STRING, false, false, true, false, "'unknown'"); TableColumn player_name_last_join_at = new TableColumn("last_join_at", FieldType.DATETIME, false, false, true, false, "CURRENT_TIMESTAMP"); CreateTable player_name = new CreateTable().ifNotExists(); player_name.table("player_name") @@ -24,16 +24,16 @@ public class DatabaseTables { player_name.execute(); // dominion table - TableColumn dominion_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); - TableColumn dominion_owner = new TableColumn("owner", FieldType.STRING, false, false, true, false, null); - TableColumn dominion_name = new TableColumn("name", FieldType.STRING, false, false, true, false, null); - TableColumn dominion_world = new TableColumn("world", FieldType.STRING, false, false, true, false, null); - TableColumn dominion_x1 = new TableColumn("x1", FieldType.INT, false, false, true, false, null); - TableColumn dominion_y1 = new TableColumn("y1", FieldType.INT, false, false, true, false, null); - TableColumn dominion_z1 = new TableColumn("z1", FieldType.INT, false, false, true, false, null); - TableColumn dominion_x2 = new TableColumn("x2", FieldType.INT, false, false, true, false, null); - TableColumn dominion_y2 = new TableColumn("y2", FieldType.INT, false, false, true, false, null); - TableColumn dominion_z2 = new TableColumn("z2", FieldType.INT, false, false, true, false, null); + TableColumn dominion_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); + TableColumn dominion_owner = new TableColumn("owner", FieldType.STRING, false, false, true, false, "''"); + TableColumn dominion_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'"); + TableColumn dominion_world = new TableColumn("world", FieldType.STRING, false, false, true, false, "'world'"); + TableColumn dominion_x1 = new TableColumn("x1", FieldType.INT, false, false, true, false, 0); + TableColumn dominion_y1 = new TableColumn("y1", FieldType.INT, false, false, true, false, 0); + TableColumn dominion_z1 = new TableColumn("z1", FieldType.INT, false, false, true, false, 0); + TableColumn dominion_x2 = new TableColumn("x2", FieldType.INT, false, false, true, false, 0); + TableColumn dominion_y2 = new TableColumn("y2", FieldType.INT, false, false, true, false, 0); + TableColumn dominion_z2 = new TableColumn("z2", FieldType.INT, false, false, true, false, 0); TableColumn dominion_parent_dom_id = new TableColumn("parent_dom_id", FieldType.INT, false, false, true, false, -1); TableColumn dominion_join_message = new TableColumn("join_message", FieldType.STRING, false, false, true, false, "'欢迎'"); TableColumn dominion_leave_message = new TableColumn("leave_message", FieldType.STRING, false, false, true, false, "'再见'"); @@ -59,9 +59,9 @@ public class DatabaseTables { dominion.execute(); // player privilege - TableColumn player_privilege_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); - TableColumn player_privilege_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, null); - TableColumn player_privilege_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, null); + TableColumn player_privilege_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); + TableColumn player_privilege_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, "''"); + TableColumn player_privilege_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1); TableColumn player_privilege_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); CreateTable.ForeignKey player_privilege_player_uuid_fk = new CreateTable.ForeignKey(player_privilege_player_uuid, "player_name", player_name_uuid, true); CreateTable.ForeignKey player_privilege_dom_id_fk = new CreateTable.ForeignKey(player_privilege_dom_id, "dominion", dominion_id, true); @@ -74,7 +74,7 @@ public class DatabaseTables { .foreignKey(player_privilege_player_uuid_fk) .foreignKey(player_privilege_dom_id_fk) .unique(player_privilege_player_uuid, player_privilege_dom_id); - player_name.execute(); + player_privilege.execute(); // server root player name Field server_player_name_id_field = new Field("id", -1); @@ -131,9 +131,9 @@ public class DatabaseTables { new AddColumn(dominion_tp_location).table("dominion").ifNotExists().execute(); // 1.31.0 - TableColumn privilege_template_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); - TableColumn privilege_template_creator = new TableColumn("creator", FieldType.STRING, false, false, true, false, null); - TableColumn privilege_template_name = new TableColumn("name", FieldType.STRING, false, false, true, false, null); + TableColumn privilege_template_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); + TableColumn privilege_template_creator = new TableColumn("creator", FieldType.STRING, false, false, true, false, "''"); + TableColumn privilege_template_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'"); TableColumn privilege_template_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); CreateTable.ForeignKey privilege_template_creator_fk = new CreateTable.ForeignKey(privilege_template_creator, "player_name", player_name_uuid, true); CreateTable privilege_template = new CreateTable().ifNotExists();