gpt4 book ai didi

java - MySQL 中的切换行语句不返回任何内容

转载 作者:行者123 更新时间:2023-11-29 11:48:42 25 4
gpt4 key购买 nike

我目前正在编写一个 MySQL 插件,并希望从数据库中读取第二行具有特殊值的每一第一行:

private String ip;

public MySqlNPCData(String host, int port){
this.ip = host + ":" + port;
}

public List<UUID> getUUIDs(){
try {
PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT UUID FROM npc_data WHERE IP = ?");
ps.setString(1, ip);
ResultSet rs = ps.executeQuery();
ArrayList<UUID> IDs = new ArrayList<>();
if(!rs.next()) {
rs.close();
return null;
}
while(rs.next()) {
IDs.add(UUID.fromString(rs.getString("UUID")));
}
for(UUID s : IDs){
System.out.println(s.toString());
}
return IDs;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}

public boolean contains(NPC npc){
try {
PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT IP FROM npc_data WHERE UUID = ?;");
ps.setString(1, npc.UID.toString());
ResultSet rs = ps.executeQuery();
return rs.next();
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}

@SuppressWarnings("static-access")
public void save(NPC npc){
if(!contains(npc)){
try {
PreparedStatement ps = MySQL.getConnection().prepareStatement("INSERT INTO npc_data (UUID,IP,WORLD,X,Y,Z,YAW,PITCH,SKIN_UUID) "
+ "VALUES (?,?,?,?,?,?,?,?,?);");
ps.setString(1, npc.UID.toString());
ps.setString(2, ip);
ps.setString(3, npc.getLocation().getWorld().getName());
ps.setDouble(4, npc.getLocation().getX());
ps.setDouble(5, npc.getLocation().getY());
ps.setDouble(6, npc.getLocation().getZ());
ps.setFloat(7, npc.getLocation().getYaw());
ps.setFloat(8, npc.getLocation().getPitch());
ps.setString(9, npc.uuid);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}else{
try {
PreparedStatement ps = MySQL.getConnection().prepareStatement("UPDATE npc_data SET IP = ?, WORLD = ?, "
+ "X = ?, Y = ?, Z = ?, YAW = ?, PITCH = ?, SKIN_UUID = ? WHERE UUID = ?;");
ps.setString(1, npc.UID.toString());
ps.setString(2, ip);
ps.setString(3, npc.getLocation().getWorld().getName());
ps.setDouble(4, npc.getLocation().getX());
ps.setDouble(5, npc.getLocation().getY());
ps.setDouble(6, npc.getLocation().getZ());
ps.setFloat(7, npc.getLocation().getYaw());
ps.setFloat(8, npc.getLocation().getPitch());
ps.setString(9, npc.uuid);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

不幸的是,它总是在系统输出中不返回任何内容,有人可以帮助我吗?非常感谢

最佳答案

一些评论:

使用 JDBC 时,容器会为您完成一些工作,但不是很多。所以你必须考虑到这一点。

1) block :

    if(!rs.next()) {
rs.close();
return null;
}

不需要:如果没有数据,rs.next 返回 false。

2) 您检索连接的方式很可能导致连接不关闭:

MySQL.getConnection() 为您获取连接,但它不会显式关闭。在(例如)Tomcat 中,大多数情况下会导致 MySQL 上的连接使用量达到最大,然后在 Java 中出现异常,因为无法打开新连接。更好的方式是打开一个连接,并显式关闭它以及所有其他 JDBC 连接的资源:

Connection conn=MySQL.getConnection();
ResultSet rs=null;
PreparedStatement ps=null;
try {
... All you database actions
} finally {
try { if(ps!=null) ps.close(); } catch(Exception exp) {}
try { if(rs!=null) rs.close(); } catch(Exception exp) {}
try { conn.close(); } catch(Exception exp) {}
}

您当然可以将其封装到您正在使用的 MySQL 类中,这样您就不必到处编写它。

3)这也意味着代码:

public boolean contains(NPC npc){
try {
PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT IP FROM npc_data WHERE UUID = ?;");
ps.setString(1, npc.UID.toString());
ResultSet rs = ps.executeQuery();
return rs.next();
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}

必须重写为不返回rs.next(),而是返回一个显式对象:

public boolean contains(NPC npc){
Connection conn=MySQL.getConnection();
PreparedStatement ps=null;
ResultSet rs=null;
boolean retVal=false;
try {
ps = conn.prepareStatement("SELECT IP FROM npc_data WHERE UUID = ?");
ps.setString(1, npc.UID.toString());
rs = ps.executeQuery();
retVal=rs.next();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try { if(ps!=null) ps.close(); } catch(Exception exp) {}
try { if(rs!=null) rs.close(); } catch(Exception exp) {}
try { conn.close(); } catch(Exception exp) {}
}
return retVal;
}

观察 ;SELECT 语句中的删除:原始代码:

"SELECT IP FROM npc_data WHERE UUID = ?;"

应该是:

"SELECT IP FROM npc_data WHERE UUID = ?"

; 可以指示多个语句,并且可能导致不返回任何值。

您的代码还需要做更多工作,但我想您已经明白了。

关于java - MySQL 中的切换行语句不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34515751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com