【小学期】操纵数据的DAO设计——以学生管理系统为例

项目结构

student_management
│
├── src
│   ├── model
│   │   ├── Student.java
│   │   └── StudentDAO.java
│   │
│   ├── view
│   │   └── StudentView.java
│   │
│   ├── controller
│   │   └── StudentController.java
│   │
│   └── util
│       ├── DBUtil.java
│       ├── EncodingUtil.java
│       └── OtherUtil.java
│
└── resources└── database.properties

1. 创建Student类

这个类表示学生对象,包含学生的基本属性和对应的getter和setter方法。

package model;/*** 学生类,表示学生对象*/
public class Student {private int id;private String name;private int age;private String grade;public Student() {}public Student(int id, String name, int age, String grade) {this.id = id;this.name = name;this.age = age;this.grade = grade;}// Getter和Setter方法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 int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGrade() {return grade;}public void setGrade(String grade) {this.grade = grade;}
}

2. 创建StudentDAO类

StudentDAO类用于执行对数据库的操作。我们将创建一个使用MySQL的DAO类来执行基本的CRUD操作。

package model;import util.DBUtil;import java.sql.*;
import java.util.ArrayList;
import java.util.List;/*** 学生数据访问对象类,用于执行对学生表的CRUD操作*/
public class StudentDAO {/*** 添加学生信息* @param student 学生对象* @return 添加成功返回true,否则返回false*/public boolean addStudent(Student student) {String sql = "INSERT INTO students (name, age, grade) VALUES (?, ?, ?)";try (Connection conn = DBUtil.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setString(1, student.getName());pstmt.setInt(2, student.getAge());pstmt.setString(3, student.getGrade());int affectedRows = pstmt.executeUpdate();return affectedRows > 0;} catch (SQLException e) {e.printStackTrace();}return false;}/*** 更新学生信息* @param student 学生对象* @return 更新成功返回true,否则返回false*/public boolean updateStudent(Student student) {String sql = "UPDATE students SET name = ?, age = ?, grade = ? WHERE id = ?";try (Connection conn = DBUtil.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setString(1, student.getName());pstmt.setInt(2, student.getAge());pstmt.setString(3, student.getGrade());pstmt.setInt(4, student.getId());int affectedRows = pstmt.executeUpdate();return affectedRows > 0;} catch (SQLException e) {e.printStackTrace();}return false;}/*** 删除学生信息* @param id 学生ID* @return 删除成功返回true,否则返回false*/public boolean deleteStudent(int id) {String sql = "DELETE FROM students WHERE id = ?";try (Connection conn = DBUtil.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setInt(1, id);int affectedRows = pstmt.executeUpdate();return affectedRows > 0;} catch (SQLException e) {e.printStackTrace();}return false;}/*** 获取所有学生信息* @return 学生对象列表*/public List<Student> getAllStudents() {List<Student> students = new ArrayList<>();String sql = "SELECT * FROM students";try (Connection conn = DBUtil.getConnection();Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql)) {while (rs.next()) {Student student = new Student();student.setId(rs.getInt("id"));student.setName(rs.getString("name"));student.setAge(rs.getInt("age"));student.setGrade(rs.getString("grade"));students.add(student);}} catch (SQLException e) {e.printStackTrace();}return students;}/*** 根据学生ID获取学生信息* @param id 学生ID* @return 学生对象,如果没有找到则返回null*/public Student getStudentById(int id) {String sql = "SELECT * FROM students WHERE id = ?";try (Connection conn = DBUtil.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setInt(1, id);try (ResultSet rs = pstmt.executeQuery()) {if (rs.next()) {Student student = new Student();student.setId(rs.getInt("id"));student.setName(rs.getString("name"));student.setAge(rs.getInt("age"));student.setGrade(rs.getString("grade"));return student;}}} catch (SQLException e) {e.printStackTrace();}return null;}
}

3. 创建DBUtil类

为了管理数据库连接,我们需要一个DBUtil类。这里假设我们使用的数据库是MySQL。

