news 2026/5/26 6:51:35

Maven 项目实战入门之--学生管理系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Maven 项目实战入门之--学生管理系统

说明:

本文由人机协作生成,作者提供主要思路,借助 AI 通过多轮迭代逐步优化生成。

核心思路:

体验“在AI辅助下,从零创建 Maven 项目,引入一个第三方库,并跑通一个核心功能”的全流程。

原始项目90分钟极简版核心目标技术栈极简版功能要求极简版
学生管理系统连接数据库,执行一次插入和查询仅保留 SQLite JDBC1. 创建数据库和一张学生表。2. 插入一条学生数据。3. 查询并打印所有学生。可通过AI生成测试数据。

Maven 项目的优势

Maven 是 Java 项目的构建 + 依赖管理工具,对比以往手动建项目、手动下载 jar 包的方式,Maven 项目为编程提供了太多便利性。只需在 pom.xml 里写几行依赖配置,Maven 自动就会主动完成:

  1. 从中央仓库下载对应版本的 jar 包;
  2. 自动下载 “依赖的依赖”(比如 sqlite-jdbc 依赖的 slf4j-api);
  3. 所有依赖统一存在本地仓库,其他项目可复用,不用重复下载。

而且还可以统一编译和运行环境,避免版本冲突。比如 pom.xml 里配置了 JDK 21 的编译规则:

<properties> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> </properties>

以及,方便我们的拓展和团队的协作。

SQLite 基础知识

一、SQLite 的特点

首先,我们先来对此次项目的核心工具 -- SQLite 做一个基础认识:

SQLite 是一款轻量级、嵌入式、零配置的关系型数据库,不用装服务器,一个文件就是一个数据库,适合学习、小型项目;而我们常见的 MySQL 需要先开服务器,适合大规模场景。

多方对比:

特性SQLiteMySQL/PostgreSQL
部署方式嵌入式(无独立服务进程)客户端 / 服务端(需启动数据库服务)
配置难度零配置(无需安装、无需账号密码)需安装、配置端口 / 账号 / 权限
数据存储单文件(比如此次项目的 student.db文件)多文件 / 目录存储(分散在服务器)
适用场景本地小型应用、嵌入式设备、测试大型网站、高并发服务、企业系统

二、SQLite 核心概念

1. 数据库文件(.db/.sqlite)

1)项目里的 student.db 就是一个完整的 SQLite 数据库,所有表、数据都存在这个文件里。
2)删除这个文件相当于清空整个数据库,重新运行代码会自动重建空文件。

2. 表(Table)

1)创建的 student 表是数据的容器,类似 Excel 里的工作表;
2)表由“字段(列)+ 数据行”组成,比如 student 表的字段是 id / name / age / className。

3. 字段(Column)和数据类型

SQLite 是 “弱类型” 数据库(比 MySQL 灵活),常用字段类型如下:

类型用途项目示例
INTEGER整数(ID、年龄等)id(自增主键)、age
TEXT文本(字符串)name、className
REAL浮点数(小数)比如 score(成绩)
BLOB二进制数据(图片等)新手很少用

4. 主键(PRIMARY KEY)

1)主键是表中唯一标识一行数据的字段(比如 id),保证每条数据不重复;
2)此次项目里所使用的 AUTOINCREMENT 是 SQLite 的自增特性,插入数据时不用手动填 ID,数据库会自动生成 1、2、3…

三、SQLite 常用的 SQL 语法

1. 表的创建(CREATE TABLE)

-- 基础语法 CREATE TABLE IF NOT EXISTS 表名 ( 字段名1 类型 约束, 字段名2 类型 约束, ... ); -- 示例:student表 CREATE TABLE IF NOT EXISTS student ( id INTEGER PRIMARY KEY AUTOINCREMENT, -- 自增主键 name TEXT NOT NULL, -- 非空(姓名不能为空) age INTEGER, className TEXT );

注意:

1)IF NOT EXISTS:避免重复创建表(虽然运行多次代码也不会报错)。
2)NOT NULL:约束字段不能为空(比如姓名必须填,年龄可选)。

2. 数据的插入(INSERT)

-- 基础语法(自增ID不用填) INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...); -- 示例:插入张三的信息 INSERT INTO student (name, age, className) VALUES ('张三', 20, '网安2411');

3. 数据的查询(SELECT)

