Java+MySQL学生管理系统

源码:https://github.com/ruiwang-97/StudentManagement.git

需求分析

设计思路

具体实现

测试效果

需求分析

这是一个学生管理系统,以管理员身份登录,实现对学员以及年级信息的增删改查操作。

具体需要实现的功能有:

1、统计学生人数。

2、查看学生名单。

3、按学号查询学生姓名。

4、按姓名查询学生信息。

5、删除学生记录。

6、修改学生年级。

7、添加学生。

8、退出。

分析:

其中1,2,3,4为查询操作,1、3返回单个值,调用dao包中BasicDao中的scalar()方法,2返回多个对象,调用BasicDao中的queryMulti()方法,3返回单个对象,调用BasicDao中的querySingle()方法。5,6,7为增删改,调用update()方法。

设计思路

分为五个模块:dao、domain、service、view、utils。其中

  • dao包访问数据类,包括BasicDao,StuDao,ManagerDao。提供对数据的增删改查的通用方法。
  • domain包实体类,包括Manager,Student。
  • service包业务类,包括managerService提供登录验证方法,stdentService提供增删改查方法。
  • view包界面类,stuView提供主界面,TSUtility封装控制台操作。
  • utils包数据库连接类,通过德鲁伊数据库连接池获取连接对象。

具体实现

MySQL部分

  1. 建库studentm
CREATE DATABASE studentm;
  1. 建表
  • manager表
CREATE TABLE manager(
id INT(11)PRIMARY KEY ,
username VARCHAR(20) NOT NULL,
pword VARCHAR(20) NOT NULL
);
  • stu表
CREATE TABLE stu(
id INT(11)PRIMARY KEY AUTO_INCREMENT,
stunumber VARCHAR(20) NOT NULL,
stuname VARCHAR(20) NOT NULL,
gender VARCHAR(20) NOT NULL,
grade VARCHAR(20) NOT NULL,
tel INT(20) NOT NULL,
email VARCHAR(20) NOT NULL,
birth VARCHAR(20) NOT NULL
);
  1. 设置管理员用户名、密码
INSERT INTO `manager` VALUES(1,'john',8888);
  1. 可以先加入一些学生用于测试
INSERT INTO `stu` VALUES(1,'S0018','梅小凤','女','B2',158111876544,'xiaofeng@qq.com','1998-3-3'),(2,'S0035','晓梅','女','B3',156091875566,'xiaomei@qq.com','1996-2-16'),(
3,'S0025','王小锐','女','B5',18345278844,'rui97@qq.com','1997-9-16');

Java部分

  1. 导入jar包和druid.properties(注意修改库名),utils包下的JDBCUtilsByDruid类与数据库建立连接和关闭连接。
package sm.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.security.spec.ECField;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/***
 * @Description: 此类是通过德鲁伊数据库连接池获取连接对象
 * @Author: Wang Rui
 * @Date: 2020/11/17$
 */
