【Java】-小项目-小型学生管理系统

本项目实例是根据“韩顺平-循序渐进学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 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)后台进行分离,程序框架图如下:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值