-- 查询所有字段 SELECT * FROM 表名; -- 示例:查所有学生 SELECT * FROM student; -- 条件查询(拓展):查网安2411班的学生 SELECT * FROM student WHERE className = '网安2411'; -- 排序查询(拓展):按年龄升序排列 SELECT * FROM student ORDER BY age ASC;

4. 数据的修改(UPDATE,拓展)

-- 基础语法 UPDATE 表名 SET 字段1=新值 WHERE 条件; -- 示例:把张三的年龄改成21 UPDATE student SET age=21 WHERE name='张三';

5. 数据的删除(DELETE,拓展)

-- 基础语法 DELETE FROM 表名 WHERE 条件; -- 示例:删除ID为1的学生 DELETE FROM student WHERE id=1; -- 清空表(保留表结构) DELETE FROM student;

注意事项:手写 ID 容易出现主键冲突的错误,使用自增 ID 可以很好的规避掉这个问题。

代码展示

一、项目层级结构

二、代码

1. Main.java 文件

package jmu.net; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Scanner; /** * 学生管理系统 */ public class Main { // SQLite数据库地址 private static final String DB_URL = "jdbc:sqlite:student.db"; // 全局扫描器(避免重复创建) private static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { // 1. 创建学生表 createStudentTable(); // 2. 控制台动态添加学生(循环添加,支持多次输入) addStudentByConsole(); // 3. 查询并打印所有学生 queryAllStudents(); // 关闭扫描器 scanner.close(); } /** * 创建学生表(ID自增) */ private static void createStudentTable() { String createSql = "CREATE TABLE IF NOT EXISTS student (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT NOT NULL," + "age INTEGER," + "className TEXT)"; try (Connection conn = DriverManager.getConnection(DB_URL); Statement stmt = conn.createStatement()) { stmt.execute(createSql); System.out.println("✅ 学生表创建/加载成功!"); } catch (SQLException e) { System.err.println("❌ 创建表失败:" + e.getMessage()); } } /** * 控制台动态输入学生信息并添加 */ private static void addStudentByConsole() { System.out.println("\n===== 开始添加学生信息 ====="); while (true) { // 1. 输入姓名 System.out.print("请输入学生姓名(输入'q'退出添加):"); String name = scanner.nextLine().trim(); // 退出条件:输入q/Q if ("q".equalsIgnoreCase(name)) { System.out.println("✅ 退出学生添加流程!"); break; } // 姓名不能为空 if (name.isEmpty()) { System.err.println("❌ 姓名不能为空,请重新输入!"); continue; } // 2. 输入年龄(处理非数字异常) int age = 0; while (true) { System.out.print("请输入学生年龄:"); String ageStr = scanner.nextLine().trim(); try { age = Integer.parseInt(ageStr); if (age <= 0 || age > 100) { System.err.println("❌ 年龄需在1-100之间,请重新输入!"); continue; } break; // 年龄输入正确,退出循环 } catch (NumberFormatException e) { System.err.println("❌ 年龄必须是数字,请重新输入!"); } } // 3. 输入班级 System.out.print("请输入学生班级:"); String className = scanner.nextLine().trim(); if (className.isEmpty()) { className = "未填写"; // 班级为空时默认值 } // 4. 插入数据 insertStudent(name, age, className); System.out.println("------------------------\n"); } } /** * 插入学生数据(底层方法) */ private static void insertStudent(String name, int age, String className) { String insertSql = "INSERT INTO student (name, age, className) VALUES (?, ?, ?)"; try (Connection conn = DriverManager.getConnection(DB_URL); PreparedStatement pstmt = conn.prepareStatement(insertSql)) { pstmt.setString(1, name); pstmt.setInt(2, age); pstmt.setString(3, className); pstmt.executeUpdate(); System.out.println("✅ 学生[" + name + "]添加成功!"); } catch (SQLException e) { System.err.println("❌ 插入数据失败:" + e.getMessage()); } } /** * 查询所有学生并打印 */ private static void queryAllStudents() { String querySql = "SELECT * FROM student"; try (Connection conn = DriverManager.getConnection(DB_URL); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(querySql)) { System.out.println("\n===== 所有学生信息 ======"); boolean hasData = false; while (rs.next()) { hasData = true; int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); String className = rs.getString("className"); System.out.printf("ID:%d,姓名:%s,年龄:%d,班级:%s%n", id, name, age, className); } if (!hasData) { System.out.println("暂无学生数据"); } } catch (SQLException e) { System.err.println("❌ 查询数据失败:" + e.getMessage()); } } }

2. 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>jmu.net</groupId> <artifactId>StudentManagement</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 统一SLF4J版本,避免冲突 --> <slf4j.version>1.7.36</slf4j.version> </properties> <!-- 引入依赖 --> <dependencies> <!-- SQLite JDBC依赖 --> <dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.45.2.0</version> </dependency> <!-- SLF4J简单实现,消除日志提示 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>${slf4j.version}</version> <scope>runtime</scope> <!-- 仅运行时生效,不影响编译 --> </dependency> </dependencies> <!-- 添加编译插件 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>21</source> <target>21</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>

运行结果展示

一、控制台输出

二、student.db 文件展示

学习心得

其实实验做下来的最大感触就是 Maven 项目的便利性。在创建项目的时候,它会自动的帮我匹配下载需要的资源包、配置文件、依赖。pom.xml 则是 Maven 项目的核心配置文件,简单理解的话,它是 Maven 管理项目的 “说明书”,告诉 Maven 这个项目的“身份、依赖、编译规则、打包方式”等关键信息,编程过程中只用在意核心功能的构建。这次实验让我切实感受到 Maven 在项目管理上的优势,后续希望能进一步尝试 Maven 的多人协作模式

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 4:30:15

Langchain-Chatchat结合ELK构建日志分析平台

Langchain-Chatchat 结合 ELK 构建智能日志分析平台 在现代企业 IT 环境中&#xff0c;一个服务异常往往伴随着成千上万行日志输出。运维工程师面对的不再是单一系统的简单报错&#xff0c;而是微服务架构下跨多个模块、层层嵌套的日志洪流。传统的“登录 Kibana → 写 DSL 查询…

作者头像 李华
网站建设 2026/5/25 18:57:34

计算机就业卷疯了!AI 抢岗 + 红海扎堆,年轻人还能找到工作?

现在学计算机的年轻人&#xff0c;已经找不到工作了? 近几年的就业市场&#xff0c;开始进入了白热化的竞争阶段。年轻人的学历含金量&#xff0c;也已经有了新的排序。 “过去大家只要毕业于一本大学&#xff0c;便等于有了求职底牌。后来大公司招人的最低门槛&#xff0c;变…

作者头像 李华
网站建设 2026/5/26 0:55:31

重庆市万州区综合交通体系规划(2021—2035 年)(公开版) 2025

《重庆市万州区综合交通体系规划&#xff08;2021—2035 年&#xff09;》围绕万州区交通发展的现状、目标与路径展开全面规划&#xff0c;核心内容如下&#xff1a;一、规划背景与核心目标背景&#xff1a;立足长江经济带、成渝地区双城经济圈建设等国家战略&#xff0c;响应万…

作者头像 李华
网站建设 2026/5/25 8:24:55

【毕业设计】SpringBoot+Vue+MySQL MVC自习室管理和预约系统平台源码+数据库+论文+部署文档

摘要 随着高校扩招和教育信息化的快速发展&#xff0c;自习室资源紧张和管理效率低下的问题日益突出。传统自习室管理依赖人工登记和纸质记录&#xff0c;不仅效率低下&#xff0c;还容易出现座位冲突、资源浪费等问题。为了解决这一问题&#xff0c;开发一套高效、智能的自习室…

作者头像 李华
网站建设 2026/5/26 4:30:20

SpringBoot+Vue 影院购票系统管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着互联网技术的快速发展和数字化服务的普及&#xff0c;传统影院购票方式已无法满足现代消费者的需求。线下购票存在排队时间长、座位选择受限、信息不对称等问题&#xff0c;而线上购票系统能够提供更高效、便捷的服务体验。影院购票系统管理平台的开发旨在解决这些问题…

作者头像 李华
网站建设 2026/5/26 2:25:51

智能体在车联网中的应用:第8天 核心工具链与仿真世界:Git与代码版本管理——车联网开发的协作基石

引言&#xff1a;一行代码引发的“灾难”与版本控制的救赎 想象一下这个在车联网开发中可能发生的场景&#xff1a;经过一周的奋战&#xff0c;你终于将激光雷达点云聚类算法的准确率从87%提升到了92%。为了追求极致&#xff0c;你决定尝试一个更激进的特征提取方法。几番修改后…

作者头像 李华