Java-MySQL学生管理系统
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;
}
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;
}
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)
自动退出,重新回到主菜单