学生管理系统--java+mysql

news2024/12/27 13:34:32

学生管理系统

简介

练习:完成学生信息的增删查改(根据id),项目进行了三层架构进行创建。
dao层,service层,utils层,程序入口
pojo层,dao层,service层,utils层,程序入口;

1.pojo层

实体层 数据库在项目中的类
Entity层是实体层,也就是所谓的model,也称为pojo层,是数据库在项目中的类,该文件包含实体类的属性和对应属性的set、get方法;
pojo内的student类,主要是与数据库中相应的表进行对应,字段类型需一一对应。

package student.pojo;
/**
 * @description: TODO
 * @date 2023/7/15 9:14
 */
public class Student {
    private int id;
    private String name;
    private String className;
    private String score;

    public Student() {
    }

    public Student(int id, String name, String className, String score) {
        this.id = id;
        this.name = name;
        this.className = className;
        this.score = score;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getScore() {
        return score;
    }

    public void setScore(String score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return
                "学号:" + id +"\t" +
                " 姓名:" + name + '\t' +
                "班级:" + className + '\t' +
                "成绩:" + score + '\t' ;
    }
}

2.dao层

持久层 主要与数据库进行交互
DAO层=mapper层,现在用Mybatis逆向工程生成的mapper层,其实就是dao层。DAO层会调用entity层,DAO中会定义实际使用到的方法,比如增删改查。DAO 层的数据源和数据库连接的参数都是在配置文件中进行配置的,配置文件一般在同层的XML文件夹中。数据持久化操作就是指,把数据放到持久化的介质中,同时提供增删改查操作。

package student.dao;

import student.pojo.Student;

public interface StudentDao {
    /**
     *  根据id查询信息
     * @param id
     */
    Student findById(int id);

    /**
     * 新增学生信息
     * @param student
     * @return
     */
    void addStudent(Student student);

    /**
     * 根据id删除信息
     * @param id
     */
    void deleteStudent(int id);

    /**
     * 更新学生信息
     * @param student
     */
    void updateStudent(Student student);
}

实现类impl
dao接口中方法的具体实现

package student.dao.imp;

import student.dao.StudentDao;
import student.pojo.Student;
import student.utils.OperationUtils;

/**
 * @description: TODO
 * @date 2023/7/15 10:33
 */
public class StudentDaoImp implements StudentDao {
    @Override
    public Student findById(int id) {
        Student student = OperationUtils.findById(id);
        return student;
    }

    @Override
    public void addStudent(Student student) {
        OperationUtils.addStudent(student);
    }

    @Override
    public void deleteStudent(int id) {
        OperationUtils.deleteStudent(id);
    }

    @Override
    public void updateStudent(Student student) {
        OperationUtils.updateStudent(student);
    }
}

3.service层

业务层 控制业务
Service层主要负责业务模块的逻辑应用设计。先设计放接口的类,再创建实现的类,然后在配置文件中进行配置其实现的关联。service层调用dao层接口,接收dao层返回的数据,完成项目的基本功能设计。
封装Service层的业务逻辑有利于业务逻辑的独立性和重复利用性。

public interface StudentService {

    Student findById(int id);
    void addStudent(Student student);
    void deleteStudent(int id);
    void updateStudent(Student student);

}
package student.service.imp;

import student.dao.StudentDao;
import student.dao.imp.StudentDaoImp;
import student.pojo.Student;
import student.service.StudentService;

/**
 * @description: TODO
 * @date 2023/7/15 10:44
 */
public class StudentServiceImp implements StudentService {
    StudentDao studentDaoImp = new StudentDaoImp();
    @Override
    public Student findById(int id) {
        Student student = studentDaoImp.findById(id);
        return student;
    }

    @Override
    public void addStudent(Student student) {
        studentDaoImp.addStudent(student);
    }

    @Override
    public void deleteStudent(int id) {
        studentDaoImp.deleteStudent(id);
    }

    @Override
    public void updateStudent(Student student) {
        studentDaoImp.updateStudent(student);
    }
}

4.utils工具类

完成数据库连接,具体的增删查改方法等,提高代码的复用率。

4.1数据库连接工具

这里使用jbdc,properties进行数据库连接(具体jdbc知识之前的博客有)

driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/student_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
username = root
password = 123456

这里将关闭和连接分成两个方法,方便调用释放资源

package student.utils;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
/**
 * @description: TODO
 * @date 2023/7/14 20:07
 */
public class JdbcUtils {
    private static String url;
    private static String driver;
    private static String username;
    private static String password;

