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部分
- 建库
studentm
CREATE DATABASE studentm;
- 建表
- 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
);
- 设置管理员用户名、密码
INSERT INTO `manager` VALUES(1,'john',8888);
- 可以先加入一些学生用于测试
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部分
- 导入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);
}
}
}
- 建立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>{
}
- 建立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;
}
}
- 建立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);
}
}
- 建立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、统计学生人数
- 功能2、查看学生名单
- 功能3、按学号查询学生姓名
- 如果输入学号正确
- 如果输入学号不正确
- 功能4、按姓名查询学生信息
- 如果输入名字正确(可以模糊查询)
- 如果输入名字不正确
- 功能5、删除学生记录
- 如果输入学号正确
- 确认删除(Y)
删除后查看学生列表,确定已删除
- 不确认(N)
自动退出,重新回到主菜单
- 如果输入学号不正确
- 功能6、修改学生年级
例如将学号为S0018的学生年级改为B1
- 确认修改(Y)
修改后查看学生列表,确定已修改
- 不确认(N)
自动退出,重新回到主菜单
- 功能7、添加学生
输入学生序号、学号、姓名、性别、年级、电话、邮箱、出生日期
- 确认添加(Y)
添加后查看学生列表,确定已添加
- 不确认(N)
自动退出,重新回到主菜单
- 功能8、退出
- 确认退出(Y)
- 不确认(N)
自动退出,重新回到主菜单