【JDBC】【Java】【MySQL】——实现会员管理系统

  • Post author:
  • Post category:java

前言

为一个校内组织写了个小程序,这里的会员是学生,故录入学生特征。且以学号为主键。我使用的是MySQL8.0+jdk1.8+eclipse
源文件稍后上传。
在这里插入图片描述

已实现功能

1.登录
2.对数据库进行增删查改

主要分为2个界面:登录界面、操作界面

一、数据库

1.新建一个数据库

create database student;

2.创建表student

create table student(
	vipid integer(12),
	stuname char(10) not null,
	sex enum('保密','女','男') not null default '保密',
	college char(50) not null,
	grade integer(4) not null,
	stuid integer(12) primary key,
	tele integer(11),
	qq integer(12),
	note char(100)

);

查看表结构

mysql> desc student;
+---------+------------------------+------+-----+---------+-------+
| Field   | Type                   | Null | Key | Default | Extra |
+---------+------------------------+------+-----+---------+-------+
| vipid   | int                    | YES  |     | NULL    |       |
| stuname | char(10)               | NO   |     | NULL    |       |
| sex     | enum('保密','女','男') | NO   |     | 保密    |       |
| college | char(50)               | NO   |     | NULL    |       |
| grade   | int                    | NO   |     | NULL    |       |
| stuid   | int                    | NO   | PRI | NULL    |       |
| tele    | int                    | YES  |     | NULL    |       |
| qq      | int                    | YES  |     | NULL    |       |
| note    | char(100)              | YES  |     | NULL    |       |
+---------+------------------------+------+-----+---------+-------+
9 rows in set (0.14 sec)

3.连接数据库

package utils;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.sql.Connection;



import mapper.IMapper;

/**
 * 项目名称:会员管理系统
 * 类名称:DBManager
 * 类描述:用JDBC连接数据库的,固定写法。
 * @author zongyue
 *创建时间:2020年4月7日 下午3:44:32   
 * @version
 * 
 */
public class DBManager {
	/*
	 * 工具类中的构造方法都是私有的
	 * 因为工具类中的方法都是静态的,不需要new对象,直接采用类名调用
	 * */
	public DBManager(){}
	
