吉林大學《資料庫應用程式開發》
阿新 • • 發佈:2021-01-15
任務1到任務4都有答案,整個實驗難點在於任務5,所以這篇隨筆只分享任務5的解題思路
任務5 模仿下面截圖設計並實現向表TEMPL插入行的操作,GUI介面要求實現單行插入、多行插入、通過子查詢插入的功能。
1.GUI介面
編寫GUI介面過程中腦袋要有程式的框架,每個人的GUI風格不同,框架也不同,我的框架如下
class Table implements ActionListener { //申明圖形介面元件 private JButton btn1; private JButton btn2; ...... //初始化表格 public Table() { //製作圖形介面 } //實現每個btn的功能 public btn1Fun() { //JDBC語句 } public btn2Fun() { //JDBC語句 } ...... //監聽器處理函式 public void actionPerformed(ActionEvent e) { if(e.getSource()==this.btn1) { this.btn1Fun(); } if(e.getSource()==this.btn2) { this.btn2Fun(); } ...... } } public class Test5 { public static void main(String args[]) { new Table() ; } }
2.單行插入
圖形介面可以用多行標籤+文字框的形式,如下圖
也可以用一行表格的形式,這個可以參考多行插入
sql語句為不帶引數標記的insert,可以用statement物件執行語句
3.多行插入
圖形介面用多行表格的形式,如下圖
sql語句為帶引數標記的insert,用preparedStament物件執行語句,
因為是插入多行,可以用for迴圈,即從表格中提取一行,然後執行一條sql語句
也可以用批處理pstmt.addBatch(),最後一起執行
4.子查詢插入
子查詢查詢的是哪個表?插入的又是哪個表?
查詢的當然是employee表
因為只是查詢並不修改,而同一個表中主鍵empno是不能相同的,所以不可能把查詢出來的結果插回原來的表中
圖形介面如下
sql語句是帶引數標記的insert,用preparedStament物件執行語句
這是整個程式
import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; import java.util.*; import java.sql.*; class Table implements ActionListener { private JFrame frame = new JFrame("開啟表——TEMPL") ; private JTabbedPane tab = new JTabbedPane(JTabbedPane.TOP);//設定標籤在頂部顯示 private String[] titles = {"EMPNO", "FIRSTNME","MIDINIT","LASTNAME","WORKDEPT","PHONENO", "HIREDATE","JOB","EDLEVEL","SEX","BIRTHDATE","SALARY","BONUS","COMM"} ; private Object [][] employeeInfo = {}; // 定義資料 private JTable table = null;//顯示資料的表格 private JTable tableInsert = null;//用於插入多行資料 private DefaultTableModel tableModel = null; //TableModel private DefaultTableModel tableModelInser = null; //TableModel private TableColumn column; /*插入一行的的輸入框*/ private JTextField textFile1 = new JTextField(20); private JTextField textFile2 = new JTextField(20); private JTextField textFile3 = new JTextField(20); private JTextField textFile4 = new JTextField(20); private JTextField textFile5 = new JTextField(20); private JTextField textFile6 = new JTextField(20); private JTextField textFile7 = new JTextField(20); private JTextField textFile8 = new JTextField(20); private JTextField textFile9 = new JTextField(20); private JTextField textFile10 = new JTextField(20); private JTextField textFile11 = new JTextField(20); private JTextField textFile12 = new JTextField(20); private JTextField textFile13 = new JTextField(20); private JTextField textFile14 = new JTextField(20); //進行更新的輸入框 private JTextField updateTextFile1 = new JTextField(20); private JTextField updateTextFile2 = new JTextField(20); private JTextField updateTextFile3 = new JTextField(20); private JTextField updateTextFile4 = new JTextField(20); /*插入一行的標籤*/ private JLabel label1 = new JLabel("EMPNO"); private JLabel label2 = new JLabel("FIRSTNME"); private JLabel label3 = new JLabel("MIDINIT"); private JLabel label4 = new JLabel("LASTNAME"); private JLabel label5 = new JLabel("WORKDEPT"); private JLabel label6 = new JLabel("PHONENO"); private JLabel label7 = new JLabel("HIREDATE"); private JLabel label8 = new JLabel("JOB"); private JLabel label9 = new JLabel("EDLEVEL"); private JLabel label10 = new JLabel("SEX"); private JLabel label11 = new JLabel("BIRTHDATE"); private JLabel label12 = new JLabel("SALARY"); private JLabel label13 = new JLabel("BONUS"); private JLabel label14 = new JLabel("COMM"); //進行更新的標籤 private JLabel updateLabel1 = new JLabel("你想查詢的列"); private JLabel updateLabel2 = new JLabel("你想查詢的值"); private JButton refreshBtn = new JButton("重新整理表格") ;; //重新整理表格按鈕 private JButton insertRowBtn = new JButton("插入一行") ; private JButton addRowBtn = new JButton("增加行") ; private JButton removeRowBtn = new JButton("刪除行") ; private JButton insertMulRowBtn = new JButton("插入多行") ; private JButton updateBtn = new JButton("更新") ; //初始化表格 public Table() { this.tableModel = new DefaultTableModel(this.employeeInfo,this.titles) ;//顯示資料的表格 this.table = new JTable(this.tableModel) ; JScrollPane scr1 = new JScrollPane(this.table,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS) ; this.tableModelInser = new DefaultTableModel(this.employeeInfo,this.titles) ;//顯示資料的表格 this.tableInsert = new JTable(this.tableModelInser) ; JScrollPane scr1Insert = new JScrollPane(this.tableInsert,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS) ; JPanel pan1 = new JPanel() ; JPanel pan2 = new JPanel() ; JPanel pan3 = new JPanel() ; JPanel pan4 = new JPanel() ; pan1.add(scr1) ; pan1.add(refreshBtn) ; pan2.add(label1) ; pan2.add(textFile1) ; pan2.add(label2) ; pan2.add(textFile2) ; pan2.add(label3) ; pan2.add(textFile3) ; pan2.add(label4) ; pan2.add(textFile4) ; pan2.add(label5) ; pan2.add(textFile5) ; pan2.add(label6) ; pan2.add(textFile6) ; pan2.add(label7) ; pan2.add(textFile7) ; pan2.add(label8) ; pan2.add(textFile8) ; pan2.add(label9) ; pan2.add(textFile9) ; pan2.add(label10) ; pan2.add(textFile10) ; pan2.add(label11) ; pan2.add(textFile11) ; pan2.add(label12) ; pan2.add(textFile12) ; pan2.add(label13) ; pan2.add(textFile13) ; pan2.add(label14) ; pan2.add(textFile14) ; pan2.add(insertRowBtn) ; pan3.add(scr1Insert); pan3.add(addRowBtn); pan3.add(removeRowBtn); pan4.add(updateLabel1); pan4.add(updateTextFile1); pan4.add(updateLabel2); pan4.add(updateTextFile2); pan4.add(updateBtn); tab.addTab("資料庫",pan1) ; tab.addTab("插入一行",pan2) ; tab.addTab("插入多行",pan3) ; tab.addTab("子查詢插入",pan4) ; frame.add(tab) ; frame.setSize(1000,600) ;// 根據元件自動調整大小 frame.setLocation(300,200) ; frame.setVisible(true) ; frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(1) ; } }) ; this.refreshBtn.addActionListener(this) ; this.insertRowBtn.addActionListener(this) ; this.addRowBtn.addActionListener(this) ; this.removeRowBtn.addActionListener(this) ; this.insertMulRowBtn.addActionListener(this) ; this.updateBtn.addActionListener(this) ; } /*顯示錶格的函式*/ public void refreshFun() { while (tableModel.getRowCount()>0) { tableModel.removeRow(0); } try { Class.forName ("COM.ibm.db2.jdbc.app.DB2Driver"); //註冊 Connection conn = DriverManager.getConnection("JDBC:DB2:SAMPLE","db2admin","db2admin"); String sql = "SELECT EMPNO, FIRSTNME,MIDINIT,LASTNAME,WORKDEPT,PHONENO,HIREDATE,JOB,EDLEVEL,SEX,BIRTHDATE,SALARY,BONUS,COMM FROM TEMPL" ; Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { Object obj1 = rs.getString(1); Object obj2 = rs.getString(2); Object obj3 = rs.getString(3); Object obj4 = rs.getString(4); Object obj5 = rs.getString(5); Object obj6 = rs.getString(6); Object obj7 = rs.getString(7); Object obj8 = rs.getString(8); Object obj9 = rs.getString(9); Object obj10 = rs.getString(10); Object obj11 = rs.getString(11); Object obj12 = rs.getString(12); Object obj13 = rs.getString(13); Object obj14 = rs.getString(14); Object obj[] = {obj1,obj2,obj3,obj4,obj5,obj6,obj7,obj8,obj9,obj10,obj11,obj12,obj13,obj14}; this.tableModel.addRow(obj); } rs.close(); conn.close(); } catch (SQLException e) { System.out.println("SQLState:" + e.getSQLState()); System.out.println("Message:" + e.getMessage()); System.out.println("Vendor:" + e.getErrorCode()); } catch (ClassNotFoundException e) { System.out.println(e); } } //向資料庫插入一行資料 public void insertRowFun() { try { Object obj1 = textFile1.getText(); Object obj2 = textFile2.getText(); Object obj3 = textFile3.getText(); Object obj4 = textFile4.getText(); Object obj5 = textFile5.getText(); Object obj6 = textFile6.getText(); Object obj7 = textFile7.getText(); Object obj8 = textFile8.getText(); Object obj9 = textFile9.getText(); Object obj10 = textFile10.getText(); Object obj11 = textFile11.getText(); Object obj12 = textFile12.getText(); Object obj13 = textFile13.getText(); Object obj14 = textFile14.getText(); Class.forName ("COM.ibm.db2.jdbc.app.DB2Driver"); //註冊 Connection conn = DriverManager.getConnection("JDBC:DB2:SAMPLE","db2admin","db2admin"); String sql = "INSERT INTO TEMPL(EMPNO, FIRSTNME,MIDINIT,LASTNAME,WORKDEPT,PHONENO,HIREDATE,JOB,EDLEVEL,SEX,BIRTHDATE,SALARY,BONUS,COMM)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setObject(1,obj1); pstmt.setObject(2,obj2); pstmt.setObject(3,obj3); pstmt.setObject(4,obj4); pstmt.setObject(5,obj5); pstmt.setObject(6,obj6); pstmt.setObject(7,obj7); pstmt.setObject(8,obj8); pstmt.setObject(9,obj9); pstmt.setObject(10,obj10); pstmt.setObject(11,obj11); pstmt.setObject(12,obj12); pstmt.setObject(13,obj13); pstmt.setObject(14,obj14); pstmt.executeUpdate(); conn.close(); } catch (SQLException e) { System.out.println("SQLState:" + e.getSQLState()); System.out.println("Message:" + e.getMessage()); System.out.println("Vendor:" + e.getErrorCode()); } catch (ClassNotFoundException e) { System.out.println(e); } catch(NumberFormatException e) { System.out.println(e); } } //向資料庫插入多行資料 public void insertMulRowFun() { try { Class.forName ("COM.ibm.db2.jdbc.app.DB2Driver"); //註冊 Connection conn = DriverManager.getConnection("JDBC:DB2:SAMPLE","db2admin","db2admin"); String sql = "INSERT INTO TEMPL(EMPNO, FIRSTNME,MIDINIT,LASTNAME,WORKDEPT,PHONENO,HIREDATE,JOB,EDLEVEL,SEX,BIRTHDATE,SALARY,BONUS,COMM)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(sql); for(int i = 0; i < tableModelInser.getRowCount(); i++) { Object obj1 = tableModelInser.getValueAt(i,0); Object obj2 = tableModelInser.getValueAt(i,1); Object obj3 = tableModelInser.getValueAt(i,2); Object obj4 = tableModelInser.getValueAt(i,3); Object obj5 = tableModelInser.getValueAt(i,4); Object obj6 = tableModelInser.getValueAt(i,5); Object obj7 = tableModelInser.getValueAt(i,6); Object obj8 = tableModelInser.getValueAt(i,7); Object obj9 = tableModelInser.getValueAt(i,8); Object obj10 = tableModelInser.getValueAt(i,9); Object obj11 = tableModelInser.getValueAt(i,10); Object obj12 = tableModelInser.getValueAt(i,11); Object obj13 = tableModelInser.getValueAt(i,12); Object obj14 = tableModelInser.getValueAt(i,13); pstmt.setObject(1,obj1); pstmt.setObject(2,obj2); pstmt.setObject(3,obj3); pstmt.setObject(4,obj4); pstmt.setObject(5,obj5); pstmt.setObject(6,obj6); pstmt.setObject(7,obj7); pstmt.setObject(8,obj8); pstmt.setObject(9,obj9); pstmt.setObject(10,obj10); pstmt.setObject(11,obj11); pstmt.setObject(12,obj12); pstmt.setObject(13,obj13); pstmt.setObject(14,obj14); pstmt.executeUpdate(); } conn.close(); } catch (SQLException e) { System.out.println("SQLState:" + e.getSQLState()); System.out.println("Message:" + e.getMessage()); System.out.println("Vendor:" + e.getErrorCode()); } catch (ClassNotFoundException e) { System.out.println(e); } catch(NumberFormatException e) { System.out.println(e); } } //子查詢插入 public void updateFun() { try { Object obj1 = updateTextFile1.getText(); Object obj2 = updateTextFile2.getText(); Class.forName ("COM.ibm.db2.jdbc.app.DB2Driver"); //註冊 Connection conn = DriverManager.getConnection("JDBC:DB2:SAMPLE","db2admin","db2admin"); String sql = "INSERT INTO EMPLOYEE SELECT * FROM TEMPL WHERE "+obj1+"='"+obj2+"'"; Statement stmt = conn.createStatement(); stmt.executeUpdate(sql); conn.close(); } catch (SQLException e) { System.out.println("SQLState:" + e.getSQLState()); System.out.println("Message:" + e.getMessage()); System.out.println("Vendor:" + e.getErrorCode()); } catch (ClassNotFoundException e) { System.out.println(e); } catch(NumberFormatException e) { System.out.println(e); } } //監聽器處理函式 public void actionPerformed(ActionEvent e) { if(e.getSource()==this.refreshBtn) { this.refreshFun(); } if(e.getSource()==this.insertRowBtn) { this.insertRowFun(); } if(e.getSource()==this.addRowBtn) { this.tableModelInser.addRow(new Object[] {}); } if(e.getSource()==this.removeRowBtn) { int rowCount = this.tableModelInser.getRowCount() - 1 ; if(rowCount>=0) { // 判斷是否還有行可以刪除 this.tableModelInser.removeRow(rowCount) ; this.tableModelInser.setRowCount(rowCount) ; // 設定新的行數 } } if(e.getSource()==this.insertMulRowBtn) { this.insertMulRowFun(); } if(e.getSource()==this.updateBtn) { this.updateFun(); } } } public class Test5 { public static void main(String args[]) { new Table() ; } }
這裡是課程的原始碼
連結:
提取碼:1234