菜鸟之路Day36一一Web开发综合案例(部门管理)

简介: 本文详细记录了基于Spring Boot的Web开发综合案例——部门管理功能的实现过程。从环境搭建到功能开发,涵盖数据库表设计、Spring Boot项目创建、依赖引入、配置文件设置以及Mapper、Service、Controller的基础结构构建。文章重点讲解了查询、删除、新增和修改部门信息的业务逻辑实现,遵循RESTful规范设计接口,并通过统一响应结果类`Result`优化前后端交互体验。借助Spring的IoC容器管理与MyBatis的SQL映射,实现了高效的数据操作与业务处理,最终完成部门管理的全功能开发。

菜鸟之路Day36一一Web开发综合案例(部门管理)

作者:blue

时间:2025.5.28

文章内容学习自黑马程序员BV1m84y1w7Tb

一.环境搭建

准备数据库表(dept,emp)

image-20250528225916683.png

创建springboot工程,引入对应的起步依赖(web,mybatis,mysql驱动,lombok)

image-20250528223012764.png

配置文件application.properties中引入mybatis的配置信息,准备对应的实体类

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306
spring.datasource.username=root
spring.datasource.password=1234

#配置mybatis的日志,指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

#开启mybatis的驼峰命名自动映射开关 a_column ----> aColumn
mybatis.configuration.map-underscore-to-camel-case=true

准备对应的Mapper,Service(接口),Controller基础结构

image-20250528225153603.png

二.开发规范

REST:表述性状态转换,它是一种软件架构风格

REST风格用url来定位资源,HTTP动词描述操作

REST风格
http://localhost:8080/users/1        GET:查询id为1的用户
http://localhost:8080/users            POST:新增用户
http://localhost:8080/users            PUT:修改用户
http://localhost:8080/users/1        DELETE:删除id为1的用户

REST是风格,是约定方式,约定不是规定,可以打破

描述模块的功能通常使用复数,也就是加s的格式来描述,表示此类资源,而非单个资源。如:users,emps,books.......

前后端交互统一响应结果Result

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result {
   
    private Integer code;//响应码 1代表成功;0代表失败
    private String msg;//响应信息 描述字符串
    private Object data;//返回的数据
    public static Result success() {
   //增删改 成功响应
        return new Result(1,"success",null);
    }

    public static Result success(Object data) {
   //查询 成功响应
        return new Result(1,"success",data);
    }

    public static Result error(String msg) {
   //失败响应
        return new Result(0,msg,null);
    }
}

三.部门管理

3.1查询

需求查询全部部门的信息

分析:首先Controller层应该先接收到前端请求,然后调用Service层的实体类对象,调用其中查询全部对象的方法来查询全部部门的信息。查询全部部门信息很显然是一个数据库操作,所以Service的实现类中应该调用Dao层的实体类对象,利用其中的查询,与数据库做交互,获得数据库中的数据。

下方的业务逻辑图很好的展示了整个过程的业务逻辑

实际业务逻辑过程

image-20250529202731301.png

DeptController

@Slf4j//使用这个注解可以获得一个logback的对象一一log可以用以记录日志
@RestController//这个注解会把返回给前端的值包装成HTTP响应体
public class DeptController {
   

    @Autowired
    private DeptService deptService;//依赖注入,获得一个deptService对象

    @GetMapping("/depts")
    public Result list(){
   
        log.info("查询全部部门数据");

        List<Dept> deptList= deptService.list();

        return new Result(1,"success",deptList);
    }
}

IoC 容器管理:IOC容器中的对象会被注册到 Spring 的应用上下文中,你可以通过依赖注入(如 @Autowired)直接使用它们,无需手动 new

DeptServiceImpl

@Service
public class DeptServiceImpl implements DeptService {
   

    @Autowired
    private DeptMapper deptMapper;//依赖注入获得一个dept对象

    @Override
    public List<Dept> list() {
   
        return deptMapper.list();
    }
}

@Service 注解是 Spring 框架中的一个组件注解,它的作用是告诉 Spring:“这个类是一个服务层组件,请在应用启动时自动创建它的实例,并将其作为 Bean 注册到 Spring 的 IoC 容器中”。这就很好的解释了为什么在Controller层可以直接获得deptService对象,因为IOC容器中已经有了deptService的bean。

DeptMapper

@Mapper
public interface DeptMapper {
   

    //查询全部部门
    @Select("select * from dept")//此处查询语句比较简单,采用注解方式来完成
    public List<Dept> list();
}

@Mapper 注解在运行时会为 DAO 层的接口自动生成代理实现类,并将其作为 Bean 注册到 Spring 的 IoC 容器中。