    static {
        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream("src\\db.properties"));
             url = properties.getProperty("url");
             driver = properties.getProperty("driver");
             username = properties.getProperty("username");
             password = properties.getProperty("password");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 建立数据库连接
     * @return
     */
    public static Connection getConnection() {
        try {
            return DriverManager.getConnection(url,username,password);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 关闭数据库连接,释放资源
     */
    public static void close(Statement statement, ResultSet resultSet,Connection connection){
        try {
            if (statement != null){
                statement.close();
            }
            if (resultSet != null){
                resultSet.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

4.2 OperationUtils具体的增删查改方法

package student.utils;

import student.pojo.Student;

import java.sql.*;

/**
 * @description: TODO
 * @date 2023/7/15 9:13
 * 数据库的增删查改
 */
public class OperationUtils {
    private Student student = new Student();

    /**
     * 查询
     * @param id
     * @return 根据id查找学生信息
     */
    public static Student findById(int id){
        Student student = null;
        try {
            Connection connection = JdbcUtils.getConnection();
            String sql = "select * from student where id = ?";
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setInt(1, id);
            ResultSet resultSet = statement.executeQuery();
            while (resultSet.next()) {
                id = resultSet.getInt(1);
                String name = resultSet.getString(2);
                String classname = resultSet.getString(3);
                String score = resultSet.getString(4);

                 student = new Student(id, name, classname, score);

                 //JdbcUtils.close(statement,resultSet,connection);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
       return student;
    }

    /**
     * 添加信息
     * @return
     */
    public static void addStudent(Student student){

        Connection connection = JdbcUtils.getConnection();
        String sql = "insert into student values(?,?,?,?)";
        try {
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setInt(1, student.getId());
            statement.setString(2, student.getName());
            statement.setString(3, student.getClassName());
            statement.setString(4, student.getScore());

           int i = statement.executeUpdate();
             if (i>0){
                 System.out.println("数据添加成功!");
             }
             JdbcUtils.close(statement,null,connection);
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    /**
     * 根据id删除学生信息
     * @param id
     */
    public static void deleteStudent(int id){
        Connection connection = JdbcUtils.getConnection();
        String sql = "delete from student where id = ?";
        try {
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setInt(1,id);
            int i = statement.executeUpdate();
            if (i>0){
                System.out.println("删除成功!");
            }else {
                System.out.println("删除失败");
            }
            JdbcUtils.close(statement, null, connection);
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    /**
     * 更新
     * @param student
     */
    public static void updateStudent(Student student){
        Connection connection = JdbcUtils.getConnection();
        String sql = "update student set name = ?,className = ?,score =? where id = ?";
        try {
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setString(1, student.getName());
            statement.setString(2, student.getClassName());
            statement.setString(3, student.getScore());
            statement.setInt(4,student.getId());

            int i = statement.executeUpdate();
            if (i>0) {
                System.out.println("更新成功");
            }
            JdbcUtils.close(statement,null,connection);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

4.3 Menu主菜单

switch语句进行选择

package student.utils;

import student.dao.StudentDao;
import student.dao.imp.*;
import student.pojo.Student;

import java.util.Scanner;

/**
 * @description: TODO
 * @date 2023/7/15 10:49
 */
@SuppressWarnings("all")
public class Menu {
    private static Scanner scanner = new Scanner(System.in);
    public static void menuStudent() {
        while (true) {
            OperationMenu.start();
            int i = scanner.nextInt();
        switch (i) {
            case 1:
                OperationMenu.find();
                break;
            case 2:
              OperationMenu.update();
                break;
            case 3:
                OperationMenu.add();
                break;
            case 4:
               OperationMenu.delete();
                break;
            case 5:
                System.exit(0);
       		 }
    	}
	}
}

4.4 OperationMenu每一个case里的具体操作

package student.utils;

import student.dao.StudentDao;
import student.dao.imp.StudentDaoImp;
import student.pojo.Student;
import student.service.StudentService;
import student.service.imp.StudentServiceImp;

import java.util.Scanner;

/**
 * @description: TODO
 * @date 2023/7/15 14:28
 */
public class OperationMenu {
   private static StudentDao studentDaoImp = new StudentDaoImp();
   private static StudentService studentService = new StudentServiceImp();
   private static Scanner scanner = new Scanner(System.in);
    public static void find(){
        System.out.print("输入要查询学生的学号:");
        int id = scanner.nextInt();
        Student student = studentService.findById(id);
        System.out.println(student);
    }

    public static void  update() {
        System.out.println("请输入要修改的信息");
        System.out.println("请输入要修改学生的学号:");
        int updateid = scanner.nextInt();
        System.out.println("请输入修改后的姓名:");
        String name = scanner.next();
        System.out.println("请输入修改后的班级:");
        String classname = scanner.next();
        System.out.println("请输入要修改的成绩:");
        String score = scanner.next();
        Student student = new Student();
        student.setId(updateid);
        student.setName(name);
        student.setScore(score);
        student.setClassName(classname);
        studentService.updateStudent(student);
    }

    public static void add(){
        System.out.println("请输入要增加的学生信息:");
        System.out.println("输入学生学号:");
        int addid = scanner.nextInt();
        System.out.println("输入学生姓名:");
        String addname = scanner.next();
        System.out.println("输入学生班级:");
        String addclass = scanner.next();
        System.out.println("输入学生成绩:");
        String addscore = scanner.next();
        Student newstudent = new Student(addid,addname,addclass,addscore);
        studentService.addStudent(newstudent);
    }
    public static void delete(){
        System.out.println("请输入要删除的学生学号");
        int delid = scanner.nextInt();
        studentService.deleteStudent(delid);

    }
    public static void start(){
        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("选择功能:");

    }
}

4.5 AppMain程序入口

public class AppMain {
    public static void main(String[] args) {
        Menu.menuStudent();
    }
}

5.实现效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于linux下的高并发服务器开发(第一章)- dup,dup2函数

int dup(int oldfd);复制文件描述符 /*#include <unistd.h>int dup(int oldfd);作用&#xff1a;复制一个新的文件描述符fd3, int fd1 dup(fd),fd指向的是a.txt, fd1也是指向a.txt从空闲的文件描述符表中找一个最小的&#xff0c;作为新的拷贝的文件描述符*/#include &…

80C51定时/计数器的应用之实现PWM(脉冲宽度调制)

知识来源于链接&#xff1a;https://www.bilibili.com/video/BV1eT4y1J7wB/?spm_id_from333.880.my_history.page.click&vd_sourceb91967c499b23106586d7aa35af46413 这种模拟实现 PWM 波的应用只能应用于对波形精度和频率要求不高的情况下。 一、程序思路分析 这里想要…

Redis缓存雪崩、穿透、击穿原因分析和解决方案,附Redis管道使用技巧

先给大家附上其他几篇文章&#xff0c;感兴趣的自行开车导航 Redis过期策略和持久化机制全面揭秘&#xff0c;教你如何合理配置 【深入浅出Redis 一】从版本特性到数据类型到线程模型&#xff0c;带你了解Redis的核心特性和应用场景&#xff01; 一次redis OOM问题分析解决&…

PyTorch深度学习——Anaconda和PyTorch安装

一、Anaconda安装 前言 安装anaconda后主要有一下3点好处&#xff1a; 1.包含环境管理器conda。 2.大量安装基于python的工具包。 3.可以创建使用和管理不同的python版本。 附上百度百科的解释&#xff1a; 下载步骤&#xff1a; 1.官网下载anaconda 2.双击之后安装即可 …

【Linux】进程间通信——管道与共享内存

文章目录 前言 1、三个问题1-1、什么是通信&#xff1f;1-2、为什么要有通信1-3、怎么进行通信&#xff1f;1-4、进程间通信分类 2、管道2-1、匿名管道2-1-1、理解通信本质问题2-1-2、进一步理解管道2-1-3、代码实现pipe函数 2-1-4、读写特征2-1-5、管道的特点&#xff08;重点…

MQTT springboot + idea

参考链接&#xff1a;&#xff08;第一个是理论 第二个是代码 我是直接cv的 我就不贴代码了&#xff09; MQTT协议基本流程、原理_mqtt协议工作原理_Nimrod__的博客-CSDN博客 SpringBoot整合MQTT_springboot mqtt_N_P_E的博客-CSDN博客 EMQX 入门教程③——默认端口、端口策…

10.Java 基本数据类型与包装类之间的转换

Java 的包装类便是一种特殊的引用数据类型&#xff0c;因为其是与基本数据类型一一对应的 1.装箱和拆箱 装箱指的是将基本数据类型转为包装类&#xff1b;拆箱指的是将包装类转为基本数据类型 1.1 int 与 Integer 之间的转换 int → Integer int i 13; Integer integer I…

基于JSP+servlet+JDBC开发的人物管理系统

文章目录 技术说明【效果图】源码 技术说明 后端&#xff1a;JspServletJDBC 前端&#xff1a;BootStrap技术 数据库&#xff1a;Mysql 其他&#xff1a;ckeditor富文本编辑器、FileUpload组件上传图片、MD5加密技术 功能&#xff1a;人物的增删改查 【效果图】 源码 https:…

mysql、redis 、RabbitMQ只能本机访问,怎么改?

如果只能本机访问&#xff0c;怎么改? 一、mysql - 改my.ini 刷脚本 bind-address0.0.0.0 然后重启一下mysql服务 任务管理器-关掉mysql 搜索 计算机管理-重启mysql服务 然后 打开查询&#xff0c;并选择mysql数据&#xff0c;输入这个sql语句&#xff0c;点击运行 sele…

小程序首页轮播图设计

效果图 微信小程序的数据详解 indicator-dots&#xff1a;是否显示面板指示点【默认false 】 indicator-color&#xff1a;指示点颜色【默认rgba(0, 0, 0, .3)】 indicator-active-color&#xff1a;当前选中的指示点颜色【默认#000000】 autoplay&#xff1a;是否自动切换…

总结928

在备考的过程中&#xff0c;我时不时会思考这个问题&#xff0c;我到底怎么样才能“一战成硕”&#xff0c;这个问题本质上就是如何达成目标的问题。 曾遇到这么一句话&#xff0c;90%的人没有目标&#xff0c;99.9%的人败在了目标上。当看到这句话&#xff0c;我还以为是我的…

WEB:upload1

题目 看到文件上传的一般思路是&#xff1a;构建一句话木马&#xff0c;利用bp修改包后缀名&#xff08;一般会限制上传文件类型&#xff09;&#xff0c;上传成功以后注意文件位置&#xff0c;利用菜刀或者是中国蚁剑进行连接&#xff0c; 然后获得flag 构建一句话木马 <…

什么是产品生命周期(PLM)管理系统?

引言 产品生命周期管理 (PLM) 涉及产品生命周期的每个阶段。从产品设计人员进行创造性构思&#xff0c;到物联网网络发送和接收宝贵的数据&#xff0c;再到接收客户真实且及时的反馈&#xff0c;整个产品生命周期中的每一条信息都至关重要&#xff0c;构成了完整的产品构成。 …

【雕爷学编程】Arduino动手做(02)---光敏电阻模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

联动规则组件-KOV场景梳理技术方案

一、背景&#xff1a; 多场景使用到kov类型组件&#xff0c;但是实现上不统一&#xff0c;各个场景的协议都比较定制&#xff0c;且开发的时候难度较大。所以将组件进行抽离 目标&#xff1a;支撑所有逻辑场景 什么是kov&#xff1f;如下图&#xff1a; 难点&#xff1a; 1、…

KVM-虚拟机【安装与基础使用】

目录 【1】kvm-01&#xff1a;安装-KVM管理工具 【2】创建新的虚拟机 【3】kvm常用管理命令 【4】console控制台登录 【5】修改虚拟机的密码 【6】KVM虚拟机的虚拟磁盘管理和快照管理 【7】将raw格式的磁盘挂载到宿主机 【8】磁盘的管理命令 【9】创建快照-内部快照 【…

java学习路程之篇七、知识点、赋值运算符、关系运算符、逻辑运算符、三元运算符、运算符优先级

文章目录 1、赋值运算符2、关系运算符3、逻辑运算符4、三元运算符5、运算符优先级 1、赋值运算符 2、关系运算符 3、逻辑运算符 4、三元运算符 5、运算符优先级

Elasticsearch和MySQL之间的数据同步问题

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章参考网上的课程&#xff0c;介绍Elasticsearch和MySQL之间的数据同步问题。 如果文章有什么需要改进的地方还请大佬不吝赐教&#x1f44f;&#x1f44f;。 小威在…

vue路由接口转发

目录 一、nginx的路由转发 二、vue路由转发 三、两者路由转发的区别 vue的路由和nginx的路由有许多相似之处&#xff0c;也有一些不同的地方。 两者都有接口转发的功能&#xff0c;但是具体转发的方式会有一些区别。 一、nginx的路由转发 nginx的路由是这样的&#xff1a;…

C# Modbus通信从入门到精通(3)——Modbus RTU(0x01功能码)

1、01(0x01)读线圈 使用该功能码能从远程地址中读取1到2000个线圈的状态,每个线圈的状态只能是0或者1,读取的线圈数据由主站读取时指定。 2、发送报文格式 更详细的格式如下: 从站地址+功能码+起始地址高位+起始地址低位+线圈数量高位+线圈数量低位+CRC,一共8个字节,其…