Java+sql 实现-小型教务系统

ps:en~ 作为软件的菜鸟,最近在做java的课设(实现简单的学生信息管理系统),由于初学java和数据库,实现的过程异常艰辛,期间也填了许多没有百度到的坑,不过经过两周的奋斗也算是简单完成。SO~ 新手的我打算写下人生第一篇博文,算是对自己实现课设期间的总结,以便以后能够回头参考,也是方便有需要的童鞋(大神绕道~)能用到!(主要由于之前百度的文档并不是很全,比如用jdbc连接数据库,所以在此写的尽量详细些)嘻嘻~

一、课设概述
1.任务
  根据所学JAVA以及数据库知识,设计出符合要求的小型教务系统即简单的学生信息管理系统(其实貌似仅限于本地~)。本系统可以实现管理系统中的登录(包括管理员、教师、学生)以及增、删、改、查等功能,以实现前台对后台数据库的管理。
2.目的
  哈哈,花点心思简单实现出来就知道了~~
3.要求
  要求运用JAVA及数据库等方面的知识,对学生信息管理 系统的开发,在功能上实现管理系统中增删改查;在界面上注意设计的美观程度;能够通过不同角色登录系统,并实现角色相对应的操作功能,以完成信息管理。

二、数据库设计的过程(鉴于本人还未学,从简)
2.1、需求分析
 (1).用户分析
  此学生信息管理系统的用户分为管理员,教师和学生,其中管理员可以实现对教师信息、学生信息、课程信息、班级信息和成绩信息的管理(增删改查);教师可以对个人信息的查询和密码修改、对学生信息、班级信息、课程信息的查询以及对成绩信息的修改;学生只能对个人信息查询及密码修改和对课程信息、班级信息、成绩信息的查询;所以对不同角色的权限分配很重要(不过貌似不需要在数据库里用授权)。以及用用户ID和密码来核对用户对系统安全很重要。
 2).功能需求
  1.登录模块:主要分为管理员、教师和学生,对于登录后,按照各自的需求进一步执行。
  2.基本信息管理模块:管理员、教师和学生实现相对应的信息管理。
2.2、概念结构设计
2.3、逻辑结构设计
  将概念设计阶段的E-R图转换成关系模式,设计出“学生管理系统”的逻辑结构,并根据程序设计需要设计视图。
 (1)首先创建数据库--“教务系统”;
 (2)在SQL Server 2008中创建关系数据模型(即表结构),本系统本人共设计6个表分别为管理员,教师表,学生表,班级表,课程表和成绩表;以及设计4个视图(由于前期构思未能全面,后期需要时添加的)分别为班级表1,成绩表1,课程表1,课程表2。
  a.管理员
create table 管理员(管理员号 char(10) ,登录密码 char(20))

Java+sql 实现-小型教务系统_第1张图片
Java+sql 实现-小型教务系统_第2张图片

  b.教师表

create table 教师表(教师号 char(10) primary key,姓名 char(20),性别 char(2),学历char(20),职称 char(20),所属学院char(20),登录密码 char(20))


Java+sql 实现-小型教务系统_第3张图片

  c.学生表

create table 学生表(学号 char(10)  not null  primary key,姓名 char(20) not null,性别 char(2),年龄 smallint,班级号 char(10), foreign key(班级号) references 班级表(班级号),密码 char(20))

Java+sql 实现-小型教务系统_第4张图片

Java+sql 实现-小型教务系统_第5张图片

  d.班级表

create table 班级表(班级号 char(10) primary key,班级名称 char(20),所属学院 char(20),班级人数 smallint,班主任 char(20));

Java+sql 实现-小型教务系统_第6张图片

Java+sql 实现-小型教务系统_第7张图片

  e.课程表

create table 课程(课程号 char(20) primary key,课程名 char(20) ,教师号 char(20), foreign key(教师号) references 教师表(教师号));

Java+sql 实现-小型教务系统_第8张图片

Java+sql 实现-小型教务系统_第9张图片


  f.成绩表

create table 成绩表(学号 char(10),课程号 char(20),成绩 smallint,primary key(学号,课号),foreign key(学号) references 学生表(学号),foreign key(课程号) references 课程表(课程号)); 

Java+sql 实现-小型教务系统_第10张图片

Java+sql 实现-小型教务系统_第11张图片

后面的视图就不贴图了,基本创建过程均是相似的~~


    g.班级表1视图

create view 班级表
as
select 学生表.学号,班级表.班级号,班级表.班级名称,班级表.所属学院,班级表.班级人数,班级表.班主任
from 学生表,班级表
where 学生表.班级号=班级表.班级号

  h.成绩表1视图

create view 成绩表 as
select 成绩表.学号,学生表.姓名 学生姓名,成绩表.课程号,课程表.课程名,教师表.姓名 教师姓名,成绩表.成绩
from 成绩表,学生表,课程表,教师表
where 成绩表.学号=学生表.学号 and 成绩表.课程号=课程表.课程号 and 课程表.教师号=教师表.教师号

  i.课程表1视图

create view 课程表1
as 
select 成绩表.课程号,课程表.课程名,课程表.教师号,教师表.姓名 教师姓名
from 成绩表,课程表,教师表
where 成绩表.课程号=课程表.课程号 and 课程表.教师号=教师表.教师号

  j.课程表2视图

create view 课程表2
as 
select 成绩表.学号,成绩表.课程号,课程表.课程名,课程表.教师号,教师表.姓名 教师姓名
from 成绩表,课程表,教师表
where 成绩表.课程号=课程表.课程号 and 课程表.教师号=教师表.教师号

  k.学生信息表视图

create view学生信息表
as
select学生表.学号,学生表.姓名,学生表.性别,学生表.年龄,学生表.班级号,班级表.班级名称,成绩表.课程号,课程表.课程名,成绩表.成绩,课程表.教师号
from学生表,班级表,成绩表,课程表,
where学生表.班级号=班级表.班级号and学生表.学号=成绩表.学号and课程表.课程号=成绩表.课程号

2.4、物理结构设计(暂无)
2.3、数据库实施和运行维护

三、系统设计与实现
3.1、系统设计
 (1)系统功能
  1.用户登录页面。该页面能够进行管理员、教师、学生登录。用户通过用户ID和密码验证账号通过后方可进入系统,一定程度上保证了信息的安全性,防止信息被非正规篡改。
  2.管理员主页。通过管理员账号登录后,可以通过该界面对教师信息和学生信息进行增删改查的功能操作,以及对课程、班级和成绩信息进行管理。
  3.教师主页。通过教师账号登录后,可以通过该页面对教师个人的信息进行查询和对密码的修改,以及对学生、班级、课程信息的查询和对成绩信息的修改。
  4.学生主页。通过学生账号登录后,可以通过该页面对个人信息查询和对班级、课程、成绩信息的查询。
 (2)开发环境和软件
  1.操作系统:win10
  2.数据库软件:SQL Server 2008
  3.java开发工具:Eclipse
