【Java】-小專案-小型學生管理系統
阿新 • • 發佈:2019-02-19
本專案例項是根據“韓順平-循序漸進學java"的教學視訊所完成的,該專案的介面如下圖所示,這個微型的學生管理系統可通過對資料庫的操作,具有基本的增刪改查功能。所涉及的知識點主要包括介面的佈局,連線資料庫,用sql語句對資料庫進行操作。很適合入門學習。
在做該專案之前,我們需要在資料庫裡面建表,包括”學號、名字、性別、年齡、籍貫、系別“,將學號設定為主鍵,程式碼如下:
接下來我們再新建一個java檔案——StuManager.java,它的作用是負責搭建介面,包括一些按鈕和文字框,同時也對按下各個按鈕的事件進行監聽,是整個專案的中心指揮部,程式碼如下:--建立學生表 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) )
/* * 完成一個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 stub StuManager test3=new StuManager(); } //建構函式 public StuManager() { jp1=new JPanel(); jtf=new JTextField(10); jb1=new JButton("查詢"); jb1.addActionListener(this); jl1=new JLabel("請輸入名字"); //把各個控制元件加入到jp1 jp1.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); //把各個按鈕加入到jp2 jp2.add(jb2); jp2.add(jb3); jp2.add(jb4); //建立一個數據模型物件 sm=new StuModel(); String []paras={"1"}; sm.queryStu("select * from stu where 1=?", paras); //初始化JTable jt=new JTable(sm); //初始化jsp JScrollPane jsp=new JScrollPane(jt); //把jsp放入到jframe this.add(jsp); this.add(jp1,"North"); this.add(jp2,"South"); this.setSize(400, 300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } @Override public 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); //更新JTable jt.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); //更新JTable jt.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); //更新JTable jt.setModel(sm); } else if(e.getSource()==jb4) { //說明使用者希望刪除記錄 //1.得到該學生的id //getSelectedRow會返回使用者點中的行 //如果使用者一行都沒選擇,則返回一個 -1 int rowNum=this.jt.getSelectedRow(); if(rowNum==-1) { //提示 JOptionPane.showMessageDialog(this, "請選擇一行"); return; } //得到學生編號 String stuId=(String)sm.getValueAt(rowNum, 0); //建立一個sql String 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); //更新JTable jt.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); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(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);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(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));
//加入到rowData
rowData.add(hang);
}
}catch(Exception e){
e.printStackTrace();
}finally{
sqlHelper.close();
}
}
//得到共有多少行
public int getRowCount() {
// TODO Auto-generated method stub
return this.rowData.size();
}
//得到共有多少列
public int getColumnCount() {
return this.columnNames.size();
}
//得到某行某列的資料
public Object getValueAt(int row, int column) {
// TODO Auto-generated method stub
return ((Vector)this.rowData.get(row)).get(column);
}
@Override
public String getColumnName(int column) {
// TODO Auto-generated method stub
return (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.建立ps
ps=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.建立ps
ps=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.建立ps
ps=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)後臺進行分離,程式框架圖如下: