Java Swing面向对象实现搜索按钮时查询结果无法回填问题
解决方案
核心问题是当前search方法仅返回是否查到数据的布尔标识,没有返回查询到的具体字段值,所以无法给前端文本框赋值,按以下步骤修改即可:
步骤1:创建用户实体类封装查询结果
新增User实体类,用来存储从数据库查询到的用户字段信息:
public class User { private String username; private String pass; private String email; public User() {} public User(String username, String pass, String email) { this.username = username; this.pass = pass; this.email = email; } // Getter和Setter方法 public String getUsername() {return username;} public void setUsername(String username) {this.username = username;} public String getPass() {return pass;} public void setPass(String pass) {this.pass = pass;} public String getEmail() {return email;} public void setEmail(String email) {this.email = email;} }
步骤2:修改query类的search方法
将返回值从boolean改为User,查询到数据时封装成User对象返回,未查询到返回null,同时补全资源关闭逻辑避免内存泄漏:
public static User search(String pass) { User user = null; Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { // 修正原代码的类名拼写错误:Conetions→Connections connection = Connections.getConnections(); // 修正原SQL的语法错误:*和from之间加空格 preparedStatement = connection.prepareStatement("select * from moshakhasat where pass=?"); preparedStatement.setString(1, pass); resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { user = new User(); // 从结果集取出字段封装到User对象 user.setUsername(resultSet.getString("username")); user.setPass(resultSet.getString("pass")); user.setEmail(resultSet.getString("email")); } } catch (SQLException throwables) { throwables.printStackTrace(); } finally { // 按顺序关闭数据库资源 try { if (resultSet != null) resultSet.close(); if (preparedStatement != null) preparedStatement.close(); if (connection != null) connection.close(); } catch (SQLException e) { e.printStackTrace(); } } return user; }
步骤3:修改Form类的搜索按钮监听逻辑
拿到返回的User对象后,直接取出字段值填充到对应文本框即可:
serchbtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e){ // JPasswordField的getText方法已废弃,改用getPassword转字符串 String pass= new String(passtxt.getPassword()); User user = query.search(pass); if (user != null){ // 填充查询结果到文本框 usertxt.setText(user.getUsername()); emailtxt.setText(user.getEmail()); } else { JOptionPane.showMessageDialog(panel, "未查询到匹配的用户信息"); } } });
其他可优化点
- Java类名需遵守首字母大写规范,建议把
query改为Query,Connections可以改为更通用的DBUtil - 其他数据库操作方法(save、delete)也需要补全资源关闭逻辑,避免连接泄漏
- 不要用密码作为查询的唯一条件,实际业务中可能存在多用户密码相同的情况,建议增加用户名作为查询条件
内容的提问来源于stack exchange,提问作者milad
相关产品推荐
相关产品推荐