3.2、系统实现
 (1)用jdbc连接数据库
 好了,数据库中所需要的表和视图都已经建立好了,那么---对~激动人心的时刻就要到了,马上就要开始真正用java代码来创建页面,实现功能了,但是在这之前,有一件非常非常重要的事情要完成,那就是要用jdbc来实现将eclipse和数据库连接,以达到系统实现后能用前台操作来控制后台数据库,否则上来的import java.sql.*;语句就会报错。那么,该怎么完成这一步呢,由于本人是菜鸟入门,搭建的时候毫无经验,以至于花费了两天的的时间才连接好。纵使看到控制台print“Connection Success”时异常激动与开心,但盲目乱闯的痛苦过程却也是让人刻骨铭心。在此总结出一点经验:一定要学会用好搜索引擎,才能准确的找到问题的解决方法。在这里推荐一个教程,过程简单清晰,且能够一步到位,成功连接,我就不多赘述。java通过jdbc连接SQL server2008。
  连接过程需要写连接方法~~~
        String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=教务系统";
	String username="sa";
	String userpwd="123";
	
	//连接数据库
	public void connDB(){  //连接数据库方法
		try {
			conn=DriverManager.getConnection(dbURL,username,userpwd);
			stmt=conn.createStatement();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}


 (2)系统实现
  相信连接数据库一定难不倒聪明机智的你,那么接下来进入系统实现过程!!!先上个图~~~~
Java+sql 实现-小型教务系统_第12张图片
Java+sql 实现-小型教务系统_第13张图片
哈哈~~你没看错,看似如此简单的信息系统竟然被我写出了这么多类(其中的几个Test类为在找bug过程中用来调试用的),由于后期就没看别人的文档了,也不清楚别人的实现过程是简单还是复杂,所以这个系统实现的过程完全个人的想法,可能是技术问题。那么,接下来就简单讲解下实现过程。
  1.登录界面(DLFrame类)
  先上效果图先~~~~
Java+sql 实现-小型教务系统_第14张图片
  当最初实现出这个页面时,小编还是很兴奋地~~,首先该登录页面需要什么组件或者是编者想要添加什么组件我们都要提前构思好。就以上图来说:1.窗口(继承JFrame类),2.“用户登录/LOGIN”的标签(JLabel类),3.角色栏,用于用户选择的下拉列表(JComboBox类)4.用户ID栏,填写账号的文本框(JTextField类),5.密码栏,能够对用户输入的密码自动掩盖的密码文本(JPasswordField类),6.三个按钮(JButton类),7.以及背景图设置(ImageIcon类)。基本组件构思好后就可以用类实现显示,并用相对应得布局管理器来将组件全部添加进窗口。大概思路在此,而代码的具体实现是java的基础知识(本人也是看视屏补得基础知识),就不需要多说了,贴段源码~~~ 
DLFrame(){ //构造方法
	    super("合肥师范学院官网");
	    setLayout(new FlowLayout());
	    p1=new JPanel();
	    p2=new JPanel();
	    p3=new JPanel();
	    f1=new Font("宋体",Font.BOLD,30);
	    f2=new Font("幼圆",Font.ITALIC,30);
	    f3=new Font("楷书",Font.BOLD,18);
	    f4=new Font("隶书",Font.PLAIN,40);
	    
	    //设置面板1的标签
	    head1.setFont(f1);
	    head1.setForeground(Color.BLUE);
	    head2.setFont(f2);
	    head2.setForeground(Color.GRAY);
	    //p1.setBackground(new Color(255,240,240));
	    p1.setBackground(null);
	    p1.setOpaque(false);
		p1.add(head1);
	    p1.add(head2);
	    
	    //面板2为4行2列的网格布局管理器
	    p2.setLayout(new GridLayout(4,2));
	    /*usename.setFont(f3);
	    password.setFont(f3);
	    role.setFont(f3);*/
	    //下拉列表中添加数据
	    boxrole.addItem("管理员");
	    boxrole.addItem("教师");
	    boxrole.addItem("学生");
	    //p2.setBackground(new Color(240,255,240));
	    p2.setBackground(null);
	    p2.setOpaque(false);
	    boxrole.setOpaque(false);
	    usenametext.setOpaque(false);
	    txtPwd.setOpaque(false);
	    p2.add(role);
	    p2.add(boxrole);
	    p2.add(usename);
	    p2.add(usenametext);
	    p2.add(password);
	    p2.add(txtPwd);
	    
	    
	    
	    //将3个按钮添加进面板3中
	    //p3.setBackground(new Color(230,230,250));
	    p3.setBackground(null);
	    p3.setOpaque(false);//设置透明
	    a.setContentAreaFilled(false);
	    b.setContentAreaFilled(false);
	    c.setContentAreaFilled(false);
	    //setGround(a);
	    p3.add(a);
	    p3.add(b);
	    p3.add(c);
	    
	    //将三个面板添加进框架容器中
	    this.add(p1);
	    this.add(p2);
	    this.add(p3);
	    //this.add(new MyPanel());
	    //设置背景图片  
	    
	    ImageIcon ic=new ImageIcon("C:\\Users\\YXS\\eclipse-workspace\\edu-a-s\\src\\edu\\yxs\\sqldemo\\4.jpg");
	    JLabel l=new JLabel(ic);
	    l.setBounds(0,0,ic.getIconWidth(),ic.getIconHeight());
	    //l.setBounds(0,0,this.getWidth(),this.getHeight());
	    //JPanel ip=(JPanel)this.getContentPane();
	    this.getLayeredPane().add(l,new Integer(Integer.MIN_VALUE));
	    ((JPanel)this.getContentPane()).setOpaque(false);//设置透明		
	    
	    //设置顶层容器的大小、位置、可见性及close功能
	    setDefaultCloseOperation(EXIT_ON_CLOSE);
	    setSize(350,300);
	    setLocationRelativeTo(null);
	    setVisible(true);
	    
	    //注册事件监听器
	    //这里的this就是本类,已经是ActionListener的实现类    --有待探究
	    boxrole.addItemListener(this);  
	    a.addActionListener(this);
	    b.addActionListener(this);
	    c.addActionListener(this);
	}


  2.管理员主页(GLFrame类)
 先上效果图~~~
Java+sql 实现-小型教务系统_第15张图片
  其中包括教师信息管理模块,学生信息管理模块,课程信息管理模块,成绩信息管理模块,班级信息管理模块登主模块,每一个模块又会对应不同的页面,一大波效果图上线~~~~
(教师图就不贴了~)
Java+sql 实现-小型教务系统_第16张图片
Java+sql 实现-小型教务系统_第17张图片
Java+sql 实现-小型教务系统_第18张图片
Java+sql 实现-小型教务系统_第19张图片
  嗯,大概效果就是这样,具体思路大同小异,无非是每个功能的细节实现与处理上,需要花心思和时间下去,代码方面,就贴点代码段吧~~~
public GLFrame() {   //构造方法
		super("管理员管理页面");
		setLayout(new FlowLayout());
		//设置标签的颜色
	        l.setFont(f1);
	        l.setForeground(Color.blue);
	        //设置按钮字体和颜色
	        btnTM.setFont(f3);
	        btnTM.setContentAreaFilled(false);
	        //btnTM.setBackground(Color.blue);
	        btnSM.setFont(f3);
	        btnSM.setContentAreaFilled(false);
	        btnCM.setFont(f3);
	        btnCM.setContentAreaFilled(false);
	        btnSCM.setFont(f3);
	        btnSCM.setContentAreaFilled(false);
	        btnCSM.setFont(f3);
	        btnCSM.setContentAreaFilled(false);
	        btnEXIT.setFont(f3);
	        btnEXIT.setContentAreaFilled(false);
	    
		p1.add(l);
		p1.setOpaque(false);
		p2.setLayout(new GridLayout(3,2,10,10));
		p2.setOpaque(false);
		p2.add(btnTM);
		p2.add(btnSM);
		p2.add(btnCM);
		p2.add(btnSCM);
		p2.add(btnCSM);
		p2.add(btnEXIT);
		 
		//布局管理器
		this.add(p1);
		this.add(p2);
		
		//设置背景图片
		ImageIcon ic=new ImageIcon("C:\\Users\\YXS\\eclipse-workspace\\edu-a-s\\src\\edu\\yxs\\sqldemo\\5.jpg");
		JLabel l=new JLabel(ic);
		l.setBounds(0,0,ic.getIconWidth(),ic.getIconHeight());
		//l.setBounds(0,0,this.getWidth(),this.getHeight());
		//JPanel ip=(JPanel)this.getContentPane();
		this.getLayeredPane().add(l,new Integer(Integer.MIN_VALUE));
		((JPanel)this.getContentPane()).setOpaque(false);//设置透明
		
		//设置顶层容器的大小、位置、可见性及close功能
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(350,300);
		setLocationRelativeTo(null);
		setVisible(true);
		
		btnTM.addActionListener(this);
		btnSM.addActionListener(this);
		btnCM.addActionListener(this);
		btnSCM.addActionListener(this);
		btnCSM.addActionListener(this);
		btnEXIT.addActionListener(this);
	}
	
	public void actionPerformed(ActionEvent e) {
		//按钮为“教师信息管理”,跳转页面
		if(e.getSource().equals(btnTM)) {
			this.dispose();
			new TM().display();
		}
		//按钮为“学生信息管理”,跳转页面
		if(e.getSource().equals(btnSM)) {
			//new SM().display();
			this.dispose();
			new SM().display();
		}
		//按钮为“课程信息管理”,跳转页面
		if(e.getSource().equals(btnCM)) {
			this.dispose();
			new CM().display();
		}
		//按钮为“成绩信息管理”,跳转页面
		if(e.getSource().equals(btnSCM)) {
			this.dispose();
			new SCM().display();
		}
		//按钮为“班级信息管理”,跳转页面
		if(e.getSource().equals(btnCSM)) {
			this.dispose();
			new ClassM().display();
		}
		//按钮为“退出管理系统”,程序退出
		if(e.getSource().equals(btnEXIT)) {
        	//System.exit(0);
			this.dispose();
			new DLFrame();
		}
	}
长篇标准模型~~~
public TM() {   //构造方法
		super("教师信息管理系统");
		//设置按钮颜色和字体
		btnadd.setFont(f1);
		btnadd.setBackground(new Color(131,175,155));
		btndelete.setFont(f1);
		btndelete.setBackground(new Color(131,175,155));
		btnupdate.setFont(f1);
		btnupdate.setBackground(new Color(131,175,155));
		btnsearch.setFont(f1);
		btnsearch.setBackground(new Color(131,175,155));
		btndisplay.setFont(f1);
		btndisplay.setBackground(new Color(131,175,155));
		btnreturn.setFont(f1);
		btnreturn.setBackground(new Color(131,175,155));
		
		//将按钮添加进菜单栏中
		mb.add(btnadd);
		mb.add(btndelete);
		mb.add(btnupdate);
		mb.add(btnsearch);
		mb.add(btndisplay);
		mb.add(btnreturn);
		
		//连接数据库
		this.connDB();
		//给按钮注册监听器
		btnadd.addActionListener(this);
		btndelete.addActionListener(this);
		btnupdate.addActionListener(this);
		btnsearch.addActionListener(this);
		btndisplay.addActionListener(this);
		btnreturn.addActionListener(this);
		
		setSize(500,300);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		this.setJMenuBar(mb);
	}
	
	public void display() {
		//this.connDB();
		String sql="select * from 教师表";
		ArrayList ar=new ArrayList();  //建立数列进行存储数据库成员信息
		int i=0,j=0;
		try {
			rs=stmt.executeQuery(sql);
			while(rs.next()) {
				ar.add(rs.getString("教师号"));
				ar.add(rs.getString("姓名"));
				ar.add(rs.getString("性别"));
				ar.add(rs.getString("学历"));
				ar.add(rs.getString("职称"));
				ar.add(rs.getString("所属学院"));
				ar.add(rs.getString("登录密码"));
				i++;
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		//创建二维数组进行存储
		arr=new Object[i][7];
		String[] list= {"教师号","姓名","性别","学历","职称","所属学院","登录密码"};
		try {
			rs=stmt.executeQuery("select * from 教师表  order by 教师号");
			while(rs.next()) {
				arr[j][0]=rs.getString("教师号");
				arr[j][1]=rs.getString("姓名");
				arr[j][2]=rs.getString("性别");
				arr[j][3]=rs.getString("学历");
				arr[j][4]=rs.getString("职称");
				arr[j][5]=rs.getString("所属学院");
				arr[j][6]=rs.getString("登录密码");
				j++;
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		tb=new JTable(arr,list);
		jsp=new JScrollPane(tb);
		this.add(jsp);
	}
	
	public void delete() {   //删除信息方法
		String tno=null;  //定义字符变量,来接收教师号   
		int row=tb.getSelectedRow();  //代表鼠标选定的行数
		if(row==-1) {  //表示未被选中
			JOptionPane.showMessageDialog(null,"请选择要删除的记录!");
		}else {
			int x=0;
			try {
				rs=stmt.executeQuery("select * from 教师表");
				while(rs.next() && x<=row) {
					tno=rs.getString("教师号");
					x++;
				}
				stmt.executeUpdate("delete  from 课程表  where 教师号="+tno);
				stmt.executeUpdate("delete  from 教师表  where 教师号="+tno);   //局部变量一定要初始化
				JOptionPane.showMessageDialog(null,"删除成功!");
				this.dispose();
				new TM().display();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
	}
			
	public void update() {
		String sno1=null; //局部变量一定要初始化
		int row=tb.getSelectedRow();  //代表鼠标选定的行数
		if(row==-1) {  //表示未被选中
			JOptionPane.showMessageDialog(null,"请选择要修改的信息!");
		}else {
			int x=0;
			try {
				rs=stmt.executeQuery("select * from 教师表");
				while(rs.next() && x<=row) {
					sno1=rs.getString("教师号");
					x++;
				}
				this.dispose();
				new TMupdate(sno1);
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public void show(String str) {   //查询结果方法
		JFrame f=new JFrame("查询结果");
		//JPanel p=new JPanel();
		f.setLayout(new FlowLayout());
		f.setDefaultCloseOperation(EXIT_ON_CLOSE);
		f.setSize(500,150);
		f.setVisible(true);
		f.setLocationRelativeTo(null);
		Button btnrt=new Button("返回");
		btnrt.setFont(f1);
		btnrt.setBackground(new Color(131,175,155));
		//btnrt.setSize(20,10);

		this.connDB();
		arr=new Object[1][7];
		try {
			rs=stmt.executeQuery("select * from 教师表  where 教师号="+str);
			while(rs.next()) {
				arr[0][0]=rs.getString("教师号");
				arr[0][1]=rs.getString("姓名");
				arr[0][2]=rs.getString("性别");
				arr[0][3]=rs.getString("学历");
				arr[0][4]=rs.getString("职称");
				arr[0][5]=rs.getString("所属学院");
				arr[0][6]=rs.getString("登录密码");
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		String[] list= {"教师号","姓名","性别","学历","职称","所属学院","登录密码"};
		tb1=new JTable(arr,list); //创建表格
		scroll1=new JScrollPane(tb1);
		//f.add(btnrt,BorderLayout.NORTH);
		f.add(btnrt);
		f.add(scroll1);  //此处有个小bug,只有添加进滚轮面板,才能将头部名称显示出来
		//f1.add(btnrt); 
		btnrt.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				f.dispose();
			}
		});
	}
	
	//该方法用来确认是否在数据库中找到教师号
	public boolean searchtest(String str) {
		boolean x=false;
		this.connDB();
		try {
			rs=stmt.executeQuery("select * from 教师表");
			while(rs.next()) {
				if(rs.getString("教师号").trim().equals(str)) {  //在java中,判断字符串是否相同,一定要使用equals函数!!!!!!!!
					x=true;
				}
			}
			//return x;
		}catch(Exception e) {
			e.printStackTrace();
		}
		return x;
	}
	
	//查找方法
	public void search() {   //等效于将一个窗口写在方法里面
		JFrame f=new JFrame("查询");
		f.setLayout(new FlowLayout());
		f.setSize(240,180);
		f.setVisible(true);
		f.setLocationRelativeTo(null);
		JPanel p1=new JPanel();
		JPanel p2=new JPanel();
		JLabel stuno=new JLabel("输入教师号:");
		JTextField stuno1=new JTextField(10);
		Button ok=new Button("确定");
		Button cancel=new Button("取消");
		p1.add(stuno);
		p1.add(stuno1);
		p2.add(ok);
		p2.add(cancel);
		f.add(p1);
		f.add(p2);
		//为组件注册监听器
		ok.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if(stuno1.getText().equals("")) {
					JOptionPane.showMessageDialog(null,"请输入教师号");
				}else {
					if(!searchtest(stuno1.getText().trim())) {
						f.dispose();
						JOptionPane.showMessageDialog(null,"对不起,该教师不存在!");
					}else {
					    f.dispose();
					    //new SM(stuno1.getText());
					    show(stuno1.getText());
					}
				}
			}
		});
		cancel.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				f.dispose();
				//
			}
		});
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				Window w=(Window)e.getComponent();  
				w.dispose();
			}
		});
	}
	
	public void itemStateChanged(ItemEvent e) {
		
	}
	
    public void actionPerformed(ActionEvent e) {
    	if(e.getSource()==btnadd) {
    		this.dispose();
    		new TMadd();
    	}
    	if(e.getSource()==btndelete) {
    		JOptionPane.showMessageDialog(null,"删除操作,谨慎操作!");
    		this.delete();
    	}
    	if(e.getSource()==btnupdate) {
    		//this.dispose();
    		this.update(); 
    	}
    	if(e.getSource()==btnsearch) {
    		this.search();
    	}
    	if(e.getSource()==btndisplay) {
    		this.dispose();
    		new TM().display();
    	}
    	if(e.getSource()==btnreturn) {
    		this.dispose();
        	new GLFrame();
    	}
    }
  基本代码都是大同小异,在于具体实现细节烧脑!

  3.教师主页(TeacherFrame类)先上图~~
