我目前正在编写一个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();
}
}
}不幸的是,它总是在系统输出中返回任何东西,有谁可以帮助我吗?非常感谢
发布于 2015-12-30 01:38:43
以下是一些备注:
在使用JDBC时,容器会为您做一些工作,但不是很多。所以你必须考虑到这一点。
1)区块:
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 = ?";可以指示多个语句,并可能导致不返回值。
在你的代码上需要做更多的工作,但我想你已经明白了。
https://stackoverflow.com/questions/34515751
复制相似问题