运行SpringBoot程序,发送请求,获得了全部部门的信息

image-20250530083221687.png

前后端联调

可以看到部门信息已经被加载到页面中了

image-20250530091702905.png

3.2删除

该功能的业务逻辑照上一业务并无大变化,依然是一个类似的过程

DeptController

    /*
    * 根据删除部门条目
    * */
    @DeleteMapping("/depts/{id}")
    public Result delete(@PathVariable Integer id){
   

        log.info("根据id删除部门:{}",id);

        deptService.delete(id);

        return Result.success();
    }

@PathVariable 是 Spring MVC 框架中的一个注解,用于从 URL 路径中提取变量值并绑定到控制器方法的参数上。它主要用于创建 RESTful API,使 URL 更加直观和灵活。

核心作用

  1. 路径变量绑定
    将 URL 中的动态部分(如 /{id})映射到方法参数。
  2. RESTful 支持
    支持创建符合 REST 风格的 API,例如通过 ID 查询资源:/users/{id}
  3. 类型自动转换
    自动将路径变量转换为方法参数的类型(如 LongInteger 等)。

DeptServiceImpl

    @Override
    public void delete(Integer id) {
   
        deptMapper.delete(id);
    }

DeptMapper

/*
* 删除部门
* */
@Delete("delete from dept where id = #{id}")
void delete(int id);

3.3新增

DeptController

    /*
    * 新增部门条目
    */
    @PostMapping("/depts")
    public Result add(@RequestBody Dept dept){
   
        log.info("新增部门");

        deptService.add(dept);

        return Result.success();
    }

@RequestBody 是 Spring MVC 框架中的一个注解,用于将 HTTP 请求体中的内容(如 JSON、XML 等)反序列化为 Java 对象。它主要用于处理 RESTful API 中的 POST、PUT 等需要传递复杂数据的请求。

核心作用

  1. 请求体解析
    将 HTTP 请求体中的数据(如 JSON 字符串)自动转换如 JSON 字符串)自动转换为 Java 对象。
  2. 类型适配
    支持多种消息转换器(如 Jackson、Gson),根据请求的 Content-Type 自动选择合适的转换器。
  3. 简化参数绑定
    无需手动解析请求体,直接获取对象实例。

DeptServiceImpl

    @Override
    public void add(Dept dept) {
   
        dept.setCreateTime(LocalDateTime.now());
        dept.setUpdateTime(LocalDateTime.now());
        deptMapper.add(dept);
    }

DeptMapper

    /*
    * 新增部门
    * */
    @Insert("insert into dept(name,create_time,update_time) values (#{name},#{createTime},#{updateTime})")
    void add(Dept dept);

优化Controller层的路径

一个完整的请求路径,应该是类上的@RequestMapping的value属性+方法上的@RequestMapping的value属性
image-20250530102158309.png

3.3修改

修改其实涉及到两步操作

一步是点击编辑时,要根据id来查询当前部门

一步是点击保存时,修改部门当前部门

根据id来查询当前部门

DeptController

    /*
    * 根据id查询部门信息
    * */
    @GetMapping("/{id}")
    public Result selectById(@PathVariable Integer id){
   
        log.info("根据id查询单个部门:{}",id);

        Dept dept = deptService.selectById(id);

        return Result.success(dept);
    }

DeptServiceImpl

    @Override
    public Dept selectById(Integer id) {
   
        return deptMapper.selectById(id);
    }

DeptMapper

    /*
    * 根据ID查询单个部门
    * */
    @Select("select * from dept where id = #{id}")
    Dept selectById(Integer id);

修改部门当前部门

DeptController

    /*
    * 修改部门信息
    * */
    @PutMapping
    public Result updateDept(@RequestBody Dept dept){
   
        log.info("修改部门");

        deptService.updateDept(dept);

        return Result.success();
    }

DeptServiceImpl

    @Override
    public void updateDept(Dept dept) {
   
        deptMapper.updateDept(dept);
    }

DeptMapper

    /*
    * 修改部门
    * */
    @Update("update dept set name=#{name} where id=#{id}")
    void updateDept(Dept dept);

至此部门管理的功能就全部实现

