学习做学生管理系统——java swing+Mysql 第三章(注册功能+优化代码)

日常回顾上一章内容(有需要可以回去看看)
学习做学生管理系统——java swing+Mysql 第二章(登录功能)

这一章将会对注册功能进行重点讲解,在讲解的同时,优化原先的代码。
在讲解实现功能时,我要先说明一下,我的注册功能是基于什么思路来进行注册的。
1.我的注册是有条件的注册,不是随便注册,根据工号来注册账号
2.每个工号限制帐号数量
3.禁止重复帐号和重复使用工号
如下图,我特地建了新表access,用于存放工号信息和工号拥有的帐号数量,注册将会先根据工号搜索access表,在根据帐号搜索账号表,当条件都符合的时候,注册功能才开始进行。(当然如果自己有其他的需要可以根据我后续给出的代码进行相应的修改)

在这里插入图片描述
在这里插入图片描述

为了代码的简洁,我在工程下面新建了两个类,main.java是前两章内容,这次的注册功能是额外建的register类,为了方便我把数据库连接用的帐号密码那些信息放到Mysql类
在这里插入图片描述
把数据库用的帐号密码这些信息放到一个新的类,就不用再后续写各种功能的时候重新定义,可以直接调用
Mysql.java的内容

public class Mysql {
	static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";  
    static final String DB_URL = "jdbc:mysql://localhost:3306/StudentManage?useSSL=false&serverTimezone=UTC";
	
    static final String USER = "root";
    static final String PASS = "123";
}

现在开始说明register.java的内容,也是本章要说的重点
先上图看最终成果
学习做学生管理系统——java swing+Mysql 第三章(注册功能+优化代码)_第1张图片
在建好的class类文件后,定义注册功能要用的窗口,添加上你所需要的一切信息,标签,输入框,按钮等东西(不记得怎么添加组件的记得回看第一章,或者百度),这里直接上代码

public class register {
	public void reg() {
			JFrame jf=new JFrame("注册");
			jf.setSize(350, 250);
			JPanel jp=new JPanel();
			jf.add(jp);
			jp.setLayout(null);
			JLabel acc=new JLabel("帐号");
			JLabel pass=new JLabel("密码");
			JLabel id=new JLabel("工号");
			jp.add(pass);
			jp.add(id);
			jp.add(acc);
			acc.setBounds(40, 20, 80, 25);
			pass.setBounds(40, 60, 80, 25);
			id.setBounds(40, 100, 80, 25);
			JTextField text1=new JTextField();//帐号输入
			JPasswordField text2=new JPasswordField();//密码输入
			JTextField text3=new JTextField();//工号输入
			text1.setBounds(80, 20, 165, 25);
			text2.setBounds(80, 60, 165, 25);
			text3.setBounds(80, 100, 165, 25);
			jp.add(text1);
			jp.add(text2);
			jp.add(text3);
			JButton regButton=new JButton("注册");//注册按钮
			regButton.setBounds(125, 150, 80, 20);
			jp.add(regButton);
			jf.setVisible(true);
			Mysql sql=new Mysql();//为后续调用数据库信息
		}
	}

这时候就已经画好程序框图了,接下来就是添加实用功能。
还是同样的步骤,给按钮编写触发

regButton.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
		}
});

为了实现上述功能,需要对三个输入框进行数据的读取

String s1=text1.getText().toString();//账号获取
String s2=new String(text2.getPassword());//密码获取
String s3=text3.getText().toString();//工号获取

由于我个人为了实现帐号注册的要求,所以我就编写了4个状态和一个控制量

PreparedStatement stmt1=null;
PreparedStatement stmt2=null;
PreparedStatement stmt3=null;
PreparedStatement stmt4=null;
int i;//注册限制

连接数据库并且实现注册功能(注释在代码里面)

try {
					Class.forName(sql.JDBC_DRIVER);//sql.都是直接调用原先写的mysql.java
				    c = DriverManager.getConnection(sql.DB_URL,sql.USER,sql.PASS);
				    if(s1.length()==0||s2.length()==0||s3.length()==0) {
				    	JOptionPane.showMessageDialog(null, "还有信息未填", "错误", ERROR_MESSAGE);//判断是否信息填写完整
				    }
				    else if(s1.length()!=0&&s2.length()!=0&&s3.length()!=0) {
				    //当信息填写完整时
				    	String sql1="SELECT * FROM access where id=?";
				    	stmt1=c.prepareStatement(sql1);
				    	stmt1.setString(1, s3);
				    	ResultSet rs1 = stmt1.executeQuery();
				    	if(rs1.next()) {//判断工号是否正确
				    		i=rs1.getInt("acc_num");//读取工号是否有帐号
				    		if(i==0) {//没有就进行注册
				    			String sql2="SELECT * FROM account where user=?";
				    			stmt2=c.prepareStatement(sql2);
				    			stmt2.setString(1, s1);
				    			ResultSet rs2 = stmt2.executeQuery();
				    			if(!rs2.next()) {//判断帐号是否已经注册过
				    				JOptionPane.showMessageDialog(null, "注册成功");
				    				String sql3="INSERT INTO account (user,password,id) VALUES (?,?,?)";
				    				stmt3=c.prepareStatement(sql3);
					    			stmt3.setString(1, s1);
					    			stmt3.setString(2, s2);
					    			stmt3.setString(3, s3);
					    			stmt3.executeUpdate();
					    			String sql4="UPDATE access SET acc_num=? WHERE id=?";
					    			stmt4=c.prepareStatement(sql4);
					    			stmt4.setString(1, "1");
					    			stmt4.setString(2, s3);
					    			stmt4.executeUpdate();
				    			}
				    			else {//帐号已经存在,跳转提醒
				    				JOptionPane.showMessageDialog(null, "账号已经存在", "错误", ERROR_MESSAGE);
				    			}
				    		}
				    		else {//工号已经注册过帐号,跳转提醒
				    			JOptionPane.showMessageDialog(null, "工号已经被使用", "错误", ERROR_MESSAGE);
				    		}
				    	}
				    	else {//输入工号错误,跳转提醒
				    		JOptionPane.showMessageDialog(null, "工号有误", "错误", ERROR_MESSAGE);
				    	}
				    }
				}catch(Exception e1) {
					System.err.println( e1.getClass().getName() + ": " + e1.getMessage() );
			        System.exit(0);
				}

