【问题标题】:How to insert data to mysql database that synchronously update the JTable in java?java - 如何将数据插入到同步更新java中的JTable的mysql数据库中?
【发布时间】:2014-04-18 08:41:21
【问题描述】:

我在下表中的 GUI JTable 上方获取数据

CREATE TABLE store_room(
store_id int,
store_capacity int
);

当我向这个 sql 表插入新记录时,它必须立即同步更新 jtable 谁能告诉怎么做?

注意:-问题不清楚,我会稍微解释一下

我的插入数据 GUI 是这样的

我的班级结构如下

我创建了一个 java bean 类来表示一个表的元组。

public class StoreRoom{
private int storeId;
private int storeCapacity;

    public int getSstoreId() {
        return storeId;
    }

    public void setStoreId(int storeId) {
        this.storeRoomId = storeId;
    }

// getter setter 方法 //

}

为了表示表行为,我创建了一个名为 StoreRoomData 的类,如下所示

public class  StoreRoomData {

    public static void insert(StoreRoom bean){
     // some code to insert like below
String sql="INSERT INTO StoreRoom(store_id ,store_capacity )"+
                "values(?,?);";
    ResultSet keys=null;
    try (
            Connection conn = DBUtil.getConnection(DBType.MYSQL);
            PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
         ){
        stmt.setInt(1, bean.getSstoreId());  
        stmt.setInt(2, bean.getSstoreCapacity());  



        int affacted = stmt.executeUpdate();
}

}

在一个表单中,我创建了一个 bean 对象并调用 setMethods 将所有 GUI 输入设置为 bean 对象,并将其传递给作为 StoreRoomData 类的 insert 方法,如下所示

StoreRoom bean = new StoreRoom();

    bean.setStoreId(Integer.parseInt(textBox1.getText()));



StoreRoomData.insert(bean);

我希望这会清除

【问题讨论】:

  • 你的环境是什么?谁调用数据库的更新?相同的 java-application 还是其他人?
  • 用 java 中的花药 GUI 更新数据库。
  • 您应该尝试挂钩插入过程。是同一个程序吗,你的insert程序可以调用GUI上的函数吗?如果是这样,您应该尝试@user3413094 的观察者模式

标签: java mysql sql database jtable


【解决方案1】:

这个问题不是很清楚。如何插入新记录?你有一个java方法吗?

如果是这样,您可以实现observer design pattern 。通过这种模式,您可以定义一个观察者对象,该对象在插入新记录时得到通知。你的代码看起来像这样

public interface DBObserver{
      public void notifyNewRecordInserted();
}

public class MyTable extends JTable implements DBOserver{
       public void notifyNewRecordInserted(){
              this.refresh();
       }

       public void refresh(){
            //some code to refresh the table
       }
}

public class DBManager(){
     private List<DBObserver> observers;

     public void addObserver(DBObserver observer){
         this.observers.add(observer);
     }


     public DBObserver  removeObserver(DBObserver observer){
         this.observers.remove(observer);
         return observer;
     }

     public void insert(Record record){
           //some code to insert the new record

           //notify observers
           this.notifyObservers();
     }


     private void notifyObservers(){
        for(DBObserver observer: this.observers){
               observer.notifyNewRecordInserted();
        }
     }
}

这样,您可以在插入新记录时自动更新每个需要更新的组件,即使您在首次开发解决方案时不知道该组件可能是什么。

换句话说,现在您知道要更新表,但将来您可能会注意到,每当插入新记录时,您也想更新另一个表。

您所要做的就是在您的新类中实现 DBObserver 接口,并通过调用 addObserver() 使该类的对象注册自己。

notifyObservers 方法通知所有注册的观察者。该方法甚至不必知道那些组件是什么。


【讨论】:

  • 我是 Java 编程新手。你能修改我的问题并补充你的答案吗?我试图理解你的答案,但我对接口没有好主意
  • 这里是什么代码 //刷新表格的一些代码
  • 对不起,我是 stackoverflow 的新手,我没有注意到你的问题。接口是可以定义的 java 元素。接口定义方法而不给出具体实现。稍后,您可以定义一个类,该类声明使用类似“A 类实现 I”的语法来实现这些方法。现在您必须实现 I 中定义的所有方法。为什么这很有用?这很有用,因为您可以编写使用接口 I 的代码。如果您稍后以不同的方式添加实现 I,则无需更改代码中的任何其他内容。
  • 关于您应该添加的代码取决于您正在开发的应用程序。您应该查询您的数据库以获取包含新插入记录的结果并将这些记录显示在您的表中。
【解决方案2】:

您可以使用线程,通过无限循环,检查您的数据库,如果插入了新记录,则获取它并将其插入到 Jtable 中。

new Thread(new Runnable() {
    @Override
    public void run() {
             while(true){
                       result = query.execute("select .....");    // check DB
                       if(newRecord){   // check if there is a new record 
                               // get the new record
                               //  insert it into Jtable
                       }
                       sleep(100) // to avoid consecutive acces to your DB
                      }
             }
}

【讨论】:

  • if 子句如何在这里找到新记录?
【解决方案3】:

我理解正确,您说您有一个单独的添加数据窗口/位置来添加数据,您可以在其中输入内容然后将其提交到数据库。如果这是正确的,您可以做 2 件事中的 1 件事,

  1. 当您单击提交时,您的函数会触发数据库插入和添加到该表绑定到的数据模型中。这可以针对单个用户的情况来完成。

  2. 您只能更新数据库并让表自动刷新(使用线程),当新事物出现时,它会不断地从数据库中提取数据。如果您有多个用户的情况,这是要走的路。

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 2011-11-29
    • 2014-08-08
    • 2014-11-29
    • 2020-06-06
    • 1970-01-01
    • 2020-10-25
    • 2013-08-31
    相关资源
    最近更新 更多