目录
相关文章
|
1月前
|
XML SQL 前端开发
菜鸟之路Day37一一Web开发综合案例(员工管理)
本文介绍了基于Web开发的员工管理综合案例,涵盖分页查询、条件分页查询、删除员工和新增员工四大功能模块。通过前后端交互,前端传递参数(如页码、每页记录数、查询条件等),后端使用MyBatis与PageHelper插件处理数据查询与操作。代码结构清晰,包括Controller层接收请求、Service层业务逻辑处理以及Mapper层数据访问,并结合XML动态SQL实现灵活的条件查询。此外,新增与删除功能分别通过POST与DELETE请求完成,确保系统功能完整且高效。
88 7
|
1月前
|
存储 前端开发 Java
菜鸟之路Day38一一Web开发综合案例(三)
本文介绍了Web开发中的文件上传与员工信息修改的综合案例,涵盖前端到后端的完整流程。重点讲解了阿里云OSS的集成,包括Bucket创建、密钥获取及SDK使用,并通过Spring Boot实现文件上传功能。同时,详细描述了员工信息查询与修改的操作逻辑,涉及Controller、Service和Mapper层代码实现。最后探讨了配置文件的优化,对比@Value与@ConfigurationProperties注解,展示了如何通过实体类批量注入配置参数,提升代码可维护性与灵活性。
65 1
|
2月前
|
Web App开发 前端开发 JavaScript
鸿蒙5开发宝藏案例分享---Web适配一多开发实践
这是一份实用的鸿蒙Web多设备适配开发指南,针对开发者在不同屏幕尺寸下的布局难题提供了解决方案。文章通过三大法宝(相对单位、媒体查询和窗口监听)详细介绍如何实现智能适配,并提供了多个实战案例,如宫格布局、对话框变形和自适应轮播图等。此外,还分享了调试技巧及工具推荐,帮助开发者快速上手并优化性能。最后鼓励读者实践探索,并提示更多官方资源等待发现。
|
11月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
463 1
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
|
10月前
|
前端开发 机器人 测试技术
【RF案例】Web自动化测试弹窗处理
在进行Web自动化测试时,常会遇到不同类型的弹窗,如ajax、iframe、新窗口及alert/Confirm等。这些弹窗可通过Selenium进行定位与处理。其中,ajax弹窗直接定位处理;iframe需先选中再操作;新窗口类似iframe处理;而alert/Confirm则需特殊方法应对。在Robot Framework中,需先定义并获取窗口后使用特定关键字处理。此外,还有部分div弹窗需在消失前快速定位。希望本文能帮助大家更好地处理各类弹窗。
195 6
【RF案例】Web自动化测试弹窗处理
|
10月前
|
前端开发 数据安全/隐私保护
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
本文档详细介绍了HTML表单的多种元素及其用法,包括下拉菜单(`&lt;select&gt;` 和 `&lt;option&gt;`)、文本域(`&lt;textarea&gt;`)、标签解释(`&lt;label&gt;`)、各类按钮(`&lt;button&gt;`)及表单重置功能、无语义布局标签(`&lt;div&gt;` 和 `&lt;span&gt;`)以及字符实体的应用。此外,还提供了一个完整的注册信息表单案例,涵盖个人信息、教育经历和工作经历等部分,展示了如何综合运用上述元素构建实用的表单。
170 6
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
|
10月前
|
前端开发
【前端web入门第五天】03 清除默认样式与外边距问题【附综合案例产品卡片与新闻列表】
本文档详细介绍了CSS中清除默认样式的方法,包括清除内外边距、列表项目符号等;探讨了外边距的合并与塌陷问题及其解决策略;讲解了行内元素垂直边距的处理技巧;并介绍了圆角与盒子阴影效果的实现方法。最后通过产品卡片和新闻列表两个综合案例,展示了所学知识的实际应用。
248 11
|
10月前
|
前端开发
前端web入门第四天】03 显示模式+综合案例热词与banner效果
本文档介绍了HTML中标签的三种显示模式:块级元素、行内元素与行内块元素,并详细解释了各自的特性和应用场景。块级元素独占一行,宽度默认为父级100%,可设置宽高;行内元素在同一行显示,尺寸由内容决定,设置宽高无效;行内块元素在同一行显示,尺寸由内容决定,可设置宽高。此外,还提供了两个综合案例,包括热词展示和banner效果实现,帮助读者更好地理解和应用这些显示模式。
103 6
|
10月前
|
JavaScript 前端开发
【前端web入门第一天】03 综合案例 个人简介与vue简介
该网页采用“从上到下,先整体再局部”的制作思路,逐步分析并编写代码实现个人简介页面。内容涵盖尤雨溪的背景、学习经历及主要成就,同时介绍其开发的Vue.js框架特点。代码结构清晰,注重细节处理,如使用快捷键提高效率,预留超链接位置等,确保最终效果符合预期。
190 7
|
11月前
|
SQL 缓存 自然语言处理
实战案例1:基于C语言的Web服务器实现。
实战案例1:基于C语言的Web服务器实现。