1. 程式人生 > 資料庫 >吉林大學《資料庫應用程式開發》

吉林大學《資料庫應用程式開發》

任務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是不能相同的,所以不可能把查詢出來的結果插回原來的表中

所以只能插入一個新表,那什麼表和employee表有相同結構呢?想起老師讓我們建立一個employee的副本templ的作用了麼?就是用在這裡的
圖形介面如下
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