Java+sql 实现-小型教务系统_第20张图片
Java+sql 实现-小型教务系统_第21张图片(后面功能图类似~~~)
public TeacherFrame(String str) {   //构造方法
		super("教师页面");
		setLayout(new FlowLayout());
		//设置标签的颜色
	    l.setFont(f1);
	    l.setForeground(Color.blue);
	    //设置按钮字体和颜色
	    btnTmg.setFont(f3);
	    btnTmg.setContentAreaFilled(false);
	    //btnTM.setBackground(Color.blue);
	    btnSsh.setFont(f3);
	    btnSsh.setContentAreaFilled(false);
	    btnCsh.setFont(f3);
	    btnCsh.setContentAreaFilled(false);
	    btnSCmg.setFont(f3);
	    btnSCmg.setContentAreaFilled(false);
	    btnCSsh.setFont(f3);
	    btnCSsh.setContentAreaFilled(false);
	    btnEXIT.setFont(f3);
	    btnEXIT.setContentAreaFilled(false);
	    
	    this.tno=str;
	    
		p1.add(l);	
		p1.setOpaque(false);
		p2.setOpaque(false);
		p2.setLayout(new GridLayout(3,2,10,10));
		p2.add(btnTmg);
		p2.add(btnSsh);
		p2.add(btnCsh);
		p2.add(btnSCmg);
		p2.add(btnCSsh);
		p2.add(btnEXIT);
		 
		//布局管理器
		this.add(p1);
		this.add(p2);
		
		ImageIcon ic=new ImageIcon("C:\\Users\\YXS\\eclipse-workspace\\edu-a-s\\src\\edu\\yxs\\sqldemo\\6.jpg");
		JLabel l=new JLabel(ic);
		l.setBounds(0,0,ic.getIconWidth(),ic.getIconHeight());
		//l.setBounds(0,0,this.getWidth(),this.getHeight());
		//JPanel ip=(JPanel)this.getContentPane();
		this.getLayeredPane().add(l,new Integer(Integer.MIN_VALUE));
		((JPanel)this.getContentPane()).setOpaque(false);//设置透明
		
		//设置顶层容器的大小、位置、可见性及close功能
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(350,300);
		setLocationRelativeTo(null);
		setVisible(true);
		
		this.connDB();
		
		btnTmg.addActionListener(this);
		btnSsh.addActionListener(this);
		btnCsh.addActionListener(this);
		btnSCmg.addActionListener(this);
		btnCSsh.addActionListener(this);
		btnEXIT.addActionListener(this);
	}
