Spring 实现学生成绩管理系统(完整代码)

11 篇文章 0 订阅

简介

本文基于Spring5框架实现一个简单的学生成绩管理系统。它使用Druid数据库连接池,以及Spring提供的JdbcTemplate模板,实现Dao层和Service层的基本功能。

完整代码见github
https://github.com/AsajuHuishi/StudentScoreManagementSystemSpring

任务

环境依赖

  • JDK 1.8
  • MySQL 5.5.15
  • JDBC 5.1.49
  • Spring 5.2.6
  • Intellij IDEA 2020.3.1
  • 所需依赖:

相关工作

MySQL+java: 实现学生成绩管理系统(1.0版本)
MySQL+java: 实现学生成绩管理系统(2.0版本)

本项目基于以上项目进行改进。主要改进内容有:

  • 将结构分成Sevice和Dao两层,对冗余代码进行简化;
  • 使用Druid数据库连接池技术;
  • 应用JdbcTemplate模板封装增删改查SQL语句;
  • 使用xml方式和注解方式实现IOC的bean管理。

项目结构

文件功能
StuScore.java实体类,建立和stu_score表相同的字段
StuDao.javaDao层,数据库相关操作方法接口
StuDaoImpl.javaDao层接口实现类,封装数据库连接,增删改查语句
StuService.javaService层,实现具体业务操作(菜单)
TestMenu.java测试主方法
bean.xml配置文件,配置Druid数据库连接池+JdbcTemplate

具体实现

使用MySQL生成表

包括 学号,姓名,成绩,班级四个字段。

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;

配置文件

prop.driverClassName=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/db58
prop.username=root
prop.password=123456
<?xml version="1.0" encoding="UTF-8"?>
<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.studentscore"></context:component-scan>
    <!--数据库连接池属性文件-->
    <context:property-placeholder location="jdbc.properties"/>
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="driverClassName" value="${prop.driverClassName}"></property>
            <property name="password" value="${prop.password}"></property>
            <property name="username" value="${prop.username}"></property>
            <property name="url" value="${prop.url}"></property>
        </bean>
    <!--创建JdbcTemplate对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

</beans>

实体类

package indi.huishi.studentscore.entity;

public class StuScore {
    public StuScore(String no, String name, float score, int className) {
        this.no = no;
        this.name = name;
        this.score = score;
        this.className = className;
    }

    public StuScore() {
    }

    /**
     * 学生实体类,属性:姓名,学号,成绩,班级
     */
    private String no;
    private String name;
    private float score;
    private int className;
    @Override
    public String toString() {
        return "StuScore{" +
                "no='" + no + '\'' +
                ", name='" + name + '\'' +
                ", score=" + score +
                ", className=" + 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;
    }
}

数据访问层

接口

package indi.huishi.studentscore.dao;

import indi.huishi.studentscore.entity.StuScore;

import java.util.List;

public interface StuDao {
    /** dao接口,实现以下方法:
     * 数据库连接池的连接+增/删/改/查通用方法
     */
    void add(StuScore stuScore);
    void delete(String no);
    void update(StuScore stuScore);
    StuScore queryByName(String name);
    StuScore queryByNo(String no);
    void querySort();
    List<Object> statistics();

}

接口实现类

package indi.huishi.studentscore.dao;

import indi.huishi.studentscore.entity.StuScore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Repository
public class StuDaoImpl  implements  StuDao{
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void add(StuScore stuScore) {
        /**
         * 增加学生记录
         */
        Object[] params = {stuScore.getNo(),stuScore.getName(),stuScore.getScore(),stuScore.getClassName()};
        int add = 0;
        try {
            add = jdbcTemplate.update("insert into stu_score values(?,?,?,?)", params);
        } catch (DataAccessException e) {
            e.printStackTrace();
        } finally {
            System.out.println(add > 0 ? "添加成功" : "添加失败");
        }
    }

    @Override
    public void delete(String no) {
        /**
         * 按学号删除记录
         */
        int delete = 0;
        try {
            delete = jdbcTemplate.update("delete from stu_score where no=?",no);
        } catch (DataAccessException e) {
            e.printStackTrace();
        } finally {
            System.out.println(delete > 0 ? "删除成功" : "删除失败");
        }
    }

    @Override
    public void update(StuScore stuScore) {
        /**
         * 按学号修改记录
         */
        Object[] params = {stuScore.getName(),stuScore.getScore(),stuScore.getClassName(),stuScore.getNo()};
        int update = 0;
        try {
            update = jdbcTemplate.update("update stu_score set name=?,score=?,className=? where no=?",params);
        } catch (DataAccessException e) {
            e.printStackTrace();
        } finally {
            System.out.println(update > 0 ? "修改成功" : "修改失败");
        }
    }

    @Override
    public StuScore queryByName(String name) {
        /**
         * 按姓名查询记录
         */
        StuScore stuScore = null;
        try {
            stuScore = jdbcTemplate.queryForObject("select * from stu_score where name=?", new BeanPropertyRowMapper<>(StuScore.class), name);
        } catch (DataAccessException e) {
            e.printStackTrace();
        } finally {
            return stuScore;
        }
    }
    @Override
    public StuScore queryByNo(String no) {
        /**
         * 按学号查询记录
         */
        StuScore stuScore = null;
        try {
            stuScore = jdbcTemplate.queryForObject("select * from stu_score where no=?", new BeanPropertyRowMapper<>(StuScore.class), no);
        } catch (DataAccessException e) {
            e.printStackTrace();
        } finally {
            return stuScore;
        }
    }