package util;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;/*** 数据库工具类,用于管理数据库连接*/
public class DBUtil {private static final String URL = "jdbc:mysql://localhost:3306/studentdb";private static final String USER = "root";private static final String PASSWORD = "password";static {try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 获取数据库连接* @return 数据库连接对象* @throws SQLException SQL异常*/public static Connection getConnection() throws SQLException {return DriverManager.getConnection(URL, USER, PASSWORD);}
}

代码详解与设计原因

Student类
  • 作用:表示学生对象,包含学生的基本属性(ID、姓名、年龄和年级)以及对应的getter和setter方法。
StudentDAO类
  • 作用:用于执行对学生表的CRUD操作。通过使用Connection, PreparedStatement, ResultSet等类,来实现对数据库的增删查改。
  • 方法
    • addStudent:添加学生信息到数据库。
    • updateStudent:更新学生信息。
    • deleteStudent:根据ID删除学生信息。
    • getAllStudents:获取所有学生信息。
    • getStudentById:根据ID获取学生信息。
DBUtil类
  • 作用:管理数据库连接,提供getConnection方法来获取数据库连接对象。

DAO设计原因及功能

  1. 分离关注点:DAO模式将数据访问逻辑与业务逻辑分离,使代码更清晰,更易于维护和扩展。
  2. 复用性:数据访问逻辑集中在DAO类中,可以在多个地方重用,而不必在每个需要访问数据库的地方重复编写代码。
  3. 可测试性:通过将数据访问逻辑集中在DAO类中,可以更容易地对数据访问部分进行单元测试。
  4. 更好的维护性:如果数据库结构发生变化,只需修改DAO类中的代码,而不需要修改业务逻辑代码。

通过以上设计,我们实现了一个简单但功能齐全的学生管理系统的DAO层,为系统的进一步开发奠定了基础。

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

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

相关文章

基于百度地图实现矩形绘制/电子围栏/自定义覆盖物选择、点击、区域选中、轨迹绘制

目录 开发前的准备账号注册页面创建地图初始化矩形绘制开启绘制模式监听绘制完成事件矩形取消事件自定义覆盖物渲染数据准备覆盖物渲染自定义点击事件优化用户刷新提供的覆盖物添加右键菜单轨迹绘制开发前的准备 账号注册 百度地图开发者平台点此访问 登录注册后点击右上角的控…

keepalived 服务高可用(简约版)

本文基于centos 7记述如何使用keepalived 背景 为生产环境准备一台备机是极其必要的&#xff0c;防止主机宕掉无服务可用的情况出现。但是同一局域网内每台主机都分配了一个唯一IP&#xff0c;这些IP既然相互不同&#xff0c;那么服务请求的时候岂不是要切换IP地址&#xff1f…

任务5.1 初识Spark Streaming

实战概述&#xff1a;使用Spark Streaming进行词频统计 1. 项目背景与目标 背景: Spark Streaming是Apache Spark的流处理框架&#xff0c;用于构建可伸缩、高吞吐量的实时数据处理应用。目标: 实现一个实时词频统计系统&#xff0c;能够处理流式数据并统计文本中的单词出现频…

allWebPlugin助力iWebOffice2015插件在高版本浏览器使用

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持谷歌、火狐等浏…

11-Django项目--Ajax请求二

目录 模版: demo_list.html perform_list.html 数据库操作: 路由: 视图函数: Ajax_data.py perform.py 模版: demo_list.html {% extends "index/index.html" %} {% load static %} # 未实现修改,删除操作{% block content %}<div class"container…

vue2 + dataV 组件问题

在使用 dataV 过程中&#xff0c;遇见 svg 动画不加载问题。 一、理想状态下&#xff1a; 二、开发中遇到的 加载不出来问题。 解决方案 在查找官方资料中&#xff0c;提到使用 key 可以解决方案。 1 绑定 key 2 改变 key 值 注意&#xff1a;一定要在 $nextTick 里面执…

理解论文笔记:基于AHP和模糊综合评价的无线传感器网络可维护性评估方法

作为一个研0的娃,这是我认真读的第一篇论文,想着笔记让自己能看懂。如有侵权,请联系删除。 I. INTRODUCTION 介绍 主要介绍了无线传感器网络可维护性研究的重要性和必要性,并对下面的各章进行了总结。 翻译:第二部分简要介绍了无线传感器网络的维护,并对影响系统的因素…

VS 在多线程中仅调试某个线程

调试多线程程序时&#xff0c;只想观察某个线程的运行情况&#xff1b; 但是&#xff0c;由于线程切换执行&#xff0c;会导致调试时焦点在几个代码块之间跳来跳去&#xff0c;故需要解决这个问题。 参考文章&#xff1a; C#使用线程窗口调试多线程程序。 1 打开线程窗口&…

【第15章】常见报错汇总(持续更新)ComfyUI基础入门教程

🔮概述 如果大家是一步步的跟随教程学到了这节,并且期间也自己动手尝试过一些工作流,会发现: ComfyUI是一个“经常会出问题”的软件,动辄就会有很难安装的节点,或者节点兼容问题,或者模型找不到,或者出图效果跟工作流作者的效果相去甚远的问题。 那么,有没有一劳永…

基于高度的纹理混合shader

基于高度的纹理混合shader 原文&#xff1a;基于高度的纹理混合shader - 知乎 (zhihu.com) 最近支持一个使用unity2021的项目&#xff0c;发现urp自带的Terrain/Lit shader已经自带高度混合了&#xff0c;看了下和我当初写的那个基本差不多&#xff0c;感觉稍微要比我的严谨一…

A股探底回升,跑出惊天大阳,你们知道为什么吗?

今天的A股&#xff0c;探底回升&#xff0c;让人惊呆了&#xff0c;你们知道是为什么吗&#xff1f;盘面上出现3个重要信号&#xff0c;一起来看看&#xff1a; 1、今天A股市场炸锅了&#xff0c;AI人工智能、国产软件、存储芯片迎来了涨停潮&#xff0c;惊呆了&#xff0c;科技…

阿里提出MS-Diffusion:一键合成你喜爱的所有图像元素,个性化生成新思路!

文本到图像生成模型的最新进展极大地增强了从文本提示生成照片级逼真图像的能力&#xff0c;从而增加了人们对个性化文本到图像应用的兴趣&#xff0c;尤其是在多主题场景中。然而&#xff0c;这些进步受到两个主要挑战的阻碍&#xff1a; 需要根据文本描述准确维护每个参考主题…

python--open()函数的使用(超详细)

在Python中&#xff0c;open() 函数用于打开文件&#xff0c;并返回文件对象&#xff0c;该对象可用于后续的文件操作&#xff0c;如读取或写入数据。open() 函数的基本语法如下&#xff1a; open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdT…

淘宝商铺电话怎么获取?使用爬虫工具采集

访问淘宝商铺是一个合法的行为&#xff0c;你可以使用爬虫工具来提取淘宝商铺的信息。下面是一个基本的Python程序示例&#xff0c;用于使用爬虫工具访问淘宝商铺&#xff1a; import requestsdef get_store_info(store_id):url fhttps://shop{id}.taobao.comresponse reque…

力扣:59. 螺旋矩阵 II(Java,模拟)

目录 题目描述示例 1&#xff1a;代码实现 题目描述 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5…

前端新手小白的第一个AI全栈项目---AI聊天室

前言 ok&#xff0c;大家好。- ̗̀(๑ᵔ⌔ᵔ๑)最近也是想做自己的第一个前后端分离的项目&#xff0c;刚好最近学了一点AI接口的实现。想着用接口做一个自己的ai聊天室并且尝试一下全栈式开发。中间真的解决了很多问题&#xff0c;也是成功之后也是想要将实现过程分享一下&a…

基于CNN卷积神经网络的MQAM调制识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 CNN模型结构 4.2 损失函数与优化 4.3 训练与测试 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff0…

d3dx9_42.dll找不到怎么正确处理?教学级修复d3dx9_42.dll的方法分享

d3dx9_42.dll找不到&#xff1f;别着急&#xff0c;这只是普普通通的dll文件找不到而已&#xff0c;它可能因为各种原因而导致丢失&#xff0c;我们只要直接对d3dx9_42.dll进行修复就可以了。下面我们一起来了解一下d3dx9_42.dll找不到的正确处理方法。 一.d3dx9_42.dll找不到是…

深度学习方法在谣言检测中的研究现状

摘要 管理社交媒体上的谣言&#xff0c;减少谣言对社会的危害。许多研究使用深度学习方法来检测开放网络中的谣言。为了从多个角度全面梳理谣言检测的研究现状&#xff0c;本文从特征选择、模型结构和研究方法三个角度分析了这一高度集中的工作。从特征选择的角度&#xff0c;将…

七天速通javaSE:第二天 基础:标识符与数据类型

文章目录 前言一、注释与标识符1. 注释2. 标识符2.1 标识符2.2 关键字 二、数据类型1. 语言类型2. 数据类型2.1 基本数据类型2.2引用数据类型 三、类型转换1. 自动转换2. 强制转换&#xff08;不建议&#xff09; 四、代码规范 前言 今天将学习Java语法的基础&#xff0c;认识…