此项目为博主JAVAEE课设项目,仅供参考,希望能够帮助其他正在学习JAVA的小伙伴。如果有错误或者写的不好的地方,请多多指教。
项目运行后,打开浏览器访问 localhost:8080/login 即可
目录
开发工具和环境
功能说明
项目结构
编辑
操作步骤
1.创建数据库
(一)创建数据库
(二)创建数据表
(三)插入数据(可选)
2.创建可视化界面
(一)登录界面
(二)主页界面
(三)增加界面
(四)修改界面
3.创建JAVA后端功能
(一)创建实体类
(二)创建Dao层
(三)创建Service层
(四)创建Controller层
源码
开发工具和环境
1.IntelliJ IDEA 2024.2.1
2.MySQL80
3.jdk 1.8
功能说明
实现学生信息的增,删,改,查,以及导出功能
项目结构
controller包 ------ 存放控制层代码
service包 ------ 存放业务层代码
dao包 ------ 存放持久层代码
entity包 ------ 存放实体类代码
mapper包 ------ 存放Mapper映射文件
static.css目录 ------ 存放样式表
templates目录 ------ 存放前端页面代码
application.properties ------ 项目配置文件
appliation.yml ------ 项目配置文件
操作步骤
1.创建数据库
(一)创建数据库
CREATE database sb_jsp_ems;(二)创建数据表
use sb_jsp_ems; CREATE TABLE `t_user` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', `username` varchar(50) NOT NULL COMMENT '用户名(唯一)', `password` varchar(60) NOT NULL COMMENT '加密后的密码', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ); CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(60) NOT NULL, `age` int DEFAULT NULL, `gender` char(10) DEFAULT NULL, `birthday` datetime DEFAULT NULL, PRIMARY KEY (`id`) );(三)插入数据(可选)
INSERT INTO t_user (username, password) VALUES('admin','123456'); INSERT INTO user (name, age, gender, birthday) VALUES ('张伟', 28, '男', '1995-07-12 09:15:00'), ('王芳', 35, '女', '1988-11-23 14:45:00'), ('李强', 22, '男', '2001-03-05 20:30:00'), ('刘洋', 30, '女', '1993-01-17 11:00:00'), ('陈杰', 40, '男', '1983-05-29 08:20:00'), ('杨敏', 26, '女', '1997-10-10 16:10:00'), ('赵磊', 33, '男', '1990-04-02 13:55:00'), ('黄娜', 29, '女', '1994-12-08 19:05:00'), ('周斌', 31, '男', '1992-06-18 07:40:00'), ('吴静', 24, '女', '1999-02-25 22:25:00');2.创建可视化界面
因篇幅限制,这里只展示前端页面,感兴趣的小伙伴可以下载源码查看
(一)登录界面
(二)主页界面
(三)增加系统用户界面
(四)增加学生信息界面
(五)修改学生信息界面
3.创建JAVA后端功能
(一)创建实体类
创建系统用户类
@Data @ToString @Accessors(chain = true) public class User { private Integer id; // 序号 private String username; // 用户姓名 private String password; // 用户密码 }创建学生类
@Data @ToString @Accessors(chain = true) public class Stu { private Integer id; // 编号 private String name; // 姓名 private String gender; // 性别 private Integer age; // 年龄 }(二)创建Dao层
Dao层本文使用的是Mybatis,需要在Dao包中创建数据库操作函数的接口,并且在mapper中的映射文件中完成相关数据库操作语句。这里仅展示其中一个。
函数接口(StuDao)
public interface StuDAO { //查询所有的方法 List<Stu> findAll(); //保存学生的方法 void save(Stu emp); //删除学生的方法 void delete(Integer id); //根据id查询学生信息 Stu findById(Integer id); //更新学生信息 void update(Stu stu); }映射文件(StuDAOMapper.xml)
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.sjj.dao.StuDAO"> <!--查询所有--> <select id="findAll" resultType="com.sjj.entity.Stu"> select id,name,age,gender from user </select> <!--保存学生--> <insert id="save" parameterType="com.sjj.entity.Stu"> insert into user (id, name, age, gender) values (#{id}, #{name}, #{age}, #{gender}) </insert> <!--删除学生--> <delete id="delete" parameterType="Integer"> delete from user where id = #{id} </delete> <!--根据id查询学生信息--> <select id="findById" parameterType="Integer" resultType="com.sjj.entity.Stu"> select id,name,age,gender from user where id = #{id} </select> <!--更新的实现--> <update id="update" parameterType="com.sjj.entity.Stu"> update user set name=#{name},age=#{age},gender=#{gender} where id = #{id} </update> </mapper>(三)创建Service层
Service层主要负责业务逻辑的处理和管理。Service层可以调用Dao层中的函数来实现相关功能。受篇幅限制,这里只展示其中一个。
@Service注解表示这是一个服务层组件
@Transactional 是声明式事务管理注解
@Autowired注解是从IOC容器中自动装配对象,避免手动创建对象
@Service @Transactional public class StuServiceImpl implements StuService { @Autowired private StuDAO stuDAO; @Override public void update(Stu emp) { stuDAO.update(emp); } @Override public Stu findById(Integer id) { return stuDAO.findById(id); } @Override public void delete(Integer id) { stuDAO.delete(id); } @Override public void save(Stu emp) { stuDAO.save(emp); } @Override public List<Stu> findAll() { return stuDAO.findAll(); } }(四)创建Controller层
Controller层主要负责接收用户请求并返回响应Service层可以调用Dao层中的函数来实现相关功能。受篇幅限制,这里只展示其中一个。
@Controller注解表示这是一个控制层组件
@Transactional 是声明式事务管理注解
@Autowired注解是从IOC容器中自动装配对象,避免手动创建对象
@Controller public class StuController { @Autowired private StuService stuService; // ====================== 显示添加学生页面 ====================== @GetMapping("/emp/addstu") public String showAddStudentPage() { return "emp/addstu"; // 直接返回模板,无需重定向 } // ====================== 处理添加学生请求 ====================== @PostMapping("/emp/addstu") public String addStudent(Stu stu, RedirectAttributes redirectAttributes) { try { stuService.save(stu); redirectAttributes.addFlashAttribute("success", "学生添加成功"); return "redirect:/emp/student"; // 跳转到学生列表页 } catch (Exception e) { redirectAttributes.addFlashAttribute("error", "添加失败: " + e.getMessage()); return "redirect:/emp/addstu"; // 失败时返回添加页 } } @GetMapping("/emp/student") public String listStudents( @RequestParam(value = "id", required = false) Integer id, // 接收可选的 id 参数 Model model) { if (id != null) { // 按 id 查询学生 Stu student = stuService.findById(id); if (student != null) { // 将单个学生包装为列表,保持前端模板兼容性 model.addAttribute("students", Collections.singletonList(student)); } else { // 未找到时的错误提示 model.addAttribute("error", "未找到ID为 " + id + " 的学生"); model.addAttribute("students", Collections.emptyList()); } } else { // 未传 id 时查询全部学生 model.addAttribute("students", stuService.findAll()); } return "emp/student"; } // ====================== 处理修改学生请求 ====================== @GetMapping("/emp/updatestu") public String showUpdatePage(@RequestParam("id") Integer id, Model model) { Stu stu = stuService.findById(id); model.addAttribute("student", stu); return "emp/updatestu"; } @PostMapping("/emp/updatestu") public String updStudent(Stu stu, RedirectAttributes redirectAttributes) { try { stuService.update(stu); redirectAttributes.addFlashAttribute("success", "学生修改成功"); } catch (Exception e) { redirectAttributes.addFlashAttribute("error", "修改失败: " + e.getMessage()); return "redirect:/emp/updatestu?id=" + stu.getId(); } return "redirect:/emp/student"; } @GetMapping("/emp/delete/{id}") public String deleteStudent(@PathVariable("id") Integer id, RedirectAttributes redirectAttributes) { try { stuService.delete(id); redirectAttributes.addFlashAttribute("success", "学生删除成功"); } catch (Exception e) { redirectAttributes.addFlashAttribute("error", "删除失败: " + e.getMessage()); } return "redirect:/emp/student"; } @GetMapping("/emp/export") public void exportToExcel(HttpServletResponse response) throws Exception { // 1. 设置响应头 response.setContentType( "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); String fileName = URLEncoder.encode("学生信息.xlsx", "UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); // 2. 从数据库查询数据 List<Stu> list = stuService.findAll(); // 3. 使用 POI 创建 Excel Workbook wb = new XSSFWorkbook(); Sheet sheet = wb.createSheet("学生信息"); // 3.1 写表头 Row header = sheet.createRow(0); header.createCell(0).setCellValue("ID"); header.createCell(1).setCellValue("姓名"); header.createCell(2).setCellValue("性别"); header.createCell(3).setCellValue("年龄"); // 3.2 写数据行 for (int i = 0; i < list.size(); i++) { Stu s = list.get(i); Row row = sheet.createRow(i + 1); row.createCell(0).setCellValue(s.getId()); row.createCell(1).setCellValue(s.getName()); row.createCell(2).setCellValue(s.getGender()); row.createCell(3).setCellValue(s.getAge()); } // 4. 输出到客户端 wb.write(response.getOutputStream()); wb.close(); } }源码
GitHub:https://github.com/Sjz12345/Student-Manage-System.git
Java开发的就业市场正在经历结构性调整,竞争日益激烈
传统纯业务开发岗位(如仅完成增删改查业务的后端工程师)的需求,特别是入门级岗位,正显著萎缩。随着企业技术需求升级,市场对Java人才的要求已从通用技能转向了更深入的领域经验(如云原生、微服务)或前沿的AI集成能力。这也导致岗位竞争加剧,在一、二线城市,求职者不仅面临技术内卷,还需应对学历与项目经验的高门槛。
大模型为核心的AI领域正展现出前所未有的就业热度与人才红利
2025年,AI相关新发岗位数量同比激增543%,单月增幅最高超过11倍,大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡,议价能力极强,跳槽薪资涨幅可达30%-50%。值得注意的是,市场并非单纯青睐算法研究员,而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师,在向“Java+大模型”复合人才转型时拥有独特优势,成为企业竞相争夺的对象,其薪资天花板也远高于传统Java岗位。
说真的,这两年看着身边一个个搞Java、C++、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。
结果GPT、DeepSeek火了之后,整条线上的人都开始有点慌了,大家都在想:“我是不是要学大模型,不然这饭碗还能保多久?”
先给出最直接的答案:一定要把现有的技术和大模型结合起来,而不是抛弃你们现有技术!掌握AI能力的Java工程师比纯Java岗要吃香的多。
即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地!大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇!
如何学习AGI大模型?
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享**
一、2025最新大模型学习路线
一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。
我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。
L1级别:AI大模型时代的华丽登场
L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。
L2级别:AI大模型RAG应用开发工程
L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。
L3级别:大模型Agent应用架构进阶实践
L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。
L4级别:大模型微调与私有化部署
L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。
整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。
二、大模型经典PDF书籍
书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)
三、大模型视频教程
对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。
四、大模型项目实战
学以致用,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。
五、大模型面试题
面试不仅是技术的较量,更需要充分的准备。
在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享