java - 如何使用jtable更新mysql数据库

标签 java swing jtable

我想使用 jtable、table r disply 更新我的数据库,但不更新,请提供 mi 解决方案 我正在执行以下代码,但它无法更新我的数据库以及如何触发查询我的数据库包含 id、name、password、email、phone_no

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;


public class JtExample extends JFrame  {


JTable tbldetails;
     DefaultTableModel dtm ;
     public int editcol1;
     public int editrow;

      public JtExample() {
      setVisible(true);
      setSize(500,500);
      setTitle("login Frame");
      setLocationRelativeTo(null);
      setLayout(null);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      dtm = new DefaultTableModel();    //dtm consiste row and clonum
      String rowheader[] = {"ID","Name" ,"Password", "Email","phn_no"};
      dtm.addColumn("ID");
      dtm.addColumn("Name");
      dtm.addColumn("address");
      dtm.addColumn("Email");
      dtm.addColumn("phn_no");
      dtm.addRow(rowheader);
      add();


      dtm.addTableModelListener(new TableModelListener ()
      {

        @Override
        public void tableChanged(TableModelEvent arg0) {
              int  editcol1 =tbldetails.getEditingColumn();
              int editrow =tbldetails.getEditingRow();

              TableCellEditor tce = tbldetails.getCellEditor(editrow ,     editcol1);
              System.out.println(tce.getCellEditorValue());


        }

      });
      tbldetails = new JTable(dtm);

      tbldetails.setBounds(100,100,500,200);



      try {
        Class.forName("com.mysql.jdbc.Driver");
         Connection con = DriverManager.getConnection("jdbc:mysql://Localhost:3306/mydata","root","root");




            PreparedStatement ps=con.prepareStatement(" update employee set editcol1=? where editrow=?");
            int editcol1 = 0;
            String tce = null;
            ps.setString(editcol1, tce);

            int i=ps.executeUpdate();


    } catch (ClassNotFoundException e) {

        e.printStackTrace();
    } catch (SQLException e) {

        e.printStackTrace();
    }





      add(tbldetails); 


   }


   public void add()
   {

           try {
                Class.forName("com.mysql.jdbc.Driver");


                Connection con = DriverManager.getConnection("jdbc:mysql://Localhost:3306/mydata","root","root");


                Statement st = con.createStatement();




                ResultSet rs = st.executeQuery("select *from employee");
                while(rs.next())
                {
                    dtm.addRow(new Object[]{rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5)});


                }


                con.close();

           } catch (ClassNotFoundException e) {

                e.printStackTrace();
            } catch (SQLException e) {

                e.printStackTrace();
            }   
       }








    public static void main(String args[])
    {
        new JtExample();

    }

}








    public static void main(String args[])
    {
        new JtExample();

    }

}

最佳答案

注意:给这只猫剥皮的方法不止一种

我的第一个想法是,不要使用 DefaultTableModel,而是使用 AbstractTableModel,这将使您能够更好地控制模型及其状态更改。

首先定义一个代表您的数据的普通旧 Java 对象 (POJO)。就我个人而言,我更喜欢从接口(interface)开始,这允许我根据我的要求定义可变和非可变版本

类似...

public class Employee {

    private String id; //??
    private String name;
    private String password; // Probably should be a char[]
    private String email;
    private String phoneNumber;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public Employee(String id, String name, String password, String email, String phoneNumber) {
        this.id = id;
        this.name = name;
        this.password = password;
        this.email = email;
        this.phoneNumber = phoneNumber;
    }

}

...例如

接下来,您需要定义一个能够支持此数据的TableModel...

public class EmployeeTableModel extends AbstractTableModel {

    private String columnNames[] = {"ID","Name" ,"Password", "Email","phn_no"};
    private List<Employee> employees;

    public EmployeeTableModel() {
        employees = new ArrayList<Employee>(25);
    }

    public EmployeeTableModel(List<Employee> employees) {
        this.employees = employees;
    }