public void tmg(String str) {   //个人信息管理方法
		JFrame f=new JFrame("个人信息");
		//JPanel p=new JPanel();
		f.setLayout(new FlowLayout());
		f.setDefaultCloseOperation(EXIT_ON_CLOSE);
		f.setSize(500,150);
		f.setVisible(true);
		f.setLocationRelativeTo(null);
		Button btnchange=new Button("修改密码");
		Button btnrt=new Button("返回");
		btnchange.setFont(f3);
		btnchange.setBackground(new Color(131,175,155));
		btnrt.setFont(f3);
		btnrt.setBackground(new Color(131,175,155));
		//btnrt.setSize(20,10);

		this.connDB();
		arr=new Object[1][7];
		try {
			rs=stmt.executeQuery("select * from 教师表  where 教师号="+str);
			while(rs.next()) {
				arr[0][0]=rs.getString("教师号");
				arr[0][1]=rs.getString("姓名");
				arr[0][2]=rs.getString("性别");
				arr[0][3]=rs.getString("学历");
				arr[0][4]=rs.getString("职称");
				arr[0][5]=rs.getString("所属学院");
				arr[0][6]=rs.getString("登录密码");
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		String[] list= {"教师号","姓名","性别","学历","职称","所属学院","登录密码"};
		tb1=new JTable(arr,list); //创建表格
		scroll1=new JScrollPane(tb1);
		//f.add(btnrt,BorderLayout.NORTH);
		f.add(btnchange);
		f.add(btnrt);
		f.add(scroll1);  //此处有个小bug,只有添加进滚轮面板,才能将头部名称显示出来
		//f1.add(btnrt); 
		btnrt.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				f.dispose();
				new TeacherFrame(tno);
			}
		});
		btnchange.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				f.dispose();
				change();
			}
		});
	}
	
	public void change() {  //创建修改密码页面,新窗口用于修改密码
		this.connDB();
		JFrame f=new JFrame("修改密码");
		f.setLayout(new FlowLayout());
		JPanel p=new JPanel();
		JPanel p1=new JPanel();
		p.setLayout(new GridLayout(3,2));
		JLabel btn1=new JLabel("初始密码:");
		btn1.setFont(f3);
		JTextField tf1=new JTextField(10);
		JLabel btn2=new JLabel("修改密码:");
		btn2.setFont(f3);
		JTextField tf2=new JTextField(10);
		Button ok=new Button("确定");
		ok.setBackground(new Color(131,175,155));
		Button cancel=new Button("取消");
		cancel.setBackground(new Color(131,175,155));
		p.add(btn1);
		p.add(tf1);
		p.add(btn2);
		p.add(tf2);
		p1.add(ok);
		p1.add(cancel);
		f.add(p);
		f.add(p1);
		
		f.setDefaultCloseOperation(EXIT_ON_CLOSE);
		f.setLocation(530,300);
		//f.setLocationRelativeTo(null);
		f.setSize(300,150);
		f.setVisible(true);
		
		ok.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				try {   //获取初始密码
					rs=stmt.executeQuery("select * from 教师表 where 教师号="+tno);
					while(rs.next()) {
						tpwd=rs.getString("登录密码").trim();
					}
				}catch(Exception e1) {
					e1.printStackTrace();
				}
				
				if(tf2.getText().equals("") || tf1.getText().equals("")) {
					JOptionPane.showMessageDialog(null, "密码不能为空!请重新修改!");
				}else{
					if(!tpwd.equals(tf1.getText().trim())) {     //spwd.equals(tf1.getText().trim())
					    JOptionPane.showMessageDialog(null,"初始密码错误,请重新输入密码!");  //"原密码是"+spwd+"输入密码是"+tf1.getText();
					    tf1.setText("");
					    tf2.setText("");
					}else {
						try {
							stmt.executeUpdate("update 教师表 set 登录密码 ="+tf2.getText().trim()+"where 教师号="+tno);
						}catch(Exception e1) {
							e1.printStackTrace();
						}
						JOptionPane.showMessageDialog(null,"密码修改成功!请重新登录!");
						f.dispose();
						new DLFrame();
					}
					
				}
			}
		});
		cancel.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				f.dispose();
				new TeacherFrame(tno);
			}
		});
	}