    @Override
    public void querySort() {
        /**
         * 按C语言成绩排序
         */
        List<StuScore> result = null;
        try {
            result = jdbcTemplate.query("select * from stu_score order by score",new BeanPropertyRowMapper<>(StuScore.class));
        } catch (DataAccessException e) {
            e.printStackTrace();
        }
        for (StuScore res:result) {
            System.out.println(res.toString());
        }
    }

    @Override
    public List<Object> statistics() {
        /**
         * 统计
         */
        List<Object> result = null;//保存集合的列表
        String sql="select count(*),max(score),min(score),round(avg(score),4),className from stu_score group by className order by avg(score) desc";
        try {
            result = jdbcTemplate.query(sql, new RowMapper() {
                @Override
                public Object mapRow(ResultSet resultSet, int i) throws SQLException {
                    Map<String,Object> map = new HashMap<>();
                    map.put("count", resultSet.getObject(1));
                    map.put("max_score", resultSet.getObject(2));
                    map.put("min_score", resultSet.getObject(3));
                    map.put("avg_score", resultSet.getObject(4));
                    map.put("className", resultSet.getObject(5));
                    return map;
                }
            });
        } catch (DataAccessException e) {
            e.printStackTrace();
        } finally {
            return result;
        }

    }
}

业务逻辑层

实现菜单功能

package indi.huishi.studentscore.service;

import indi.huishi.studentscore.dao.StuDao;
import indi.huishi.studentscore.entity.StuScore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class StuService {
    @Autowired
    private StuDao stuDao;
    private static Scanner s;
    private StuScore stuScore;
    public void menu() {
        //菜单
        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("您已成功退出系统,欢迎您再次使用!");
                    }
                    break;
                default:
                    break;
            }
        } while (choose!=7);
    }
    //新增学生信息
    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成绩");
        stuDao.querySort();
    }
    //统计
    public void myStatistic() {
        System.out.println("统计(分班级统计学生数量,最高分,最低分,平均值)");
        List<Object> result = stuDao.statistics();
        for (Object obj:result){
            System.out.println(obj.toString());
        }
    }
}


测试

package indi.huishi.studentscore.test;

import indi.huishi.studentscore.service.StuService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMenu {
    /**
     * 测试
     */
    public static void main(String[] args) {
        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
一月 19, 2021 3:53:26 下午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
信息: {dataSource-1} inited
添加成功
是否继续添加(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
******************************
统计(分班级统计学生数量,最高分,最低分,平均值)
一月 19, 2021 4:38:05 下午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
信息: {dataSource-1} inited
{max_score=86.0, count=2, className=2, min_score=82.5, avg_score=84.25}
{max_score=84.0, count=1, className=3, min_score=84.0, avg_score=84.0}
{max_score=82.0, count=1, className=1, min_score=82.0, avg_score=82.0}
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
7
******************************
您选择了退出系统,确定要退出吗?(y/n)
y

Process finished with exit code -1
  • 4
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
基于SSH(struts-spring-hibernate)开发的学生成绩管理系统,附完整报告,SQL文件,环境为:eclipse+mysql+jdk1.8+tomcate8。运行均能通过,可以作为期末大作业。亲测好用,如果调不通的话,可以私信我~~ 该软件的主要功能是,可以选择多门课程学习,课程类别是必修课或选修课,每门课程由一位专业教师授课,学期末教师给出学生成绩成绩由平时成绩、实验成绩、理论成绩组成。 (1)学生基本情况录入模块: 主要功能用来对学生的基本信息进行收集和录入。在学生信息保存在系统中的前提下,成绩录入需要输入学生资料,比如班级,学号姓名。 (2)课程基本情况录入模块: 主要功能用来对课程的基本信息进行收集和录入。在课程信息保存在系统中的前提下,成绩录入需要输入课程资料,比如课程号,学时,学分。 (3)成绩基本情况录入模块: 主要功能用来对学生的成绩进行收集和录入。在准确录入学生资料后,就可以对该学生的各科成绩进行录入。 (4)按学生学号查找并显示学生资料模块: 主要功能是用来查找学生资料。在系统保存了某学生资料的前提下,想要查找该学生资料,可以输入该学生姓名,这样系统就会显示该学生资料信息 。 (5)按课程号查找并显示学生资料模块: 主要功能是用来查找课程资料。在系统保存了某课程资料的前提下,想要查找该课程资料,可以输入该课程号,这样系统就会显示该课程信息 。 (6)修改删除该学生资料模块 主要功能是用来删除学生资料,在系统保存学生资料的前提下,想删除某学生的资料,可以输入学生姓名,系统查找该学生资料后,就可以删除了。由于学生辍学,毕业等原因,及时对系统进行更新,删除一些没用的信息,可以使系统更加优化。 (7)修改删除课程资料模块 主要功能是用来修改删除课程资料,在系统保存课程资料的前提下,想修改删除某课程的资料,可以直接点击删除,系统查找该课程资料后,就可以删除了。 (8)删除成绩资料模块 主要功能是用来删除成绩资料,在系统保存课程资料的前提下,想删除某项成绩的资料,可以直接点击删除,系统查找该项成绩后,就可以删除了。 (9)用户更改密码 主要功能是用来对管理员用户提供密码修改操作.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值