把这些整合起来,最后的完整版本

public class register {
	
	public void reg() {
		JFrame jf=new JFrame("注册");
		jf.setSize(350, 250);
		JPanel jp=new JPanel();
		jf.add(jp);
		jp.setLayout(null);
		JLabel acc=new JLabel("帐号");
		JLabel pass=new JLabel("密码");
		JLabel id=new JLabel("工号");
		jp.add(pass);
		jp.add(id);
		jp.add(acc);
		acc.setBounds(40, 20, 80, 25);
		pass.setBounds(40, 60, 80, 25);
		id.setBounds(40, 100, 80, 25);
		JTextField text1=new JTextField();//帐号输入
		JPasswordField text2=new JPasswordField();//密码输入
		JTextField text3=new JTextField();//工号输入
		text1.setBounds(80, 20, 165, 25);
		text2.setBounds(80, 60, 165, 25);
		text3.setBounds(80, 100, 165, 25);
		jp.add(text1);
		jp.add(text2);
		jp.add(text3);
		JButton regButton=new JButton("注册");//注册按钮
		regButton.setBounds(125, 150, 80, 20);
		jp.add(regButton);
		jf.setVisible(true);
		Mysql sql=new Mysql();
		regButton.addActionListener(new ActionListener() {
			private int ERROR_MESSAGE;
			public void actionPerformed(ActionEvent e) {
				String s1=text1.getText().toString();//账号获取
				String s2=new String(text2.getPassword());//密码获取
				String s3=text3.getText().toString();//工号获取
				Connection c=null;
				PreparedStatement stmt1=null;
				PreparedStatement stmt2=null;
				PreparedStatement stmt3=null;
				PreparedStatement stmt4=null;
				int i;//注册限制
				try {
					Class.forName(sql.JDBC_DRIVER);
				    c = DriverManager.getConnection(sql.DB_URL,sql.USER,sql.PASS);
				    if(s1.length()==0||s2.length()==0||s3.length()==0) {
				    	JOptionPane.showMessageDialog(null, "还有信息未填", "错误", ERROR_MESSAGE);
				    }
				    else if(s1.length()!=0&&s2.length()!=0&&s3.length()!=0) {
				    	String sql1="SELECT * FROM access where id=?";
				    	stmt1=c.prepareStatement(sql1);
				    	stmt1.setString(1, s3);
				    	ResultSet rs1 = stmt1.executeQuery();
				    	if(rs1.next()) {
				    		i=rs1.getInt("acc_num");
				    		if(i==0) {
				    			String sql2="SELECT * FROM account where user=?";
				    			stmt2=c.prepareStatement(sql2);
				    			stmt2.setString(1, s1);
				    			ResultSet rs2 = stmt2.executeQuery();
				    			if(!rs2.next()) {
				    				JOptionPane.showMessageDialog(null, "注册成功");
				    				String sql3="INSERT INTO account (user,password,id) VALUES (?,?,?)";
				    				stmt3=c.prepareStatement(sql3);
					    			stmt3.setString(1, s1);
					    			stmt3.setString(2, s2);
					    			stmt3.setString(3, s3);
					    			stmt3.executeUpdate();
					    			String sql4="UPDATE access SET acc_num=? WHERE id=?";
					    			stmt4=c.prepareStatement(sql4);
					    			stmt4.setString(1, "1");
					    			stmt4.setString(2, s3);
					    			stmt4.executeUpdate();
				    			}
				    			else {
				    				JOptionPane.showMessageDialog(null, "账号已经存在", "错误", ERROR_MESSAGE);
				    			}
				    		}
				    		else {
				    			JOptionPane.showMessageDialog(null, "工号已经被使用", "错误", ERROR_MESSAGE);
				    		}
				    	}
				    	else {
				    		JOptionPane.showMessageDialog(null, "工号有误", "错误", ERROR_MESSAGE);
				    	}
				    }
				}catch(Exception e1) {
					System.err.println( e1.getClass().getName() + ": " + e1.getMessage() );
			        System.exit(0);
				}
			}
		});
	}
}

接着就是返回到main.java,也就是登录界面的class类,继续在原有的基础上,编写注册按钮的触发,直接调用register.java的功能就完成了。

调用范例

regButton.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				register re=new register();
				re.reg();
				
			}
			
		});

这样一个登录界面就算大工搞成了,下一次就是制作管理界面了。

你可能感兴趣的:(自学笔记)