》》》》》》》》》》》》》》》》》》》》》》》》...加载中
  4.学生主页(StudentFrame类)先上图~
Java+sql 实现-小型教务系统_第22张图片  
Java+sql 实现-小型教务系统_第23张图片(后面功能图类似~~)
  模块功能类似,实现过程也是类似~~

public StudentFrame(String str) {   //构造方法
		super("学生页面");
		setLayout(new FlowLayout());
		//设置标签的颜色
	    l.setFont(f1);
	    l.setForeground(Color.blue);
	    //设置按钮字体和颜色
	    btnSelf.setFont(f2);
	    btnSelf.setBackground(new Color(0,255,255));
	    btnSCsh.setFont(f3);
	    btnSCsh.setBackground(new Color(255,160,122));
	    btnCsh.setFont(f4);
	    btnCsh.setBackground(new Color(30,144,255));
	    btnCSsh.setFont(f3);
	    btnCSsh.setBackground(new Color(0,255,0));
	    btnEXIT.setFont(f2);
	    btnEXIT.setBackground(new Color(220,20,60));
	    
		p1.add(l);
		p1.setOpaque(false);
		p2.setLayout(new GridLayout(4,2,10,10));
		p2.setOpaque(false);
		p2.add(btnSelf);
		p2.add(btnSCsh);
		p2.add(btnCsh);
		p2.add(btnCSsh);
		p2.add(btnEXIT);
		
		this.connDB();
		this.sno=str;
		//布局管理器
		this.add(p1);
		this.add(p2);
		
		ImageIcon ic=new ImageIcon("C:\\Users\\YXS\\eclipse-workspace\\edu-a-s\\src\\edu\\yxs\\sqldemo\\1.jpg");
		JLabel l=new JLabel(ic);
		l.setBounds(0,0,ic.getIconWidth(),ic.getIconHeight());
		//l.setBounds(0,0,this.getWidth(),this.getHeight());
		//JPanel ip=(JPanel)this.getContentPane();
		this.getLayeredPane().add(l,new Integer(Integer.MIN_VALUE));
		((JPanel)this.getContentPane()).setOpaque(false);//设置透明
		
		//设置顶层容器的大小、位置、可见性及close功能
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(350,300);
		setLocationRelativeTo(null);
		setVisible(true);
		
		btnSelf.addActionListener(this);
		btnSCsh.addActionListener(this);
		btnCsh.addActionListener(this);
		btnCSsh.addActionListener(this);
		btnEXIT.addActionListener(this);
	}

