本項目執行個體是根據“韓順平-循序漸進學java"的教學視頻所完成的,該項目的介面如下圖所示,這個微型的學生管理系統可通過對資料庫的操作,具有基本的增刪改查功能。所涉及的知識點主要包括介面的布局,串連資料庫,用sql語句對資料庫進行操作。很適合入門學習。
在做該項目之前,我們需要在資料庫裡面建表,包括”學號、名字、性別、年齡、籍貫、系別“,將學號設定為主鍵,代碼如下:
--建立學生表create table stu(stuId varchar(30) primary key,stuName nvarchar(50) not null,stuSex nchar(1) check (stuSex in('男','女')) default '男',stuAge int check (stuAge>1),stuJg nvarchar(30),stuDept nvarchar(40))
接下來我們再建立一個java檔案——StuManager.java,它的作用是負責搭建介面,包括一些按鈕和文字框,同時也對按下各個按鈕的事件進行監聽,是整個項目的中心指揮部,代碼如下:
/* * 完成一個mini版的學生管理系統 model2 * 1.查詢任務 * 2.添加一個學生 * */package com.test2;import javax.swing.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.*;import java.awt.*;import java.awt.event.*;public class StuManager extends JFrame implements ActionListener{//定義一些控制項JPanel jp1,jp2;JLabel jl1;JButton jb1,jb2,jb3,jb4;JTable jt;JScrollPane jsp;JTextField jtf;StuModel sm;//rowData用來存允許存取資料//columnNames用來存放列名Vector rowData,columnNames;public static void main(String[] args) {// TODO Auto-generated method stubStuManager test3=new StuManager();}//建構函式public StuManager(){jp1=new JPanel();jtf=new JTextField(10);jb1=new JButton("查詢");jb1.addActionListener(this);jl1=new JLabel("請輸入名字");//把各個控制項加入到jp1jp1.add(jl1);jp1.add(jtf);jp1.add(jb1);jp2=new JPanel();jb2=new JButton("添加");jb2.addActionListener(this);jb3=new JButton("修改");jb3.addActionListener(this);jb4=new JButton("刪除");jb4.addActionListener(this);//把各個按鈕加入到jp2jp2.add(jb2);jp2.add(jb3);jp2.add(jb4);//建立一個資料模型對象sm=new StuModel();String []paras={"1"};sm.queryStu("select * from stu where 1=?", paras);//初始化JTablejt=new JTable(sm);//初始化jsp JScrollPanejsp=new JScrollPane(jt);//把jsp放入到jframethis.add(jsp);this.add(jp1,"North");this.add(jp2,"South");this.setSize(400, 300);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stub//判斷是哪個按鈕被點擊if(e.getSource()==jb1){System.out.println("使用者希望查詢");//因為把對錶的資料封裝到到StuModel中,我們就可比較簡單完成查詢String name=this.jtf.getText().trim();//寫一個sql語句String sql="select * from stu where stuName=?";String paras[]={name};//構建新的資料模型類,並更新sm=new StuModel( );sm.queryStu(sql, paras);//更新JTablejt.setModel(sm);}//當使用者點擊=添加else if(e.getSource()==jb2){StuAddDialog sa=new StuAddDialog(this,"新增學生",true);//重新再獲得新的資料模型//構建新的資料模型類,並更新sm=new StuModel();String []paras2={"1"};sm.queryStu("select * from stu where 1=?", paras2);//更新JTablejt.setModel(sm);}else if(e.getSource()==jb3){//使用者希望修改學生資訊int rowNum=this.jt.getSelectedRow();if(rowNum==-1){//提示JOptionPane.showMessageDialog(this, "請選擇一行");return;}//顯示修改對話方塊new StuUpdDialog(this,"修改學生資訊",true,sm,rowNum);//構建新的資料模型類,並更新sm=new StuModel();String []paras2={"1"};sm.queryStu("select * from stu where 1=?", paras2);//更新JTablejt.setModel(sm);}else if(e.getSource()==jb4){//說明使用者希望刪除記錄//1.得到該學生的id//getSelectedRow會返回使用者點中的行//如果使用者一行都沒選擇,則返回一個 -1int rowNum=this.jt.getSelectedRow();if(rowNum==-1){//提示JOptionPane.showMessageDialog(this, "請選擇一行");return;}//得到學生編號String stuId=(String)sm.getValueAt(rowNum, 0);//建立一個sqlString sql="delete from stu where stuid=?";String []paras={stuId};StuModel temp=new StuModel();temp.updStu(sql, paras);//更新資料模型sm=new StuModel();String []paras2={"1"};sm.queryStu("select * from stu where 1=?", paras2);//更新JTablejt.setModel(sm);}}}
然後,我們再建立一個StuAddDialog,java檔案,它的作用是,當我們點擊一個”添加“按鈕時,彈出一個對話方塊,如圖所示:
代碼如下:
package com.test2;import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class StuAddDialog extends JDialog implements ActionListener{//定義我需要的swing組件JLabel jl1,jl2,jl3,jl4,jl5,jl6;JButton jb1,jb2;JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;JPanel jp1,jp2,jp3;//owner它的父視窗//title 視窗名//modal 指定是模態視窗,還是非模態視窗public StuAddDialog(Frame owner,String title ,boolean modal){super(owner,title,modal);//調用父類構造方法,達到強制回應對話方塊效果jp1=new JPanel();jp2=new JPanel();jp3=new JPanel();jl1=new JLabel("學號");jl2=new JLabel("姓名");jl3=new JLabel("性別");jl4=new JLabel("年齡");jl5=new JLabel("籍貫");jl6=new JLabel("系別");jtf1=new JTextField();jtf2=new JTextField();jtf3=new JTextField();jtf4=new JTextField();jtf5=new JTextField();jtf6=new JTextField();jb1=new JButton("添加");//註冊監聽jb1.addActionListener(this);jb2=new JButton("取消");//設定布局jp1.setLayout(new GridLayout(6,1));jp2.setLayout(new GridLayout(6,1));//添加組件jp1.add(jl1);jp1.add(jl2);jp1.add(jl3);jp1.add(jl4);jp1.add(jl5);jp1.add(jl6);jp2.add(jtf1);jp2.add(jtf2);jp2.add(jtf3);jp2.add(jtf4);jp2.add(jtf5);jp2.add(jtf6);jp3.add(jb1);jp3.add(jb2);this.add(jp1,BorderLayout.WEST);this.add(jp2,BorderLayout.CENTER);this.add(jp3,BorderLayout.SOUTH);//展現this.setSize(300,250);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif(e.getSource()==jb1){//希望添加StuModel temp=new StuModel();String sql="insert into stu values(?,?,?,?,?,?)";String []paras={jtf1.getText(),jtf2.getText(),jtf3.getText(),jtf4.getText(),jtf5.getText(),jtf6.getText()};if(!temp.updStu(sql, paras)){//提示JOptionPane.showMessageDialog(this, "添加失敗");}//關閉對話方塊this.dispose();}}}
接下來,我們建立一個StuupdDialog.java,它是負責對學生的資訊進行更新,代碼如下:
/* * 修改學生資訊 * */package com.test2;import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class StuUpdDialog extends JDialog implements ActionListener{//定義我需要的swing組件JLabel jl1,jl2,jl3,jl4,jl5,jl6;JButton jb1,jb2;JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;JPanel jp1,jp2,jp3;//owner它的父視窗//title 視窗名//modal 指定是模態視窗,還是非模態視窗public StuUpdDialog(Frame owner,String title ,boolean modal,StuModel sm,int rowNums){super(owner,title,modal);//調用父類構造方法,達到強制回應對話方塊效果jp1=new JPanel();jp2=new JPanel();jp3=new JPanel();jl1=new JLabel("學號");jl2=new JLabel("姓名");jl3=new JLabel("性別");jl4=new JLabel("年齡");jl5=new JLabel("籍貫");jl6=new JLabel("系別");jtf1=new JTextField();//初始化資料jtf1.setText((String)sm.getValueAt(rowNums, 0));//讓jtf1不能修改jtf1.setEditable(false);jtf2=new JTextField();jtf2.setText((String)sm.getValueAt(rowNums, 1));jtf3=new JTextField();jtf3.setText((String)sm.getValueAt(rowNums, 2));jtf4=new JTextField();jtf4.setText((String)sm.getValueAt(rowNums, 3).toString());jtf5=new JTextField();jtf5.setText((String)sm.getValueAt(rowNums, 4));jtf6=new JTextField();jtf6.setText((String)sm.getValueAt(rowNums, 5));jb1=new JButton("修改");//註冊監聽jb1.addActionListener(this);jb2=new JButton("取消");//設定布局jp1.setLayout(new GridLayout(6,1));jp2.setLayout(new GridLayout(6,1));//添加組件jp1.add(jl1);jp1.add(jl2);jp1.add(jl3);jp1.add(jl4);jp1.add(jl5);jp1.add(jl6);jp2.add(jtf1);jp2.add(jtf2);jp2.add(jtf3);jp2.add(jtf4);jp2.add(jtf5);jp2.add(jtf6);jp3.add(jb1);jp3.add(jb2);this.add(jp1,BorderLayout.WEST);this.add(jp2,BorderLayout.CENTER);this.add(jp3,BorderLayout.SOUTH);//展現this.setSize(300,250);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif(e.getSource()==jb1){//對使用者點擊添加按鈕後的響應動作//做一個sql//先行編譯語句對象String str="update stu set stuName=?,stuSex=?," +"stuAge=?,stuJg=?,stuDept=? where stuId=?";String []paras={jtf2.getText(),jtf3.getText(),jtf4.getText(),jtf5.getText(),jtf6.getText(),jtf1.getText()};StuModel temp=new StuModel();temp.updStu(str, paras);this.dispose();}}}
我們再建立一個StuModel.java,它是把對學生表的各種操作封裝到一個模型中,代碼如下:
/* * 這是我的一個stu表的模型 * 可以把對student表的各種操作封裝到該模型中 * */package com.test2;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.Vector;import javax.swing.table.*;public class StuModel extends AbstractTableModel{//rowData用來存允許存取資料//columnNames用來存放列名Vector rowData,columnNames;//定義操作資料庫需要的東西PreparedStatement ps=null;Connection ct=null;ResultSet rs=null;String url="jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=acm";String user="sa";String passwd="sa";String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";//新增學生(增,刪,改)public boolean updStu(String sql,String []paras){//建立sqlHelper(如果程式並發性不考慮,可以把sqlHelper做成static)SqlHelper sqlHelper = new SqlHelper();return sqlHelper.updExecute(sql, paras);}//查詢的本質就是初始化public void queryStu(String sql,String []paras){SqlHelper sqlHelper =null;//中間columnNames=new Vector();//設定列名columnNames.add("學號");columnNames.add("名字");columnNames.add("性別");columnNames.add("年齡");columnNames.add("籍貫");columnNames.add("系別");rowData=new Vector();try{sqlHelper = new SqlHelper();ResultSet rs=sqlHelper.queryExecute(sql, paras);while(rs.next()){Vector hang=new Vector();hang.add(rs.getString(1));hang.add(rs.getString(2));hang.add(rs.getString(3));hang.add(rs.getInt(4));hang.add(rs.getString(5));hang.add(rs.getString(6));//加入到rowDatarowData.add(hang);}}catch(Exception e){e.printStackTrace();}finally{sqlHelper.close();}}//得到共有多少行public int getRowCount() {// TODO Auto-generated method stubreturn this.rowData.size();}//得到共有多少列public int getColumnCount() {return this.columnNames.size();}//得到某行某列的資料public Object getValueAt(int row, int column) {// TODO Auto-generated method stubreturn ((Vector)this.rowData.get(row)).get(column);}@Overridepublic String getColumnName(int column) {// TODO Auto-generated method stubreturn (String)this.columnNames.get(column);}}
最後,我們再建立一個檔案SqlHelper.java,這是一個專門用於對資料庫進行操作的類
/* * 這是一個對資料庫進行操作的類(SqlHelper) * */package com.test2;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;public class SqlHelper {//定義操作資料庫需要的東西PreparedStatement ps=null;Connection ct=null;ResultSet rs=null;String url="jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=acm";String user="sa";String passwd="sa";String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";//關閉資料庫資源public void close(){//關閉try{if(rs!=null) rs.close();if(ps!=null) ps.close();if(ct!=null) ct.close();}catch(Exception e){e.printStackTrace();}}//寫了一個不需要注入的方法public ResultSet queryExcecute(String sql){try{//1.載入驅動Class.forName(driver);//2.得到串連ct=DriverManager.getConnection(url,user,passwd);//3.建立psps=ct.prepareStatement(sql);rs=ps.executeQuery();}catch(Exception e){e.printStackTrace();}finally{//關閉資源}return rs;}//查詢資料庫的操作public ResultSet queryExecute(String sql,String []paras){try{//1.載入驅動Class.forName(driver);//2.得到串連ct=DriverManager.getConnection(url,user,passwd);//3.建立psps=ct.prepareStatement(sql);//給ps的。賦值for(int i=0;i<paras.length;i++){ps.setString(i+1, paras[i]);}rs=ps.executeQuery();}catch(Exception e){e.printStackTrace();}finally{//關閉資源}return rs;}//把增刪改合在一起public boolean updExecute(String sql,String []paras){boolean b=true;try{//1.載入驅動Class.forName(driver);//2.得到串連ct=DriverManager.getConnection(url,user,passwd);//3.建立psps=ct.prepareStatement(sql);//給ps的。賦值for(int i=0;i<paras.length;i++){ps.setString(i+1, paras[i]);}//4.執行操作if(ps.executeUpdate()!=1){b=false;}}catch(Exception e){b=false;e.printStackTrace();}finally{this.close();}return b;}}
本項目採用的是MV設計模式,即V(View)視圖和M(Model)後台進行分離,程式架構圖如下: