【问题标题】:Can retrieve one record from database but not another using JDBC可以使用 JDBC 从数据库中检索一条记录,但不能检索另一条记录
【发布时间】:2019-05-04 20:45:43
【问题描述】:

因此,对于一个学校项目,我正在构建一个不和谐机器人。我内置的功能之一是他可以从 MySQL 数据库中检索 gif 链接,并在消息中发送它们。现在,我的问题是我只能从我的数据库中检索一条记录,而没有其他记录。如果我将使用的查询放入 MySQL 工作台并运行它,它将检索这些记录。

这是获取gif的方法

public static ArrayList<Gif> GetGifsFromDB(String msg){
    ArrayList<Gif> gifs = new ArrayList<>();

    try(Connection conn = (Connection)DriverManager.getConnection(url, userName, password)){
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        Statement stmnt = conn.createStatement();
        String sql = "Select * from gif WHERE Type = '" + msg + "'";
        stmnt.execute(sql);

        try(ResultSet rs = stmnt.getResultSet()){
            while(rs.next()){
            Gif g = new Gif();
            g.setID(rs.getInt("GifID"));
            g.setURL(rs.getString("GifURL"));
                System.out.println(g.getID() + g.getURL());
            gifs.add(g);
        }
        rs.close();
        conn.close();
        }

    }
    catch(SQLException ex){
        System.err.println(ex.getMessage());
    }
    catch(Exception ex){
        System.err.println(ex.getMessage());
    }

    return gifs;
}

数据库中的“类型”只是一个类别。根据我那里的测试数据,这3种类型是没有,惊讶和孤独。只有 no 返回一个 gif。

【问题讨论】:

  • 如果直接在数据库上执行最终的sql 查询会得到什么?
  • 如果我直接运行它,它会返回我试图取回的记录

标签: java mysql jdbc discord


【解决方案1】:

您的msg 很可能与数据库Type 列的任何值都不完全匹配。

运行测试

SELECT COUNT(*) FROM gif WHERE Type = '... put msg content here ...'

直接在数据库上手动执行此操作。

您也可以尝试将以下代码行放在最后:

System.out.println("Number of Selected Gifs: "+gifs.size());

如果其中任何一个结果为零,则表示msgType 不完全匹配。也许是大写/小写问题?

同时为了避免 SQL 注入和其他问题,请强烈考虑使用 PreparedStatement 的绑定变量。

【讨论】:

    【解决方案2】:

    问题最终是 MySql 没有将记录提交到数据库。刷新工作台后,添加的记录消失了。相当奇怪的是,即使记录不在数据库中,它们也可以被检索到。

    【讨论】:

    • 如果 insert 和 select 语句在同一个事务中运行,这是有道理的 - 查询已运行,​​返回新行,然后 然后 回滚插入。
    【解决方案3】:

    删除关闭的 ResultSet 和 Connection 行:

     rs.close();
     conn.close();
    

    您已经使用 try-with-resources 关闭它

    【讨论】:

    • List&lt;Gif&gt; 应该在明确关闭资源之前完全填满,但你是对的,try (Connection conn = (Connection)DriverManager.getConnection(url, userName, password)) 无论如何都应该关闭它...
    • 我删除了这些行,但问题仍然存在。
    • @ZacBeatty-Taylor 你也可以用ResultSet rs = stmnt.executeQuery(sql)替换吗
    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多