public void cssearch(String str) {   //班级查询方法
		JFrame f=new JFrame("班级信息页面");
		//JPanel p=new JPanel();
		f.setLayout(new FlowLayout());
		f.setDefaultCloseOperation(EXIT_ON_CLOSE);
		f.setSize(500,150);
		f.setVisible(true);
		f.setLocationRelativeTo(null);
		Button btnrt=new Button("返回");
		btnrt.setFont(f3);
		btnrt.setBackground(new Color(131,175,155));
		//btnrt.setSize(20,10);

		this.connDB();
		arr=new Object[1][6];
		try {
			rs=stmt.executeQuery("select * from 班级表1  where 学号="+str);
			while(rs.next()) {
				arr[0][0]=rs.getString("学号");
				arr[0][1]=rs.getString("班级号");
    			arr[0][2]=rs.getString("班级名称");
    			arr[0][3]=rs.getString("所属学院");
    			arr[0][4]=rs.getString("班级人数");
    			arr[0][5]=rs.getString("班主任");
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		String[] list={"学号","班级号","班级名称","所属学院","班级人数","班主任"};
		tb1=new JTable(arr,list); //创建表格
		jsp1=new JScrollPane(tb1);
		//f.add(btnrt,BorderLayout.NORTH);
		f.add(btnrt);
		f.add(jsp1);  //此处有个小bug,只有添加进滚轮面板,才能将头部名称显示出来
		//f1.add(btnrt); 
		btnrt.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				f.dispose();
				new StudentFrame(sno);
			}
		});
	}
	
	public void csearch(String str) {   //课程查询方法
		JFrame f=new JFrame("课程信息页面");
		//JPanel p=new JPanel();
		f.setLayout(new FlowLayout());
		f.setDefaultCloseOperation(EXIT_ON_CLOSE);
		f.setSize(500,150);
		f.setVisible(true);
		f.setLocationRelativeTo(null);
		Button btnrt=new Button("返回");
		btnrt.setFont(f3);
		btnrt.setBackground(new Color(131,175,155));
		//btnrt.setSize(20,10);
        
		int i=0,j=0;
		ArrayList ar=new ArrayList();
		this.connDB();
		try {
			rs=stmt.executeQuery("select * from 课程表2 where 学号="+str);
			while(rs.next()){
				ar.add(rs.getString("学号"));
				ar.add(rs.getString("课程号"));
				ar.add(rs.getString("课程名"));
				ar.add(rs.getString("教师号"));
				ar.add(rs.getString("教师姓名"));
				j++;
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		arr=new Object[j][5];
		try {
			rs=stmt.executeQuery("select * from 课程表2  where 学号="+str);
			while(rs.next()) {
				arr[i][0]=rs.getString("学号");
				arr[i][1]=rs.getString("课程号");
    			arr[i][2]=rs.getString("课程名");
    			arr[i][3]=rs.getString("教师号");
    			arr[i][4]=rs.getString("教师姓名");
    			i++;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		String[] list={"学号","课程号","课程名","教师号","教师姓名"};
		tb1=new JTable(arr,list); //创建表格
		jsp1=new JScrollPane(tb1);
		//f.add(btnrt,BorderLayout.NORTH);
		f.add(btnrt);
		f.add(jsp1);  //此处有个小bug,只有添加进滚轮面板,才能将头部名称显示出来
		//f1.add(btnrt); 
		btnrt.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				f.dispose();
				new StudentFrame(sno);
			}
		});
	}
	
	public void scsearch(String str) {  //查询成绩页面
		int i=0,j=0;
		JFrame f=new JFrame("成绩信息页面");
		//JPanel p=new JPanel();
		f.setLayout(new FlowLayout());
		f.setDefaultCloseOperation(EXIT_ON_CLOSE);
		f.setSize(500,200);
		f.setVisible(true);
		f.setLocationRelativeTo(null);
		Button btnrt=new Button("返回");
		btnrt.setFont(f3);
		btnrt.setBackground(new Color(131,175,155));
		//btnrt.setSize(20,10);

		this.connDB();
		ArrayList list=new ArrayList();
    	try {
    		rs=stmt.executeQuery("select * from 成绩表1 ");
    		while(rs.next()) {
    			list.add(rs.getString("学号"));
    			list.add(rs.getString("姓名"));
    			list.add(rs.getString("课程号"));
    			list.add(rs.getString("课程名"));
    			list.add(rs.getString("教师姓名"));
    			list.add(rs.getString("成绩"));
    			i++;
    		}
    	}catch(Exception e) {
    		e.printStackTrace();
    	}
		arr=new Object[i][6];
		try {
			rs=stmt.executeQuery("select * from 成绩表1  where 学号="+str+"order by 课程号");
			while(rs.next()) {
				arr[j][0]=rs.getString("学号");
    			arr[j][1]=rs.getString("姓名");
    			arr[j][2]=rs.getString("课程号");
    			arr[j][3]=rs.getString("课程名");
    			arr[j][4]=rs.getString("教师姓名");
    			arr[j][5]=rs.getString("成绩");
    			j++;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		String[] listname={"学号","姓名","课程号","课程名","教师姓名","成绩"};
		tb1=new JTable(arr,listname); //创建表格
		jsp1=new JScrollPane(tb1);
		//f.add(btnrt,BorderLayout.NORTH);
		f.add(btnrt);
		f.add(jsp1);  //此处有个小bug,只有添加进滚轮面板,才能将头部名称显示出来
		//f1.add(btnrt); 
		btnrt.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				f.dispose();
				new StudentFrame(str);
			}
		});   	
    }

  5.登录页面验证码(MyPanel类)
  代码块写好,但面板添加过程出现问题,小编准备后期自学了web再来解决页面的验证码登录问题,所以这里只能简单贴上代码块~~
package edu.yxs.sqldemo;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Panel;
import java.util.Random;