public class JDBCUtilsByDruid {
    static DataSource ds;
    static {
        try {
            Properties properties = new Properties();
            properties.load(new FileInputStream("src\\druid.properties"));

            //1.创建一个指定参数的数据流连接池
            ds = DruidDataSourceFactory.createDataSource(properties);
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
    public static Connection getConnection() throws Exception{

        //2.从数据库连接池中获取可用的连接对象
        return ds.getConnection();
    }

    /**
     * 功能:释放资源
     * @param set
     * @param statement
     * @param connection
     * @throws Exception
     */
    public static void close(ResultSet set, Statement statement, Connection connection) {
        try {
            if (set != null) {
                set.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
  1. 建立dao包,定义一个用来被继承的对数据库进行基本操作的BasicDao,提供通用的增删改查方法。
package sm.dao;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import sm.utils.JDBCUtilsByDruid;

import java.sql.Connection;
import java.util.List;

/**
 * 提供通用的增删改查方法
 * @Author: Wang Rui
 * @Date: 2020/11/18$
 */

/**
 * 功能:通用的增删改方法,针对于任何表
 */
//泛型类
public class BasicDao<T> {
    QueryRunner qr = new QueryRunner();

    public int update(String sql, Object... params) {
        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();

            int update = qr.update(connection, sql, params);
            return update;
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }
    }

    /**
     * 功能:返回单个对象,针对于任何表
     */
    public T querySingle(String sql, Class<T> clazz, Object... params) {
        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();
//        QueryRunner qr = new QueryRunner();
            return qr.query(connection, sql, new BeanHandler<T>(clazz), params);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }
    }

    /**
     * 功能:返回多个对象,针对于任何表
     */
    public List<T> queryMulti(String sql, Class<T> clazz, Object... params) {
        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();
//            QueryRunner qr = new QueryRunner();
            return qr.query(connection, sql, new BeanListHandler<T>(clazz), params);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }
    }

    /**
     * 功能:返回单个值,针对于任何表
     */
    public Object scalar(String sql, Object... params) {
        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();
//            QueryRunner qr = new QueryRunner();
            return qr.query(connection, sql, new ScalarHandler(), params);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }
    }
}

StuDao和ManagerDao继承于BasicDao。

package sm.dao;

import sm.domain.Student;

public class StuDao extends BasicDao<Student>{
}
package sm.dao;

import sm.domain.Manager;

public class ManagerDao extends BasicDao<Manager>{
}
  1. 建立domain包,Manager类和Student对应MySQL中的表定义属性及其类型。
package sm.domain;

/***
 * @Description: 管理员类 id,username,pword
 * @Author: Wang Rui
 * @Date: 2020/11/18$
 */
public class Manager {
    private int id;
    private String username;
    private String pword;

    public Manager() {
    }

    public Manager(int id, String username, String pword) {
        this.id = id;
        this.username = username;
        this.pword = pword;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPword() {
        return pword;
    }

    public void setPword(String pword) {
        this.pword = pword;
    }

    @Override
    public String toString() {
        return "Manager{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", pword='" + pword + '\'' +
                '}';
    }
}
package sm.domain;

/***
 * @Description: 学生类  id,stunumber,stuname,gender,grade,tel,email,birth
 * @Author: Wang Rui
 * @Date: 2020/11/18$
 */
public class Student {
    private int id;
    private String stunumber;//学号
    private String stuname;
    private String gender;
    private String grade;//年级
    private String tel;
    private String email;
    private String birth;

    public Student() {
    }

    public Student(int id, String stunumber, String stuname, String gender, String grade, String tel, String email, String birth) {
        this.id = id;
        this.stunumber = stunumber;
        this.stuname = stuname;
        this.gender = gender;
        this.grade = grade;
        this.tel = tel;
        this.email = email;
        this.birth = birth;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getStunumber() {
        return stunumber;
    }

    public void setStunumber(String stunumber) {
        this.stunumber = stunumber;
    }

    public String getStuname() {
        return stuname;
    }

    public void setStuname(String stuname) {
        this.stuname = stuname;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getBirth() {
        return birth;
    }

    public void setBirth(String birth) {
        this.birth = birth;
    }

    @Override
    public String toString() {
        return stunumber + "\t" +
                 stuname + "\t" +
                 gender + "\t" +
                 grade + "\t" +
                 tel + "\t"+
                 email + "\t" +
                 birth;

    }
}
  1. 建立service包,其中managerService类提供管理员登录验证的方法,studentService类用于提供学生增删改查的方法。
package sm.service;

import sm.dao.ManagerDao;

/***
 * @Description: 提供管理员登录验证的方法
 * @Author: Wang Rui
 * @Date: 2020/11/18$
 */
public class managerService {
    ManagerDao dao = new ManagerDao();
//登录验证
    public boolean login(String username,String password){
//此处易出现java.lang.ClassCastException异常,Long型不可强转为Boolean型
        Long count =  (Long)dao.scalar("select count(*) from manager where username=? and pword=?", username,password);
        return count > 0;
    }
}
package sm.service;

import sm.dao.StuDao;
import sm.domain.Student;
import java.util.List;

/**
 * 此类用于提供学生增删改查的方法
 * @Author: Wang Rui
 * @Date: 2020/11/18$
 */
public class studentService {
    StuDao dao = new StuDao();

    //1、统计学生人数
    public int nums(){
        Long longnums = (Long) dao.scalar("select count(*) from stu");
        int nums = longnums.intValue();
        return nums ;
    }
    //2、查看学生名单-返回学生列表
    public List<Student> getAllStudents(){
        List<Student> students = dao.queryMulti("select * from stu",Student.class);
        return students;
    }
    //3、按学号查询学生姓名
    public String queryByStuNumber(String stunumber){
        return (String) dao.scalar("select stuname from stu where stunumber = ?", stunumber);

    }
    //4、按姓名查询学生信息
    public Student queryByStuName(String stuName){
        return dao.querySingle("select * from stu where stuname like ?", Student.class, "%"+stuName+"%");

    }
    //5.删除学生记录
    public int deleteStu(String stunumber){
        return dao.update("delete from stu where stunumber = ?", stunumber);
    }
    //6.修改学生年级
    public int changeStu(String stunumber,String newGrade){
       return dao.update("update stu set grade = ? where stunumber = ?",newGrade,stunumber);
    }
    //7.添加学生
    public int addStu(int id, String stunumber, String stuname, String gender, String grade, String tel, String email, String birth){
       return dao.update("insert into stu values(?,?,?,?,?,?,?,?)",id,stunumber,stuname,gender,grade,tel,email,birth);
    }
}
  1. 建立view包,其中TSUtility工具类用于读取控制台操作,stuView用于主界面的显示。首先是登陆界面,输入正确的用户名和密码后进入主菜单,控制台输入相应功能序号调取相应方法。
package sm.view;

import sm.domain.Student;
import sm.service.managerService;
import sm.service.studentService;
import java.util.List;
import java.util.Scanner;

/***
 * @Description: 主界面显示
 * @Author: Wang Rui
 * @Date: 2020/11/18$
 */
public class stuView {
    managerService ms = new managerService();
    studentService ss = new studentService();

    public static void main(String[] args) {
        new stuView().login();
    }

    /**
     * 登录界面显示
     */
    public void login() {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = input.next();
        System.out.println("请输入密码:");
        String password = input.next();

        if(ms.login(username, password)){
            System.out.println("登录成功!");
            System.out.println();
            showMainMenu();
        }else{
            System.out.println("登录失败!");
        }

    }

    /**
     * 功能:显示主菜单
     */
    private void showMainMenu() {
        boolean loopFlag = true;
        char key = 0;

        do {
            init();
            key = TSUtility.readMenuSelection();
            System.out.println();

            switch (key) {
                case '1':
                    System.out.println("当前学生人数为:" + ss.nums());
                    System.out.println();
                    break;
                case '2':
                    listStudents();
                    break;
                case '3':
                    queryByStuNumber();
                    break;
                case '4':
                    queryByStuName();
                    break;
                case '5':
                    deleteByStuName();
                    break;
                case '6':
                    changeGrade();
                    break;
                case '7':
                    addStudent();
                    break;
                case '8':
                    System.out.print("确认是否退出(Y/N):");
                    char yn = TSUtility.readConfirmSelection();
                    if (yn == 'Y')
                        loopFlag = false;
                    break;
            }
        } while (loopFlag);
    }
   /**
    * 初始显示主菜单
    */
    private void init() {
        System.out.println("===================请选择操作键================");
        System.out.println("1、统计学生人数");
        System.out.println("2、查看学生名单");
        System.out.println("3、按学号查询学生姓名");
        System.out.println("4、按姓名查询学生信息");
        System.out.println("5、删除学生记录");
        System.out.println("6、修改学生年级");
        System.out.println("7、添加学生");
        System.out.println("8、退出");
        System.out.println();
    }

    /**
     * 显示当前学生列表方法
     */
    public void listStudents() {
        System.out.println("-------------------------------学生列表-----------------------------");
        List<Student> allStudents = ss.getAllStudents();
        if (allStudents.size() == 0) {
            System.out.println("没有客户记录!");
        } else {
            System.out.println("学号\t姓名\t性别\t年级\t电话\t邮箱\t出生日期");
        }

        for (Student e : allStudents) {
            System.out.println(e.getStunumber() + "\t" + e.getStuname()  + "\t" + e.getGender() + "\t"
                    + e.getGrade() + "\t" + e.getTel() + "\t" + e.getEmail() + "\t" + e.getBirth());
        }
        System.out.println();
    }
    /**
     * 按学号查询学生姓名方法
     */
    private void queryByStuNumber() {
        System.out.println("===================查询操作================");
        System.out.print("请输入学生学号:");
        String s = TSUtility.readString();
        String s1 = ss.queryByStuNumber(s);
        if (s1 != null) {
            System.out.println(s1);
        } else {
            System.out.println("查询失败,请重新操作");
        }
    }
    /**
     * 按姓名查询学生信息方法
     */
    private void queryByStuName() {
        System.out.println("===================查询操作================");
        System.out.print("请输入学生姓名:");
        String s = TSUtility.readString();
        Student s1 = ss.queryByStuName(s);
        if (s1 != null) {
            System.out.println("学号\t姓名\t性别\t年级\t电话\t邮箱\t出生日期");
            System.out.println(s1);
        } else
            System.out.println("查询失败,请重新操作");

    }
    /**
     * 删除学生记录方法
     */
    private void deleteByStuName() {
        System.out.println("===================删除操作================");
        System.out.print("请输入学生学号:");
        String s = TSUtility.readString();
        System.out.print("确认是否删除(Y/N):");
        char yn = TSUtility.readConfirmSelection();
        if (yn == 'N')
            return;
        else if(yn == 'Y') {
            if (ss.deleteStu(s) > 0) {
                System.out.println("删除成功");
            }
            else
                System.out.println("输入信息错误,请重新操作!");
        }else
            System.out.println("删除失败,请重新操作!");
    }
    /**
     * 修改学生年级方法
     */
    private void changeGrade() {
        System.out.println("===================修改操作================");
        System.out.print("请输入学生学号:");
        String s = TSUtility.readString();
        System.out.print("请输入修改后的年级:");
        String newGrade = TSUtility.readString();
        if (ss.changeStu(s,newGrade) > 0) {
            System.out.print("确认是否修改(Y/N):");
            char yn = TSUtility.readConfirmSelection();
            if (yn == 'N')
                return;
            System.out.println("修改成功");
        } else
            System.out.println("修改失败,请重新操作!");
    }
    /**
     * 添加学生方法
     */
    private void addStudent() {
        System.out.println("===================添加操作================");
        System.out.print("请输入学生序号:");
        int id = TSUtility.readInt();
        System.out.print("请输入学生学号:");
        String stuNumber = TSUtility.readString();
        System.out.print("请输入学生姓名:");
        String stuName = TSUtility.readString();
        System.out.print("请输入学生性别:");
        String gender = TSUtility.readString();
        System.out.print("请输入学生年级:");
        String grade = TSUtility.readString();
        System.out.print("请输入学生电话:");
        String tel = TSUtility.readString();
        System.out.print("请输入学生邮箱:");
        String email = TSUtility.readString();
        System.out.print("请输入学生出生日期:");
        String birth = TSUtility.readString();

        if (ss.addStu(id,stuNumber, stuName, gender, grade, tel, email, birth) > 0) {
            System.out.print("确认是否添加(Y/N):");
            char yn = TSUtility.readConfirmSelection();
            if (yn == 'N')
                return;
            System.out.println("添加成功");
        } else
            System.out.println("添加失败,请重新操作!");
    }
    
}

测试效果

  1. 登陆界面
  • 如果用户名密码输入正确,显示“登陆成功!”
  • 如果用户名密码输入不正确,显示“登陆失败!”
  1. 功能1、统计学生人数
  2. 功能2、查看学生名单
  3. 功能3、按学号查询学生姓名
  • 如果输入学号正确
  • 如果输入学号不正确
  1. 功能4、按姓名查询学生信息
  • 如果输入名字正确(可以模糊查询)
  • 如果输入名字不正确
  1. 功能5、删除学生记录
  • 如果输入学号正确
  • 确认删除(Y)

删除后查看学生列表,确定已删除

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O518kDiM-1605773006161)(</images/SM/10.PNG>)]

  • 不确认(N)
    自动退出,重新回到主菜单
  • 如果输入学号不正确
  1. 功能6、修改学生年级
    例如将学号为S0018的学生年级改为B1
  • 确认修改(Y)

修改后查看学生列表,确定已修改

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LKDk6pih-1605773006167)(</images/SM/15.PNG>)]

  • 不确认(N)
    自动退出,重新回到主菜单
  1. 功能7、添加学生
    输入学生序号、学号、姓名、性别、年级、电话、邮箱、出生日期
  • 确认添加(Y)

添加后查看学生列表,确定已添加

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-it29Swex-1605773006177)(</images/SM/14.PNG>)]

  • 不确认(N)
    自动退出,重新回到主菜单
  1. 功能8、退出
  • 确认退出(Y)
  • 不确认(N)
    自动退出,重新回到主菜单