有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用jtable升级mysql数据库

我想用jtable,table r display更新我的数据库,但不想更新。请提供mi解决方案 我正在做下面的代码,但它不能更新我的数据库,如何才能激发查询,我的数据库包含id,姓名,密码,电子邮件,电话号码

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();

    }

}

共 (1) 个答案

  1. # 1 楼答案

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

    我的第一个想法是,不要使用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了解教育部的详细信息