Работа с JTable в Java SE построена на основе паттерна MVC, поэтому работать мы будем с моделью компонента jTable.
package example.Models; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import java.util.ArrayList; import javax.swing.table.AbstractTableModel; public class DbTableModel extends AbstractTableModel { private Object[][] content; //хранит данные private String[] columnNames; //хранит названия заголовков private Class[] columnClasses; //хранит типы полей (столбцов) public DbTableModel(Connection con, String query, String tableName) throws SQLException { //super(); getTableContent(con, query, tableName); } private void getTableContent(Connection conn, String query, String tableName) throws SQLException { DatabaseMetaData md = conn.getMetaData(); ResultSet rs = md.getColumns(null, null, tableName, null); ArrayList colNamesList = new ArrayList(); ArrayList colTypesList = new ArrayList(); while (rs.next()) { colNamesList.add(rs.getString("COLUMN_NAME")); int dbType = rs.getInt("DATA_TYPE"); switch (dbType) { case Types.INTEGER: colTypesList.add(Integer.class); break; case Types.FLOAT: colTypesList.add(Float.class); break; case Types.DOUBLE: case Types.REAL: colTypesList.add(Double.class); break; case Types.DATE: case Types.TIME: case Types.TIMESTAMP: colTypesList.add(java.sql.Date.class); break; default: colTypesList.add(String.class); break; } } columnNames = new String[colNamesList.size()]; colNamesList.toArray(columnNames); columnClasses = new Class[colTypesList.size()]; colTypesList.toArray(columnClasses); Statement st = conn.createStatement(); rs = st.executeQuery(query); ArrayList rowList = new ArrayList(); while (rs.next()) { ArrayList cellList = new ArrayList(); for (int i = 0; i < columnClasses.length; i++) { Object cellValue = null; if (columnClasses[i] == String.class) { cellValue = rs.getString(columnNames[i]); } else if (columnClasses[i] == Integer.class) { cellValue = new Integer(rs.getInt(columnNames[i])); } else if (columnClasses[i] == Float.class) { cellValue = new Float(rs.getInt(columnNames[i])); } else if (columnClasses[i] == Double.class) { cellValue = new Double(rs.getDouble(columnNames[i])); } else if (columnClasses[i] == java.sql.Date.class) { cellValue = rs.getDate(columnNames[i]); } else { System.out.println("Can't define column type " + columnNames[i]); } cellList.add(cellValue); }// for Object[] cells = cellList.toArray(); rowList.add(cells); }// while content = new Object[rowList.size()][]; for (int i = 0; i < content.length; i++) { content[i] = (Object[]) rowList.get(i); } rs.close(); st.close(); } @Override public int getRowCount() { return content.length; } @Override public int getColumnCount() { if (content.length == 0) { return 0; } else { return content[0].length; } } @Override public Object getValueAt(int row, int col) { return content[row][col]; } @Override public Class getColumnClass(int col) { return columnClasses[col]; } @Override public String getColumnName(int col) { return columnNames[col]; } @Override public boolean isCellEditable(int rowIndex, int colIndex) { if (colIndex == 1) { return false; } else { return true; } } }
В конструкторе класса, или методе getTableContent() есть 3 параметра:
con типа Connection, строковый query и строковый tableName.
В предыдущем посте мы использовали свой класс для работы с базой данных, у нас там есть метод getConnection(), который возвращает ссылку на используемый нами Connection, его и нужно передать в конструктор или метод.
В параметр query мы передаём SQL запрос, в ответ на который хотим получить необходимые данные (напоминаю, здесь поля можно представлять используя AS, чтобы заголовки можно было сделать и на русском языке, понятными пользователю Вашей программы, либо использовать представления — VIEW). Если необходимо выбрать все поля, то можно воспользоваться запросом, «SELECT * FROM tableName«, при этом третий параметр конструктора/метода tableName также обязательно необходимо заполнять именем таблицы.
В программе мы делаем следующее:
MySQLConnect myConnect = new MySQLConnect(Host, dbName, login, pass);
DbTableModel myTableModel = new DbTableModel(myCon.getConnection(), «SELECT * FROM tableName», «tableName»);
jTable1.setModel(myTableModel);