Java开发聊天应用如何从数据库拉取全部消息并整合为数组返回
问题根因
- 循环内提前返回:你在
while(rs.next())的循环逻辑中,拼接完单条消息就直接执行return语句,导致第一次循环执行完毕就直接结束方法,后续的消息根本没有机会查询和处理 - Java数组为定长结构:原生数组初始化后长度固定,无法直接追加新元素,你需要先用可变的集合容器存储所有查询到的消息,全部处理完后再统一转成数组返回
优化后代码
@RequestMapping(value={"/get/messages", "xyz"}, method={RequestMethod.POST,RequestMethod.PUT, RequestMethod.GET}) public String[] getMessages(@RequestBody GETMessages getMessages) throws JSONException, IOException { String chatroomID = getMessages.getChatroomID(); String sessionID = getMessages.getSessionID(); String username = getUserFromSessionID(sessionID); int userStatus = getUserStatusFromSessionID(sessionID); int userChatStatus = getUserChatStatusFromUsername(username, chatroomID); if(userStatus == 0 || userStatus == 2){ if(userChatStatus == 0){ Connection connection = null; // 改用PreparedStatement避免SQL注入风险 PreparedStatement pst = null; ResultSet rs = null; // 初始化可变集合存储所有消息 List<String> messageList = new ArrayList<>(); try{ Class.forName("com.mysql.cj.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://HOST/DBNAME", "USERNAME", "PASSWORD"); // 预编译SQL,避免拼接字符串导致的SQL注入 String sql = "SELECT * FROM messages WHERE chatroom = ?"; pst = connection.prepareStatement(sql); pst.setString(1, chatroomID); rs = pst.executeQuery(); while(rs.next()){ String message = rs.getString(2); String user = rs.getString(3); String timeday = rs.getString(5); String combined = message + "~" + user + "~" + timeday; // 单条消息追加到集合,不提前返回 messageList.add(combined); System.out.println(combined); } // 所有消息查询完成后,集合转数组返回 return messageList.toArray(new String[0]); } catch(Exception ex){ System.out.println("Exception : " + ex.toString()); return new String[]{"Exception : " + ex.toString()}; } finally { // 关闭数据库资源,避免资源泄漏 try { if(rs != null) rs.close(); if(pst != null) pst.close(); if(connection != null) connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }else if(userChatStatus == 1){ return new String[]{"You are still pending to join this chatroom"}; }else if(userChatStatus == 3){ systemReport(username, "Tried to access chatroom: " + chatroomID + " while being banned from the chat"); return new String[]{"You are banned from this chat"}; }else{ return new String[]{"We are having issues verifying you are allowed to access this chat"}; } }else if(userStatus == 1){ systemReport(username, "Tried to acces chatroom: " + chatroomID + " while banned"); return new String[]{"You are not allowed to acces the server"}; }else{ return new String[]{"We are having issues making sure your allowed to login"}; } }
核心修改说明
- 循环外层新增
ArrayList<String>类型的集合用来存储所有消息,ArrayList是可变长度的集合,支持直接追加元素 - 删除循环内部的return语句,只将单条拼接好的消息追加到集合中,等所有结果遍历完成后再统一转成数组返回
- 顺带修正了你原代码中拼接消息时误把
user变量写死为字符串"user"的笔误,如果需要保留原来的写死逻辑可以自行改回 - 额外优化了SQL查询逻辑,改用PreparedStatement替代原来的Statement,避免直接拼接SQL字符串引发的SQL注入风险
- 新增finally块统一关闭数据库连接、语句对象、结果集,避免资源泄漏
内容的提问来源于stack exchange,提问作者Caminero
相关产品推荐
相关产品推荐

