Mybatis 基于注解方式实现学生成绩管理系统(完整代码)

简介

本文基于Mybatis3.4.5Spring5框架实现一个简单的学生成绩管理系统。它基于注解方式实现Dao层以及Service层的基本功能。

任务

环境

  • JDK 1.8
  • Intellij IDEA 2020.3.1

相关工作

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

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

  • 在Dao层使用Mybatis注解方式实现CRUD,不再需要接口实现类;
  • 封装统计功能返回结果的实体类;
  • 在Service层使用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配置文件

具体实现

使用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;

配置文件

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>studentManagementMybatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

</project>

数据库配置文件

prop.driverClassName=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/db58
prop.username=root
prop.password=123456

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="jdbcConfig.properties"></properties>
    <typeAliases>
<!--        <typeAlias type=""-->
    </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

<?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.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<StuScore>
     * @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

猜你喜欢

转载自blog.csdn.net/qq_36937684/article/details/113201038