class MyPanel extends Panel{
	static String s1;
	public void paint(Graphics g){
		int width=70;
		int height=40;
		g.setColor(Color.LIGHT_GRAY);
		g.fillRect(0,0, width, height);
		g.setColor(Color.green);            //设置上下文颜色
		g.drawRect(0,0,width-1,height-1); //绘制边框
		Random r=new Random();  //产生随机数
		//绘制背景圆点
		for(int i=0;i<200;i++){
			int x=r.nextInt(width)-2;
			int y=r.nextInt(height)-2;
			g.drawOval(x, y, 2, 2);
		}
		g.setFont(new Font("黑体",Font.BOLD,30));
		g.setColor(Color.yellow);
		char[] chars=("0123456789"+"abcdefghijklmnopqrstuvwxyz"+"HIJKLMNOPQRSTUVWXYZ").toCharArray();
		StringBuilder sb=new StringBuilder();
		for(int i=0;i<4;i++){
			int pos=r.nextInt(chars.length);
			char c=chars[pos];
			sb.append(c+" ");
		}
		g.drawString(sb.toString(),20,30);
		s1=sb.toString();
		
		g.setColor(Color.red);
		for(int i=0;i<200;i++){
			int x=r.nextInt(width)-2;
			int y=r.nextInt(height)-2;
			g.drawOval(x, y, 2, 2);
		}
	}
	
	public static void main(String[] args) {
		new MyPanel();
	}
	
}

哒哒哒~~~~嗯,客官能够看到这里已是非常不易,每一个板块也实现差不多,接着就是不同页面的切换~

————————————————————我是分割线~~——————————————————

四、总结与体会
  嗯~其实很幸运客官能够看到这里,其实对于和本人一样刚入门的java小白来说,接下来要说的才是最最重要的,因为接下来的是小编整个的实现过程中碰到的坑(这些坑是耗时最多的地方),有些百度不到所以,小编想要将这些经验分享,希望小白可能遇到这些问题的时候能够用来解决它们~~接下来就用图说话吧!!!
 1.其实在前期花时间最多的地方就是在数据库的连接上,在实验室整整搞了两天下午,连接问题无非在于路径添加,jdbc包的下载和在eclipse上的添加,很无奈~前面的教程很详细,一步到位。
  简单贴段测试连接的代码~~
public static void main(String[] args) {
		// TODO Auto-generated method stub
		String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
		String dbURL = "jdbc:sqlserver://localhost:1433;DatabaseName=教务系统";
		String userName = "sa";
		String userPwd = "123";
		try {
			//Class.forName(driverName);
			Connection conn=DriverManager.getConnection(dbURL,userName,userPwd);
			Statement stmt=conn.createStatement();
			System.out.println("connect sqlserver success!");
			//需要执行的语句
			String sql="select * from 课程表";
			ResultSet rs=stmt.executeQuery(sql);
			//System.out.println("管理员号"+"\t"+"登录密码");
			//System.out.println("cno"+"\t"+"cname"+"\t"+"cpno"+"\t"+"ccredit");
			while(rs.next()) {
				System.out.print(rs.getString(1)+"\t");
				System.out.print(rs.getString(2)+"\t");
			}
			rs.close();
			stmt.close();
			conn.close();
		} catch (Exception e) {
			// TODO: handle exception
			   e.printStackTrace();
			   System.out.print("connect failed");
		}
	}
 2.紧接着在我连接好数据库后,发现select语句会很容易实现,但是在用到insert语句向数据库插入信息时,就会出现“列名无效”这个问题,也是困扰了我好几天,百度的很多方法都说是数据库在连接上出了问题,但我在测试方法里明明能够执行select语句,可见数据库的连接是毫无问题的,最后苦思冥想总算找到病根。

图2-1
Java+sql 实现-小型教务系统_第24张图片
图2-2

图2-3
  如图2-1,当我在用该方法将用户从页面输入的信息插入数据库时,系统总会报错,说“列名无效”(如图2-2信息),但是当我在测试类里面用如图2-3的语句进行插入数据时,后台数据库能够正常的插入,当时我就很不解,深夜思来想去才明白可能是SQL语句使用时出错(那个时候还不会用断点debug,-_-||),那么只有一种可能,就是插入语句语法使用错误,于是手动几方排查,才想到,可能是在字符串插入时没有添加“''”导致的,最后实验,便成功插入。在现在看来,好像是是个特别小的问题,但是在你一直思考这个问题,死磕这个问题(强迫症),又百度不到解决方法时,是很绝望的!! 
Java+sql 实现-小型教务系统_第25张图片
图2-4

  用图2-4的语句,添加了“''”符号,总算得到的图2-5的“insert success”,后面图2-6的问题也是这样,相同的方法解决。

Java+sql 实现-小型教务系统_第26张图片
图2-5
Java+sql 实现-小型教务系统_第27张图片
图2-6
Java+sql 实现-小型教务系统_第28张图片
图2-7
Java+sql 实现-小型教务系统_第29张图片
图2-8

  如果遇到“对象名无效”这种问题,一定是下面这段代码出问题了,也就是定位符或者是登录名或者密码错了,导致无法连接数据库,也就会出现对象名无效的问题。
       String dbURL="jdbc:sqlserver://localhost:1433;databaseName=教务系统";
	String userName="sa";
	String userPwd="123";

  3.如下图,出现NullPointerException问题 由于 ResultSet 返回的数据库中数据时,遇到本身创建数据库表时定义了不能为空的列值为 null 值时就会自动报错,出现 nullpointerexception 异常,并且 rs.next() 会终止返回。所以在数据库中填写信息时要注意是否能够为null.
Java+sql 实现-小型教务系统_第30张图片

  4.如下图,在设置窗口背景的时候也花费了本人很长时间,主要是对类的不熟悉,还有就是图片的的添加路径问题也是困扰许久( 建议使用绝对路径,就是C盘下面找到eclipse的workspace目录下面的你创建的项目的包下面,在定义图片路径时,直接调用,不会出错),下面就贴段代码~~
   ImageIcon ic=new ImageIcon("C:\\Users\\YXS\\eclipse-workspace\\edu-a-s\\src\\edu\\yxs\\sqldemo\\1.jpg");
    JLabel l=new JLabel(ic);
    l.setBounds(0,0,ic.getIconWidth(),ic.getIconHeight());
    //l.setBounds(0,0,this.getWidth(),this.getHeight());
    //JPanel ip=(JPanel)this.getContentPane();
    this.getLayeredPane().add(l,new Integer(Integer.MIN_VALUE));
    ((JPanel)this.getContentPane()).setOpaque(false);//设置透明
  嗯~,图形添加好,问题就来了,会出现添加的图过大,无法适应窗口,即窗口无法将整张图展示出来,如图4-1,4-2的区别,后来小编也是找了很多方法,但貌似时类和方法的不熟悉,导致没有总之有效的方法,后来迫于无奈,于是将所有需要的背景图按照窗口的大小裁剪好,然后展示出来的效果如图4-4的效果。对了,还有一点很重要,一定要把JButton,JPanel这些组件设为透明,不然会阻挡背景图,很难受的~~~~