	//静态代码块在类加载时执行并且只执行一次
	static{
		//第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
		//通过得到字节码对象的方式加载静态代码块,从而注册驱动程序
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


	public static Connection getConnection() throws SQLException{

//		第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭通道。)
		String url = "jdbc:mysql://localhost:3306/STUDENT?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";//如果是本机,也可以将localhost:3306省掉 
	    String user = "root"; 
	    String password = "trybest6@mysql"; 
	    Connection conn = (Connection)DriverManager.getConnection(url, user, password); 
	
		return conn;
	}
	
//	第三步:获取数据库操作对象(专门执行sql语句的对象)
//
//	第四步:执行SQL语句(DQL DML....)
//
//	第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)
//
	
	//增删改结果集。因为sql语句是变化的,所以设为参数比较方便。params是占位符的,没学的可以忽略。
	 public int executeUpdate(String sql,Object[] params){
		 Connection conn=null;
		 PreparedStatement pst=null;
		 try {
			 conn=getConnection();//连接
			 pst=conn.prepareStatement(sql);//通道
			 if(params != null){//占位符的应用。
				 for(int i=0;i<params.length;i++){
					 pst.setObject(i+1,params[i]);//往通道里放数据,占位符下标从1开始。
				 }
			 }
			 return pst.executeUpdate();
		  
		 } catch (SQLException e) {
			 e.printStackTrace();
		 }
		 return -1;
	 }
	//查询结果集。比增删改要复杂一些,慢慢看。
	//这里的IMapper是将所有可能的用到的类都放进去,方便以后继承使用。
	//用接口是因为接口多继承,方便维护升级
	 public ArrayList executeQuery(String sql,IMapper mapper,Object []params){
		 Connection conn=null;
		 PreparedStatement pst=null;
		 ResultSet rst=null;//查询结果集
		 ArrayList list= new ArrayList();//用一个集合存放Student信息
		 try {
			 conn=getConnection();
			 pst=conn.prepareStatement(sql);
			 if(params != null){
				 for(int i=0;i<params.length;i++){
					 pst.setObject(i+1,params[i]);
				 }
			 }
			 rst=pst.executeQuery();//把通道里的数据放入结果集
			 list=mapper.map(rst);//IMapper里有个map接口,里面存着结果集数据。把结果集的数据放入list集合
		 } catch (SQLException e) {
			 e.printStackTrace();
		 }
		 return list;
	 }
	 
	 
//	第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。)
	/*
	 * conn:连接对象
	 * st:数据库操作对象
	 * rs:结果集
	 * */
	public static void close(Connection conn,Statement st,ResultSet rs) {
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(st!=null){
			try {
				st.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

二、登录

点击exe文件运行,弹出登录窗口,默认用户名和密码为:20050330;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package show;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class Login extends JFrame{
	 public Login(){
		 
		 setSize(300,250);
		 setVisible(true);
		 setDefaultCloseOperation(EXIT_ON_CLOSE);
		 setResizable(false);
		 setLocationRelativeTo(null);
		 setLayout(null);
		  
		 JLabel j=new JLabel("登录窗口");
		 j.setBounds(100,20,80,30);
		 add(j);
		  
		 JLabel j1=new JLabel("用户名:");
		 j1.setBounds(50,80,60,30);
		 add(j1);
		  
		 final JTextField jt1=new JTextField();
		 jt1.setBounds(120,80,120,30);
		 add(jt1);
		  
		 JLabel j2=new JLabel("密 码:");
		 j2.setBounds(50,130,60,30);
		 add(j2);
		  
		 final JPasswordField jp=new JPasswordField();
		 jp.setBounds(120,130,120,30);
		 add(jp);
		  
		 JButton jb1=new JButton("登录");
		 jb1.setBounds(70,180,60,30);
		 add(jb1);
		  
		 JButton jb2=new JButton("重置");
		 jb2.setBounds(170,180,60,30);
		 add(jb2);
		 
		 repaint();
		  
		 jb1.addActionListener(new ActionListener(){
			 public void actionPerformed(ActionEvent event){
				 String id=jt1.getText();
				 char ch[]=jp.getPassword();
				 String pass=new String(ch);
				 if(id.equals("20050330")){//设置用户名为20050330
					 if(pass.equals("20050330")){//设置密码为20050330
						 JOptionPane.showMessageDialog(null,"登录成功");
						 Show s=new Show();//成功后跳到Show
						 s.setVisible(true);
						 setVisible(false);
					 }else{
						 JOptionPane.showMessageDialog(null,"密码错误");
						 jt1.setText("");
						 return;
					 }
				 }else{
					 JOptionPane.showMessageDialog(null,"您输入的账号有误");
					 jt1.setText("");
					 jp.setText("");
					 return;
				 }
			 }
		});
	}
	 public static void main(String[] args) {
		 Login lo=new Login();
	}

}

三、操作界面

在这里插入图片描述

1.查找(根据主键stuid查找)

1.1.查找失败则提示并界面初始化

在这里插入图片描述

1.2.查找成功则显示该会员信息

在这里插入图片描述

 jb1.addActionListener(new ActionListener() {
			 public void actionPerformed(ActionEvent event) {
				//根据输入的学号进行查询
				 StuDAO dao=new StuDAO();
				 ArrayList<Student> list=dao.check();
				 Student stu=new Student();
				 String id = jt6.getText();
				 boolean found = false;
				 for(int i=0;i<list.size();i++){
					 stu=list.get(i);
					 if(stu.getStuid().equals(id)){
						 found = true;
						 break;//找到该学生后跳出遍历
					 }
					 
				 }
				if(found){
					//显示原来的对应信息
					 jt1.setText(stu.getVipid());
					 jt2.setText(stu.getStuname());
					 jt3.setText(stu.getSex());
					 jt4.setText(stu.getCollege());
					 jt5.setText(stu.getGrade());
					 jt6.setText(stu.getStuid());
					 jt7.setText(stu.getTele());
					 jt8.setText(stu.getQq());
					 jt9.setText(stu.getNote());
				}else{
					JOptionPane.showMessageDialog(null,"系统未录入");
					 Show show = new Show();
					 show.setVisible(true);
					 setVisible(false);
				}
				
			
			 }
			 
		 });

2.修改【学号不能修改!!!】

当选择“否”时界面初始化
在这里插入图片描述

2.1.修改成功保存数据且界面初始化

在这里插入图片描述
将性别改为男:
在这里插入图片描述

2.2.修改失败报错

在这里插入图片描述

//修改
		 jb2.addActionListener(new ActionListener() {
			 public void actionPerformed(ActionEvent event) {
				 Student stu=new Student();
				 StuDAO dao=new StuDAO();
				 stu.setStuid(jt6.getText());
				 
				 int confirm =JOptionPane.showConfirmDialog(null, "您确定要修改信息吗?", "修改信息", JOptionPane.YES_NO_OPTION); 
				 if (confirm==JOptionPane.YES_OPTION) {
					 //学号不能修改
					 stu.setVipid(jt1.getText());
					 stu.setStuname(jt2.getText());
					 stu.setSex(jt3.getText());
					 stu.setCollege(jt4.getText());
					 stu.setGrade(jt5.getText());
					 stu.setTele(jt7.getText());
					 stu.setQq(jt8.getText());
					 stu.setNote(jt9.getText());
					 
					 boolean db = dao.update(stu);
					 if(db){
						 JOptionPane.showMessageDialog(null,"修改成功");
						 Show show = new Show();
						 show.setVisible(true);
						 setVisible(false);
					 }else{
						 JOptionPane.showMessageDialog(null,"修改失败");
					 }
				}else{
					Show show = new Show();
					 show.setVisible(true);
					 setVisible(false);
				}
			 				
			 }
		 });

3.增加

3.1.添加成功

在这里插入图片描述

mysql> select * from student;
+-------+---------+-----+---------+-------+-------+------+------+------+
| vipid | stuname | sex | college | grade | stuid | tele | qq   | note |
+-------+---------+-----+---------+-------+-------+------+------+------+
|   121 | 121     || 121     |   112 |   123 |  121 | 2121 |      |
|   123 | 123     || 111     |   111 |  1111 |  111 |  111 |      |
+-------+---------+-----+---------+-------+-------+------+------+------+
2 rows in set (0.00 sec)

mysql>

3.2.添加失败

3.2.1.输入的信息不符合要求

在这里插入图片描述
报错如图:
在这里插入图片描述

3.2.2.账号已存在

在这里插入图片描述

 //添加
		 jb3.addActionListener(new ActionListener() {
			 public void actionPerformed(ActionEvent event) {
				 String a=jt1.getText();//获取输入的信息
				 String b=jt2.getText();
				 String c=jt3.getText();
				 String d=jt4.getText();
				 String e=jt5.getText();
				 String f=jt6.getText();
				 String g=jt7.getText();
				 String h=jt8.getText();
				 String i=jt9.getText();
				 
				 Student stu=new Student(a,b,c,d,e,f,g,h,i);
				 StuDAO dao=new StuDAO();
				 ArrayList<Student> list=dao.check();//调用StuDAO里面的check()方法
				 for(Student st:list){//遍历集合
					 if(st.getStuid().equals(f)){
						 JOptionPane.showMessageDialog(null,"该账号存在");
						 return;
					 }
				 }
				 boolean ab = dao.add(stu);
				 if(ab){
					 JOptionPane.showMessageDialog(null,"添加成功");
					 Show show = new Show();
					 show.setVisible(true);
					 setVisible(false);
				 }else{
					 JOptionPane.showMessageDialog(null,"添加失败");
					 
				 }
				 
			 }
		 });

4.删除【根据学号查询该会员信息,再进行删除】

【为简化操作,并没有讨论学生是否存在。若学生存在,则删除。若不存在,跳过继续执行】
在这里插入图片描述
选择“否”:界面初始化
选择”是“:

4.1.删除成功

操作前数据信息:

mysql> select * from student;
+-------+---------+-----+---------+-------+-------+------+------+------+
| vipid | stuname | sex | college | grade | stuid | tele | qq   | note |
+-------+---------+-----+---------+-------+-------+------+------+------+
|   121 | 121     || 121     |   112 |   123 |  121 | 2121 |      |
|   123 | 123     || 111     |   111 |  1111 |  111 |  111 |      |
+-------+---------+-----+---------+-------+-------+------+------+------+
2 rows in set (0.00 sec)

在这里插入图片描述
操作后数据信息:

mysql> select * from student;
+-------+---------+-----+---------+-------+-------+------+------+------+
| vipid | stuname | sex | college | grade | stuid | tele | qq   | note |
+-------+---------+-----+---------+-------+-------+------+------+------+
|   123 | 123     || 111     |   111 |  1111 |  111 |  111 |      |
+-------+---------+-----+---------+-------+-------+------+------+------+
1 row in set (0.00 sec)

查找学号为123的学生失败:
在这里插入图片描述

4.2.删除失败

//删除
		 jb4.addActionListener(new ActionListener() {
			 public void actionPerformed(ActionEvent event) {
				//根据学号确定学生,再删除该学生
				 StuDAO dao=new StuDAO();
				 Student stu=new Student();
				 stu.setStuid(jt6.getText());
				 int confirm =JOptionPane.showConfirmDialog(null, "您确定要删除信息吗?", "删除信息", JOptionPane.YES_NO_OPTION); 
				 if (confirm==JOptionPane.YES_OPTION) {
					 boolean db = dao.delete(stu);
					 if(db){
						 JOptionPane.showMessageDialog(null,"删除成功");
						 Show show = new Show();
						 show.setVisible(true);
						 setVisible(false);
					 }else{
						 JOptionPane.showMessageDialog(null,"删除失败");
					 }
				}else{
					Show show = new Show();
					 show.setVisible(true);
					 setVisible(false);
				}
			 }
		 });
		 
		 jb5.addActionListener(new ActionListener() {
			 public void actionPerformed(ActionEvent event) {
				 Show show= new Show();
				 show.setVisible(true);
				 setVisible(false);
			 }
		 });

5.返回

界面初始化


版权声明:本文为qq_43748400原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。