本文基于Mybatis3.4.5
和Spring5
框架实现一个简单的学生成绩管理系统。它基于注解方式实现Dao层以及Service层的基本功能。
JDK 1.8
Intellij IDEA 2020.3.1
MySQL+java: 实现学生成绩管理系统(1.0版本)
MySQL+java: 实现学生成绩管理系统(2.0版本)
Spring 实现学生成绩管理系统(完整代码)
本项目基于以上项目进行改进。主要改进内容有:
Mybatis
注解方式实现CRUD,不再需要接口实现类;Spring
注解方式获取bean;本项目是一个maven
工程。
文件 | 功能 |
---|---|
StuScore.java | 实体类,建立和stu_score表相同的字段 |
Statistic.java | 实体类,建立统计(分组查询)对应的字段 |
StuDao.java | Dao层,数据库相关操作方法接口 |
StuService.java | Service层,实现具体业务操作(菜单) |
TestMenu.java | 测试主方法 |
pom.xml | maven配置文件 |
SqlMapConfig.xml | Mybatis配置文件,mysql+注解配置 |
bean.xml | Spring配置文件 |
包括 学号,姓名,成绩,班级四个字段。
USE db58;
DROP TABLE IF EXISTS stu_score;
CREATE TABLE IF NOT EXISTS stu_score(
NO VARCHAR(10) unique,
NAME VARCHAR(20),
score FLOAT,
className INT
);
DESC stu_score;
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>studentManagementMybatisartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
properties>
<packaging>jarpackaging>
<dependencies>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.5version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.6version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.12version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.2.9.RELEASEversion>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>compilescope>
dependency>
dependencies>
project>
数据库配置文件
prop.driverClassName=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/db58
prop.username=root
prop.password=123456
SqlMapConfig.xml
<configuration>
<properties resource="jdbcConfig.properties">properties>
<typeAliases>
typeAliases>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC">transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
dataSource>
environment>
environments>
<mappers>
<mapper class="indi.huishi.stuscore.dao.StuDao"/>
mappers>
configuration>
bean.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="indi.huishi.stuscore">context:component-scan>
beans>
package indi.huishi.stuscore.entity;
public class StuScore {
/**
* 学生实体类,属性:姓名,学号,成绩,班级
*/
private String no;
private String name;
private float score;
private int className;
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
public int getClassName() {
return className;
}
public void setClassName(int className) {
this.className = className;
}
public StuScore() {
}
@Override
public String toString() {
return "StuScore{" +
"no='" + no + '\'' +
", name='" + name + '\'' +
", score=" + score +
", className=" + className +
'}';
}
public StuScore(String no, String name, float score, int className) {
this.no = no;
this.name = name;
this.score = score;
this.className = className;
}
}
封装统计结果的返回类型
package indi.huishi.stuscore.entity;
/**
* 统计的实体类
*/
public class Statistic {
public void setCnt(Integer cnt) {
this.cnt = cnt;
}
private Integer cnt;
private double max_s;
private double min_s;
private double avg_s;
private String className;
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
@Override
public String toString() {
return "Statistic{" +
"cnt=" + cnt +
", max_s=" + max_s +
", min_s=" + min_s +
", avg_s=" + avg_s +
", className='" + className + '\'' +
'}';
}
public Integer getCnt() {
return cnt;
}
public double getMax_s() {
return max_s;
}
public void setMax_s(double max_s) {
this.max_s = max_s;
}
public double getMin_s() {
return min_s;
}
public void setMin_s(double min_s) {
this.min_s = min_s;
}
public double getAvg_s() {
return avg_s;
}
public void setAvg_s(double avg_s) {
this.avg_s = avg_s;
}
}
接口
package indi.huishi.stuscore.dao;
import indi.huishi.stuscore.entity.Statistic;
import indi.huishi.stuscore.entity.StuScore;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface StuDao {
/**
* 添加
* @param stuScore
*/
@Insert("insert into stu_score(no,name,score,className) values(#{no},#{name},#{score},#{className})")
void add(StuScore stuScore);
/**
* 删除
* @param no
*/
@Delete("delete from stu_score where no=#{no}")
void delete(String no);
/**
* 按照学号更改
* @param stuScore
*/
@Update("update stu_score set name=#{name},score=#{score},className=#{className} where no=#{no}")
void update(StuScore stuScore);
/**
* 按照姓名查询 返回一个对象
* @param List
* @return
*/
@Select("select * from stu_score where name=#{name}")
StuScore queryByName(String name);
/**
* 按照学号查询 返回一个对象
* @param no
* @return
*/
@Select("select * from stu_score where no=#{no}")
StuScore queryByNo(String no);
/**
* 排序:升序
*/
@Select("select * from stu_score order by score")
List<StuScore> querySort();
/**
* 按不同班级分组,统计 学生数量,最高分,最低分,平均值
* @return
*/
@Select("select count(*) as cnt,max(score) as max_s,min(score) as min_s,round(avg(score),4) as avg_s,className from stu_score group by className order by avg(score) desc")
List<Statistic> statistics();
}
实现菜单功能
package indi.huishi.stuscore.service;
import indi.huishi.stuscore.dao.StuDao;
import indi.huishi.stuscore.entity.Statistic;
import indi.huishi.stuscore.entity.StuScore;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
@Component
class GetStuDao {
private SqlSession session;
private InputStream in;
private StuDao stuDao;
public StuDao init() throws Exception{
//读取配置文件 生成字节输入流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
session = factory.openSession(true);
//获取dao的代理对象
stuDao = session.getMapper(StuDao.class);
System.out.println("初始化成功..."+stuDao);
// System.out.println(stuDao==null);
return stuDao;
}
/**
* 释放资源
*/
public void destroy() throws IOException {
session.close();
in.close();
}
}
@Service
public class StuService {
@Autowired
private GetStuDao getStuDao;
private StuDao stuDao;
private static Scanner s;
private StuScore stuScore;
public void menu() throws Exception {
stuDao = getStuDao.init();
//菜单
int choose,choose2;
List<Integer> chos = new ArrayList<Integer>();
for (int i=1;i<8;i++) {
chos.add(i);
}
Set<Integer> chooseSet = new HashSet<Integer>(chos);
do {
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("请选择(1-7):");
Scanner scanner = new Scanner(System.in);
choose = scanner.nextInt();
while (!chooseSet.contains(choose)) {
System.out.println("请选择(1-7):");
choose = scanner.nextInt();
}
System.out.println("******************************");
switch (choose) {
case 1:
myAdd(); //菜单选择1,是新增学生
break;
case 2:
myUpdate(); //菜单选择2,是修改学生
break;
case 3:
myDel(); //菜单选择3,是删除学生
break;
case 4: //菜单选择4,是查询学生
System.out.print("请选择按姓名查询还是按照学号查询(1姓名 2学号):");
Scanner sc2 = new Scanner(System.in);
choose2 = sc2.nextInt();
if (choose2==1) {
myListByName();
}else if (choose2==2) {
myListByNo();
}
break;
case 5: //菜单选择5,按成绩排序
mySort();
break;
case 6: //菜单选择6,统计
myStatistic();
break;
case 7: //菜单选择7,是退出该系统
System.out.println("您选择了退出系统,确定要退出吗?(y/n)");
Scanner sc3 = new Scanner(System.in);
String scanExit = sc3.next();
if(scanExit.equals("y")){
System.exit(-1);
System.out.println("您已成功退出系统,欢迎您再次使用!");
getStuDao.destroy();
}
break;
default:
break;
}
} while (true);
}
//新增学生信息
public void myAdd() {
String continute;
do {
s = new Scanner(System.in);
String no, name;
float score;
int className;
System.out.println("====新增学生====");
System.out.println("学号(长度不超过10):");
no = s.next();
System.out.println("班级(整数):");
className = s.nextInt();
System.out.println("姓名:");
name = s.next();
System.out.println("成绩:");
score = s.nextFloat();
//调用StuScoreOperation
stuDao.add(new StuScore(no, name, score, className));
System.out.println("是否继续添加(y/n):");
s = new Scanner(System.in);
continute = s.next();
} while (continute.equals("y"));
}
//修改学生信息
public void myUpdate(){
s = new Scanner(System.in);
String no;
System.out.println("====修改学生====");
System.out.println("请输入要修改的学生学号:");
no = s.next();
stuScore = stuDao.queryByNo(no);
if(stuScore!=null) {
System.out.println("查询到该姓名记录");
System.out.println(stuScore.toString());
System.out.println("请输入新的学生信息:");
s = new Scanner(System.in);
String name;
float score;
int className;
System.out.println("学生班级:");
className = s.nextInt();
System.out.println("学生姓名:");
name = s.next();
System.out.println("学生成绩:");
score = s.nextFloat();
stuDao.update(new StuScore(no, name, score, className));
}else{
System.out.println("未查询到该学号记录");
}
}
//删除学生信息
public void myDel(){
s = new Scanner(System.in);
String no;
System.out.println("====删除学生====");
System.out.println("请输入要删除的学生学号:");
no = s.next();
stuScore = stuDao.queryByNo(no);
if(stuScore!=null) {
System.out.println(stuScore.toString());
System.out.println("是否真的删除(y/n):");
s = new Scanner(System.in);
String x = s.next();
if (x.equals("y")) {
stuDao.delete(no);
}
}else{
System.out.println("未查询到该姓名记录");
}
}
//按姓名查询学生信息
public void myListByName(){
s = new Scanner(System.in);
System.out.println("====查询学生====");
System.out.println("请输入要查看的学生姓名:");
StuScore stuScore = stuDao.queryByName(s.next());
if(stuScore!=null) {
System.out.println("查询到该姓名记录");
System.out.println(stuScore.toString());
}else{
System.out.println("未查询到该姓名记录");
}
}
//按学号查询学生信息
public void myListByNo(){
s = new Scanner(System.in);
System.out.println("====查询学生====");
System.out.println("请输入要查看的学生学号:");
StuScore stuScore = stuDao.queryByNo(s.next());
if(stuScore!=null) {
System.out.println("查询到该学号记录");
System.out.println(stuScore.toString());
}else{
System.out.println("未查询到该学号记录");
}
}
//排序
public void mySort() {
System.out.println("按成绩升序显示");
System.out.println("学号\t\t班级\t姓名\t成绩");
List<StuScore> stuScoreList = stuDao.querySort();
for (StuScore stuScore:stuScoreList){
System.out.println(stuScore);
}
}
//统计
public void myStatistic() {
System.out.println("统计(分班级统计学生数量,最高分,最低分,平均值)");
List<Statistic> result = stuDao.statistics();
for (Statistic statistic:result){
System.out.println(statistic.toString());
}
}
}
package indi.huishi.test;
import indi.huishi.stuscore.service.StuService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 测试
*/
public class TestMenu {
public static void main(String[] args) throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
StuService stuService = context.getBean("stuService", StuService.class);
stuService.menu();
}
}
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
1
******************************
====新增学生====
学号(长度不超过10):
201
班级(整数):
1
姓名:
M7
成绩:
82
是否继续添加(y/n):
y
====新增学生====
学号(长度不超过10):
202
班级(整数):
2
姓名:
4D
成绩:
81
是否继续添加(y/n):
y
====新增学生====
学号(长度不超过10):
203
班级(整数):
3
姓名:
A20
成绩:
84
是否继续添加(y/n):
y
====新增学生====
学号(长度不超过10):
213
班级(整数):
3
姓名:
A32
成绩:
85
是否继续添加(y/n):
y
====新增学生====
学号(长度不超过10):
212
班级(整数):
2
姓名:
38tnA
成绩:
86
是否继续添加(y/n):
n
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
2
******************************
====修改学生====
请输入要修改的学生学号:
202
查询到该姓名记录
StuScore{
no='202', name='4D', score=81.0, className=2}
请输入新的学生信息:
学生班级:
2
学生姓名:
4D
学生成绩:
82.5
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
3
******************************
====删除学生====
请输入要删除的学生学号:
213
StuScore{
no='213', name='A32', score=85.0, className=3}
是否真的删除(y/n):
y
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
4
******************************
请选择按姓名查询还是按照学号查询(1姓名 2学号):1
====查询学生====
请输入要查看的学生姓名:
M7
查询到该姓名记录
StuScore{
no='201', name='M7', score=82.0, className=1}
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
4
******************************
请选择按姓名查询还是按照学号查询(1姓名 2学号):2
====查询学生====
请输入要查看的学生学号:
201
查询到该学号记录
StuScore{
no='201', name='M7', score=82.0, className=1}
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
5
******************************
按成绩升序显示
学号 班级 姓名 成绩
StuScore{
no='201', name='M7', score=82.0, className=1}
StuScore{
no='202', name='4D', score=82.5, className=2}
StuScore{
no='203', name='A20', score=84.0, className=3}
StuScore{
no='212', name='38tnA', score=86.0, className=2}
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
6
******************************
统计(分班级统计学生数量,最高分,最低分,平均值)
Statistic{
cnt=2, max_s=86.0, min_s=82.5, avg_s=84.25, className='2'}
Statistic{
cnt=1, max_s=84.0, min_s=84.0, avg_s=84.0, className='3'}
Statistic{
cnt=1, max_s=82.0, min_s=82.0, avg_s=82.0, className='1'}
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
7
******************************
您选择了退出系统,确定要退出吗?(y/n)
n
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
7
******************************
您选择了退出系统,确定要退出吗?(y/n)
y
Process finished with exit code -1