Java+sql 实现-小型教务系统_第31张图片
图4-1

图4-2
Java+sql 实现-小型教务系统_第32张图片
图4-3
Java+sql 实现-小型教务系统_第33张图片
图4-4
  
  5.在执行下面这段代码,即在学生对个人信息进行修改密码时,会出错,错误如图5-1,明明我输入密码和原始的密码完全相同,可是为何会错呢,找这个问题足足找了一晚上,后面才发现图中其实控制台打印的原始密码后面是有空格的,所以和你输入的才会无法匹配。其实是前台用java语句去访问后台数据库时,后台返回的一切字符串都会返回后面的空格,因为我们定义表的属性时,比如密码定义char(9),但我设置的密码是123,则在数据库中后面还有没用到的空格,在反馈前台时便会把空格返回。 ,所以一定要用trim()方法。
ok.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				try {   //获取初始密码
					rs=stmt.executeQuery("select * from 学生表 where 学号="+sno);
					while(rs.next()) {
						spwd=rs.getString("密码").trim();  //!!!对于数据库中传回来的值一定要用trim();因为后面会有多余的空格!!!
						/*bug:数据库中数据会有空格,mmp,记于12/10/凌晨1:56,耻!*/
						//spwd="123";
					}
				}catch(Exception e1) {
					e1.printStackTrace();
				}
				
				if(tf1.getText().equals("") || tf2.getText().equals("")) {
					JOptionPane.showMessageDialog(null, "密码不能为空!请重新修改!");
				}else {
					if(!spwd.equals(tf1.getText())) {     //spwd.equals(tf1.getText().trim())
					    JOptionPane.showMessageDialog(null,"初始密码错误,请重新输入密码!");  //"原密码是"+spwd+"输入密码是"+tf1.getText();
					    tf1.setText("");
					    tf2.setText("");
				    }else {
					    try {
						    stmt.executeUpdate("update 学生表 set 密码 ="+"'"+tf2.getText().trim()+"'"+"where 学号="+sno);
					    }catch(Exception e1) {
						    e1.printStackTrace();
					    }
					    JOptionPane.showMessageDialog(null,"密码修改成功!请重新登录!");
					    f.dispose();
					    new DLFrame();
				    }
			    }
			}
		});
Java+sql 实现-小型教务系统_第34张图片
图5-1

  6.还有一个问题是在成功创建JTable时,但用row=tb5.getSelectedRow()方法时无法响应选定操作来返回行数(代码如下),后来总结是,不能将该方法和JTable新建类放在同一个方法里,所以本人后期重新写了一个类来实现功能。
public void scmg(String s1,String s2) { //精确到班级成绩的页面
		String csname=null;
		this.connDB();
		try {
			rs=stmt.executeQuery("select distinct 班级号 ,班级名称 from 学生信息表 where 班级号="+"'"+s2+"'");
			while(rs.next()) {
				csname=rs.getString("班级名称").trim();
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		JFrame f=new JFrame(csname+" --学生成绩信息");
		//JPanel p=new JPanel();
		f.setLayout(new FlowLayout());
		f.setDefaultCloseOperation(EXIT_ON_CLOSE);
		f.setSize(500,150);
		f.setVisible(true);
		f.setLocationRelativeTo(null);
		Button btnrt=new Button("返回");
		Button btnchange=new Button("修改");
		btnchange.setFont(f3);
		btnchange.setBackground(new Color(131,175,155));
		btnrt.setFont(f3);
		btnrt.setBackground(new Color(131,175,155));
		//btnrt.setSize(20,10);

		this.connDB();
		int i=0,j=0;
		ArrayList al=new ArrayList();
		try {
			rs=stmt.executeQuery("select * from 学生信息表  where 教师号="+s1+"and 班级号='"+s2+"'");
			while(rs.next()) {
				al.add(rs.getString("学号"));
				al.add(rs.getString("姓名"));
				al.add(rs.getString("性别"));
				al.add(rs.getInt("年龄"));
				al.add(rs.getString("班级名称"));
				al.add(rs.getString("课程号"));
				al.add(rs.getString("课程名"));
				al.add(rs.getString("成绩"));
				i++;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		arr=new Object[i][8];
		try {
			rs=stmt.executeQuery("select * from 学生信息表  where 教师号="+s1+"and 班级号= '"+s2+"'");
			while(rs.next()) {
				arr[j][0]=rs.getString("学号");
				arr[j][1]=rs.getString("姓名");
				arr[j][2]=rs.getString("性别");
				arr[j][3]=rs.getString("年龄");
				arr[j][4]=rs.getString("班级名称");
				arr[j][5]=rs.getString("课程号");
				arr[j][6]=rs.getString("课程名");
				arr[j][7]=rs.getString("成绩");
				j++;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		String[] list= {"学号","姓名","性别","年龄","班级名称","课程号","课程名","成绩"};
		tb5=new JTable(arr,list); //创建表格
		scroll5=new JScrollPane(tb5);
		//f.add(btnrt,BorderLayout.NORTH);
		f.add(btnchange);
		f.add(btnrt);
		f.add(scroll5);  //此处有个小bug,只有添加进滚轮面板,才能将头部名称显示出来
		
		//String sno1=null; //局部变量一定要初始化,获取学生学号
		String cno=null; //获取课程号
		
		/////////////////////////////////////////////////////////////////
		//*Bug:千万不要在同一个方法里定义获取行数!!!!!!!!!!!无法执行                    //
		//row=tb5.getSelectedRow();  //代表鼠标选定的行数                                              //
		/////////////////////////////////////////////////////////////////
		
		btnrt.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				f.dispose();
				scmg(tno);
			}
		});
		
		btnchange.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if(row==-1) {  //表示未被选中
					JOptionPane.showMessageDialog(null,"请选择要修改的信息!");
				}else {
					//int x=0;
					try {
						//String sno1=(String)tb1.getModel().getValueAt(row,column);
						f.dispose();
						//scchange1(sno1,cno);
					}catch(Exception e1) {
						e1.printStackTrace();
					}
				}
				//f.dispose();
				//scchange();
			}
		});
	   }


  嗯,问题大概就是这些了,哇,在实验室花了两个下午才写完,博客真不好写,哈哈,要是有客官能够看到这里也是不易,希望这篇博客是干货,对小白们有用,如果有用,那就赶紧动手实现吧~~~(个人觉得,图书管理系统,人员信息管理系统,大概都是和这个差不多的吧,举一反三)...

  还有,如果想要博主该系统的源代码的话,可以去这https://github.com/Javecc/yxsdemo/tree/master/sqldemo,博主已经将源码发到GitHub上了(嘻嘻~~)



























你可能感兴趣的:(Java+sql 实现-小型教务系统)