    public void add(Employee employee) {
        employees.add(employee);
        fireTableRowsInserted(employees.size() - 1, employees.size() - 1);
    }

    public void remove(Employee employee) {
        int index = employees.indexOf(employee);
        employees.remove(employee);
        fireTableRowsDeleted(index, index);
    }

    @Override
    public int getRowCount() {
        return employees.size();
    }

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public String getColumnName(int column) {
        return columnNames[column];
    }

    public Employee getEmployeeAt(int row) {
        return employees.get(row);
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return String.class;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Employee emp = getEmployeeAt(rowIndex);
        Object value = null;
        switch (columnIndex) {
            case 0:
                value = emp.getId();
                break;
            case 1:
                value = emp.getName();
                break;
            case 2:
                value = emp.getPassword();
                break;
            case 3:
                value = emp.getEmail();
                break;
            case 4:
                value = emp.getPhoneNumber();
                break;
        }
        return value;
    }

}

我们稍后将添加此内容,但现在,这为我们提供了所需的基础知识...

当您从数据库加载数据时,您可以使用类似...

EmployeeTableModel model = new EmployeeTableModel();
try (ResultSet rs = st.executeQuery("select *from employee")) {
    while(rs.next())
    {
        model.add(new Employee(
                rs.getString(1), 
                rs.getString(2), 
                rs.getString(3), 
                rs.getString(4), 
                rs.getString(5)));
    }
} finally {
    tbldetails.setModel(model);
}

所以,现在我们在 Employee 类中有一个独立的工作单元,一个可以支持它的 TabelModel 以及一种加载数据的方法,现在,您需要某种方法来拦截数据的更改并更新数据库。

为此,我们将更新 EmployeeTableModel

public class EmployeeTableModel extends AbstractTableModel {
    //...
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return columnIndex > 0; // id should not be editable here...
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Employee emp = getEmployeeAt(rowIndex);
        switch (columnIndex) {
            case 1:
                emp.setName(aValue.toString());
                break;
            case 2:
                emp.setPassword(aValue.toString());
                break;
            case 3:
                emp.setEmail(aValue.toString());
                break;
            case 4:
                emp.setPhoneNumber(aValue.toString());
                break;
        }
        update(emp);
        fireTableCellUpdated(rowIndex, columnIndex);
    }

每次更新单元格时,都会调用 update 方法。为此,我们传递Employee 对象。根据 id 属性的值,您需要更新或插入新记录。

这是一个非常简单的示例,由于 JDBC 的性质,JDBC 调用可能需要一段时间才能执行。我可能会想要某种(阻塞)队列,我可以在其中添加 Employee 对象。

这个队列将由另一个Thread(或SwingWorker或类似的东西)处理,它会弹出下一个对象并处理它,用更新的数据触发事件回调(TableModel将监听该事件)。然后,TableModel 将能够相应地更新自身...

另一个想法是简单地有一个“保存”按钮,用户可以单击该按钮。然后,您只需迭代 Employee 列表并更新它们。为此,我将为每个对象设置一个简单的 boolean 标志,每当调用任何 set 方法时,该标志都会设置为 true

public class Employee {

    private boolean changed = false;

    public boolean hasChanged() {
        return changed;
    }

    public void setName(String name) {
        this.name = name;
        changed = true;
    }

仔细看看How to Use Tables了解教育部详情

关于java - 如何使用jtable更新mysql数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28575235/

相关文章:

Java Swing : Jtable with many models and custom renderer

java - jTable 中的复选框?

java - Play 框架和 Office 365 OAuth

Java,对象网格

java - 快速java输入\输出流

java - 3 Swing 应用程序设计 : which is the best?

java - 如何更改不同 Java 类中面板上的 setVisible()

java - 在运行时更改 JTable 引用 - 未出现在 GUI 中

java - 为什么 Java HTTP 请求这么慢(与 Python 相比),我怎样才能使它们更快?

java - 如何在 log4j_config.xml 的appender标签中给出动态文件路径?