You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现双查询、数据复选框及选中数据存入ArrayList求助

Java 数据库查询与复选框选择功能实现

需求

  • 实现selectAll方法:查询并展示数据库login表中的全部数据
  • 实现条件查询select方法:根据输入的姓名查询匹配的数据
  • 为每条展示的数据添加复选框
  • 勾选复选框时,将对应数据存入ArrayList

用户提供的代码

JCheckBox[] buttons = new JCheckBox[4];  
JCheckBox ch = new JCheckBox("전체선택", false);      
j2 = new JButton("초기화");
panel.add(l1);
panel.add(tf1);
panel.add(j1);
panel.add(ch);
panel.add(j2);      
this.add("North", panel); 
JButton s1 = new JButton("보내기");
p1.add(s1);
this.add("South", p1); // 부착     
connect(); // DB접속하는 메소드    
selectAll();
//select();
j1.addActionListener(e -> {             
    userValue = tf1.getText();  
    select();                       
}); 

public void selectAll() {//this is a 'select' function which is show all data of my DB      
    try { 
        String sql="select name, phone, address from login"; 
        pstmt=con.prepareStatement(sql);
        System.out.println("pstmt : "+pstmt);
        rs1=pstmt.executeQuery(); 
        System.out.println("rs : "+rs);                 
        while(rs1.next()) {
            String name=rs1.getString("name");
            String age=rs1.getString("phone");
            String tel=rs1.getString("address");                                  
            Object data[]= {name,age,tel};
            model.addRow(data);                     
        }
    }catch(Exception e) {
        System.out.println("select() 실행 오류 : "+e);
    }
} 

public void select()  {//this is a second Search 
    try {           
        pstmt.setString(1, userValue);
        String sql="select name,phone,address from login where name = ?"; 
        pstmt=con.prepareStatement(sql);             
        rs=pstmt.executeQuery(); 
        while(rs.next()) {
            String name=rs.getString("name");
            String age=rs.getString("phone");
            String tel=rs.getString("address");                       
            Object data[]= {name,age,tel};              
            model.addRow(data); 
        }
    }  catch(Exception e1) {
        System.out.println("select() 실행 오류 : "+e1);
    } 
}

代码问题与修正方案

1. select方法参数设置顺序错误

当前代码先调用pstmt.setString(1, userValue)再创建PreparedStatement,会触发空指针异常。正确逻辑是先创建语句对象,再设置参数:

public void select() {
    try {           
        String sql="select name,phone,address from login where name = ?"; 
        PreparedStatement pstmt = con.prepareStatement(sql); // 先创建语句
        pstmt.setString(1, userValue); // 再设置参数
        ResultSet rs = pstmt.executeQuery(); 
        
        model.setRowCount(0); // 查询前清空表格,避免新旧数据叠加
        
        while(rs.next()) {
            String name=rs.getString("name");
            String phone=rs.getString("phone");
            String address=rs.getString("address");                       
            Object data[]= {false, name, phone, address}; // 新增复选框列(布尔值)
            model.addRow(data); 
        }
        
        // 及时关闭资源,防止数据库连接泄漏
        rs.close();
        pstmt.close();
    }  catch(Exception e1) {
        System.out.println("select() 실행 오류 : "+e1);
    } 
}

2. selectAll方法优化

添加表格清空和资源关闭逻辑,同时新增复选框列:

public void selectAll() {      
    try { 
        String sql="select name, phone, address from login"; 
        PreparedStatement pstmt = con.prepareStatement(sql);
        ResultSet rs1 = pstmt.executeQuery(); 
        
        model.setRowCount(0); // 清空原有数据
        
        while(rs1.next()) {
            String name=rs1.getString("name");
            String phone=rs1.getString("phone");
            String address=rs1.getString("address");                                  
            Object data[]= {false, name, phone, address}; // 首列为复选框对应的布尔值
            model.addRow(data);                     
        }
        
        rs1.close();
        pstmt.close();
    }catch(Exception e) {
        System.out.println("selectAll() 실행 오류 : "+e);
    }
}

3. 实现复选框与选中数据存储

步骤1:初始化带复选框的表格模型

假设model是DefaultTableModel,初始化时指定列名并配置复选框渲染:

DefaultTableModel model = new DefaultTableModel(new Object[]{"선택", "이름", "전화번호", "주소"}, 0);
JTable table = new JTable(model);
// 设置首列为复选框样式
table.getColumnModel().getColumn(0).setCellRenderer(new JCheckBox());
table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(new JCheckBox()));

步骤2:全选复选框逻辑

ch.addActionListener(e -> {
    boolean isSelected = ch.isSelected();
    for(int i=0; i<model.getRowCount(); i++) {
        model.setValueAt(isSelected, i, 0);
    }
});

步骤3:获取选中数据存入ArrayList

为"보내기"按钮添加点击事件:

s1.addActionListener(e -> {
    ArrayList<Object[]> selectedData = new ArrayList<>();
    for(int i=0; i<model.getRowCount(); i++) {
        boolean isChecked = (boolean) model.getValueAt(i, 0);
        if(isChecked) {
            String name = (String) model.getValueAt(i, 1);
            String phone = (String) model.getValueAt(i, 2);
            String address = (String) model.getValueAt(i, 3);
            selectedData.add(new Object[]{name, phone, address});
        }
    }
    // 此处可根据需求处理选中数据,例如打印、保存到文件等
    System.out.println("선택된 데이터 개수: " + selectedData.size());
});

4. 其他注意事项

  • 避免使用全局的PreparedStatement和ResultSet,建议在方法内局部声明并及时关闭,防止资源泄漏和线程安全问题
  • connect()方法需确保数据库连接正确关闭,可使用try-with-resources语法自动管理连接
  • 异常处理可进一步优化,例如添加界面弹窗提示,提升用户体验

内容的提问来源于stack exchange,提问作者최영준

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:45:36