首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中交换row语句不返回任何内容

在MySQL中交换row语句不返回任何内容
EN

Stack Overflow用户
提问于 2015-12-30 01:16:58
回答 1查看 34关注 0票数 0

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

代码语言:javascript
复制
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();
        }
    }
}

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

EN

回答 1

Stack Overflow用户

发布于 2015-12-30 01:38:43

以下是一些备注:

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

1)区块:

代码语言:javascript
复制
    if(!rs.next()) {
        rs.close();
        return null;
    }

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

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

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

代码语言:javascript
复制
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)这也意味着代码:

代码语言:javascript
复制
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(),但返回一个显式对象:

代码语言:javascript
复制
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语句中删除;的过程:原始代码:

代码语言:javascript
复制
"SELECT IP FROM npc_data WHERE UUID = ?;"

应该是:

代码语言:javascript
复制
"SELECT IP FROM npc_data WHERE UUID = ?"

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34515751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档