Вывод таблиц из БД MSSQL в Java GUI
Здравствуйте! Есть вопрос по поводу вывода данных из БД в JTable. Код у меня рабочий, 1 таблицу из БД вывел( в общем есть 10 таблиц в БД). Вопрос, у меня в БД очень много таблиц и я хотел чтобы при нажатии в JMenuBar появились имена моих таблиц, и при нажатии на них появилась эта таблица. JMenu я создал и их слушатели тоже, но не знаю что написать внутри, чтобы вывелись определенные таблицы
Класс Main
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
import java.awt.*; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Main extends JFrame { public Main() { super("Проверка"); ConnectionDB connect = new ConnectionDB("localhost:1433", "admin", "123456"); connect.setNameDataBasses("DecanatDB"); connect.initProperties(); connect.init(); setSize(new Dimension(1000, 400)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); createMenu(); setLocationRelativeTo(null); setLayout(new GridLayout()); TableModel btm = new TableModel(); JTable table = new JTable(btm); btm.addData(connect); JScrollPane tableScroolPage = new JScrollPane(table); tableScroolPage.setPreferredSize(new Dimension(900, 500)); add(tableScroolPage, new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.NORTH, GridBagConstraints.BOTH, new Insets(1, 1, 1, 1), 0, 0)); } private void createMenu() { JMenuBar menu = new JMenuBar(); JMenu fileMenu = new JMenu("Таблицы"); for (String fileItem : new String [] { "Группы", "Студенты" }) { JMenuItem item = new JMenuItem(fileItem); item.setActionCommand(fileItem.toLowerCase()); item.addActionListener(new NewMenuListener()); fileMenu.add(item); } fileMenu.insertSeparator(1); menu.add(fileMenu); setJMenuBar(menu); } private class NewMenuListener implements ActionListener { public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); if ("Студенты".equals(command)) { } if ("Группы".equals(command)) { } } } public static void main(String[] args) { JFrame app = new Main(); app.setVisible(true); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
import javax.swing.table.AbstractTableModel; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; public class TableModel extends AbstractTableModel{ private int columnCount=6; private ArrayListString []> dataArrayList; public TableModel(){ dataArrayList=new ArrayListString[]>(); for (int i=0;idataArrayList.size();i++){ dataArrayList.add(new String[getColumnCount()]); } } @Override public int getRowCount(){ return dataArrayList.size(); } @Override public int getColumnCount(){ return columnCount; } @Override public String getColumnName(int columnIndex){ switch(columnIndex){ case 0: return "Код группы"; case 1: return "Наименование"; case 2: return "Код кафедры"; case 3: return "Код студента"; case 4: return "Сумма оплаты за обучение"; case 5: return "Численность студентов"; } return ""; } @Override public Object getValueAt(int rowIndex, int columnIndex){ String []rows = dataArrayList.get(rowIndex); return rows[columnIndex]; } public void addData(String []row){ String []rowTable=new String[getColumnCount()]; rowTable=row; dataArrayList.add(rowTable); } public void addData(ConnectionDB connect){ ResultSet result=connect.resultSetQuery("SELECT * FROM Gruppy"); try { while (result.next()) { String []row={ result.getString("Kod_gruppy"), result.getString("Naimenovanie"), result.getString("Kod_kafedry"), result.getString("Kod_studenta"), result.getString("Summa_oplaty_za_obuchenie"), result.getString("Chislennost_studentov") }; addData(row); } }catch (SQLException e){ e.printStackTrace(); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
import java.sql.*; import java.util.Properties; public class ConnectionDB { private String host; private String dataDb; private String root; private String password; private String url; private Properties properties = new Properties(); private Connection mssqlConnection; public ConnectionDB(String host, String root, String password) { this.host = host; this.root = root; this.password = password; } public ConnectionDB(String url, Properties properties) { this.url = url; this.properties = properties; } public void setNameDataBasses(String dataDb) { this.dataDb = dataDb; } public void initProperties() { this.url = "jdbc:sqlserver://" + this.host + ";"+"databaseName="+this.dataDb; properties.setProperty("user", this.root); properties.setProperty("password", this.password); properties.setProperty("useUnicode", "true"); properties.setProperty("characterEncoding", "UTF-8"); System.out.println(url); } public int init() { if (mssqlConnection != null) { try { mssqlConnection.close(); } catch (SQLException e) { e.printStackTrace(); } } try { ; Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); mssqlConnection = DriverManager.getConnection(url, properties); } catch (ClassNotFoundException e) { e.printStackTrace(); return -1; } catch (SQLException e) { e.printStackTrace(); return -1; } return 0; } public void finalize() { try { mssqlConnection.close(); } catch (SQLException e) { e.printStackTrace(); } } public ResultSet resultSetQuery(String query) { try { Statement stmt = mssqlConnection.createStatement(); ResultSet rs = stmt.executeQuery(query); return rs; } catch (SQLException e) { e.printStackTrace(); } return null; } public void sqlQuery(String query) { try { Statement stmt = mssqlConnection.createStatement(); stmt.executeQuery(query); } catch (SQLException e) { e.printStackTrace(); } } }
Display MySQL table values using Java
For this, you can use the ResultSet concept. For connection, we will be using the MySQL JDBC Driver.
Example
mysql> create table demo87 -> ( -> name varchar(20), -> age int -> ) -> ; Query OK, 0 rows affected (0.62
Insert some records into the table with the help of insert command −
Example
mysql> insert into demo87 values('John',21); Query OK, 1 row affected (0.15 mysql> insert into demo87 values('David',23); Query OK, 1 row affected (0.12 mysql> insert into demo87 values('Bob',22); Query OK, 1 row affected (0.16
Display records from the table using select statement −
Example
This will produce the following output −
Output
+-------+------+| name | age |
+-------+------+| John | 21 |
| David | 23 || Bob | 22 |
+-------+------+3 rows in set (0.00 sec)
Following is the Java code to display table values in MySQL −
Example
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.util.ArrayList; import java.util.HashMap; import com.mysql.jdbc.Statement; public class TableValuesDemo < public static void main(String[] args) < Connection con = null; Statement statement = null; try < HashMap hm = new HashMap<>(); Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sampledatabase", "root", "123456"); statement = (Statement) con.createStatement(); String sql; sql = "select *from demo87"; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) < hm.put(resultSet.getString("name"), resultSet.getInt("age")); >System.out.println(hm); > catch (Exception e) < e.printStackTrace(); >> >
This will produce the following output −
Output
Following is the snapshot of sample output −
Вывод таблицы sql java
Для выборки данных с помощью команды SELECT применяется метод executeQuery :
ResultSet executeQuery("Команда_SQL")
Метод возвращает объект ResultSet, который содержит все полученные данные. Как эти данные получить?
В объекте ResultSet итератор устаналивается на позиции перед первой строкой. И чтобы переместиться к первой строке (и ко всем последующим) необходимо вызвать метод next() . Пока в наборе ResultSet есть доступные строки, метод next будет возвращать true. Типичное перемещение по набору строк:
ResultSet resultSet = statement.executeQuery("SELECT * FROM Products"); while(resultSet.next()) < // получение содержимого строк >
То есть пока в resultSet есть доступные строки, будет выполняться цикл while, который будет переходить к следующей строке в наборе.
После перехода к строке мы можем получить ее содержимое. Для этого у ResultSet определен ряд методов. Некоторые из них:
- getBoolean() возвращает значение boolean
- getDate() возвращает значение Date
- getDouble() возвращает значение double
- getInt() возвращает значение int
- getFloat() возвращает значение float
- getLong() возвращает значение long
- getNString() возвращает значение String
- getString() возвращает значение String
В зависимости от того, данные какого тип хранятся в том или ином столбце, мы можем использовать тот или иной метод. Каждый из этих методов имеет две версии:
int getInt(int columnIndex) int getInt(String columnLabel)
Первая версия получает данные из столбца с номером columnIndex. Вторая версия получает данные из столбца с названием columnLabel.
Например, в прошлых темах была создана таблица, которая имеет три столбца:
CREATE TABLE products ( Id INT PRIMARY KEY AUTO_INCREMENT, ProductName VARCHAR(20), Price INT )
import java.sql.*; public class Program < public static void main(String[] args) < try< String url = "jdbc:mysql://localhost/store?serverTimezone=Europe/Moscow&useSSL=false"; String username = "root"; String password = "password"; Class.forName("com.mysql.cj.jdbc.Driver").getDeclaredConstructor().newInstance(); try (Connection conn = DriverManager.getConnection(url, username, password))< Statement statement = conn.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM Products"); while(resultSet.next())< int name = resultSet.getString(2); int price = resultSet.getInt(3); System.out.printf("%d. %s - %d \n", id, name, price); >> > catch(Exception ex) < System.out.println("Connection failed. "); System.out.println(ex); >> >
Первый столбец в таблице — столбец Id представляет тип int, поэтому для его получения используется метод getInt() . Второй столбец — ProductName представляет строку, поэтому для получения его данных применяется метод getString() . То есть между типом данных и методом есть соответствие. И мы не можем, к примеру, получить значение столбца ProductName с помощью метода getInt.
Также отмечу, что индексация столбцов начинается с 1, а не с 0.
Возможный консольный вывод программы:
C:\Java>javac Program.java C:\Java>java -classpath c:\Java\mysql-connector-java-8.0.11.jar;c:\Java Program 1. iPhone X - 71000 2. Galaxy S9 - 40000 C:\Java>
Однако мы можем точно не знать порядок следования данных полученном наборе. В этом случае мы можем вместо номеров столбцов можно передать названия столбцов:
ResultSet resultSet = statement.executeQuery(«SELECT * FROM Products»); while(resultSet.next())