Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 任何连接JTable(TableModel)和H2数据库的方法_Java_Sql_Swing_H2_Defaulttablemodel - Fatal编程技术网

Java 任何连接JTable(TableModel)和H2数据库的方法

Java 任何连接JTable(TableModel)和H2数据库的方法,java,sql,swing,h2,defaulttablemodel,Java,Sql,Swing,H2,Defaulttablemodel,我当前的项目是一种数据库系统,它有一个gui进行维护。在我主要的代码重写之前,我常常序列化和反序列化TableModel,以将数据保存并加载到gui。由于显而易见的原因,这不是一个好的解决方案,我做了一些研究,最终使用H2本地数据库来保存和加载数据 用于将数据保存到我的数据库中的代码可以在中找到 保存过程本身并不是最大的问题,但我找不到任何好方法将数据加载回我的JTable TableModel 有没有办法直接将JTable TableModel与任何类型的SQL数据库连接在一起?目前,在Jav

我当前的项目是一种数据库系统,它有一个gui进行维护。在我主要的代码重写之前,我常常序列化和反序列化TableModel,以将数据保存并加载到gui。由于显而易见的原因,这不是一个好的解决方案,我做了一些研究,最终使用H2本地数据库来保存和加载数据

用于将数据保存到我的数据库中的代码可以在中找到

保存过程本身并不是最大的问题,但我找不到任何好方法将数据加载回我的JTable TableModel


有没有办法直接将JTable TableModel与任何类型的SQL数据库连接在一起?目前,在Java中,将JTable与数据库一起使用似乎是一个非常麻烦的问题。

好的,这是一个简单的示例,它创建了一个内存中的数据库,其中包含一个表和一些值

它使用一个简单的自定义TableModel,如果基础数据发生更改,可以刷新该TableModel

请仔细查看更多详细信息

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;

public class TestTable {

    private Connection con;

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

    public TestTable() {
        try {
            Class.forName("org.h2.Driver");
            String url = "jdbc:h2:mem:InMemoryTest";
            con = DriverManager.getConnection(url);

            createShoppingListTable();
            fillShoppingListTable();

            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }

                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        } catch (ClassNotFoundException | SQLException exp) {
            exp.printStackTrace();
        }
    }

    protected void createShoppingListTable() throws SQLException {
        String query = "create table shoppingList (id bigint identity, item varchar(255), quantity int)";
        try (Statement stmt = con.createStatement()) {
            stmt.execute(query);
        }
    }

    protected void fillShoppingListTable() throws SQLException {

        String[] items = {"Bananas", "Apples", "Grapes", "Pears", "Oranges"};
        Random rnd = new Random();
        try (PreparedStatement ps = con.prepareStatement("insert into shoppingList (item, quantity) values (?, ?)")) {
            for (String item : items) {
                ps.setString(1, item);
                ps.setInt(2, rnd.nextInt(100));
                ps.addBatch();
            }

            ps.executeBatch();
        }

    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            TestTableModel model = new TestTableModel();
            JTable table = new JTable(model);
            add(new JScrollPane(table));

            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        model.refresh();
                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                }
            });
        }

    }

    public class TestTableModel extends AbstractTableModel {

        private List<ShoppingList> shoppingList = new ArrayList<>(25);
        private List<String> columnNames = new ArrayList<>(25);

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

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

        @Override
        public String getColumnName(int column) {
            return columnNames.get(column);
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            ShoppingList rowValue = shoppingList.get(rowIndex);
            Object value = null;
            switch (columnIndex) {
                case 0:
                    value = rowValue.getId();
                    break;
                case 1:
                    value = rowValue.getItem();
                    break;
                case 2:
                    value = rowValue.getQuanity();
                    break;
            }
            return value;
        }

        public void refresh() throws SQLException {

            List<String> values = new ArrayList<>(25);
            try (PreparedStatement ps = con.prepareStatement("select * from shoppingList")) {
                try (ResultSet rs = ps.executeQuery()) {
                    ResultSetMetaData md = rs.getMetaData();
                    for (int col = 0; col < md.getColumnCount(); col++) {
                        values.add(md.getColumnName(col + 1));
                    }
                    while (rs.next()) {
                        ShoppingList list = new ShoppingList(rs.getLong(1), rs.getString(2), rs.getInt(3));
                        shoppingList.add(list);
                    }
                }
            } finally {
                if (columnNames.size() != values.size()) {
                    columnNames = values;
                    fireTableStructureChanged();
                } else {
                    fireTableDataChanged();
                }
            }

        }

        public class ShoppingList {

            private long id;
            private String item;
            private int quanity;

            public ShoppingList(long id, String item, int quanity) {
                this.id = id;
                this.item = item;
                this.quanity = quanity;
            }

            public long getId() {
                return id;
            }

            public String getItem() {
                return item;
            }

            public int getQuanity() {
                return quanity;
            }

        }

    }

}

您正在寻找某种绑定API。这将取决于许多因素。这可能是,我希望在我作为电气工程师还不是一个成熟的程序员的时候,能够让连接变得更容易。@Flatron看看里面的解决方案哇!谢谢你,这与@hd1评论一起将对我有所帮助!你有没有把代码剪下来?没有,都是手工完成的,从记忆中记住,这只是很多方法中的一种