菜鸟之路Day36一一Web开发综合案例(部门管理)
作者:blue
时间:2025.5.28
文章目录
- 菜鸟之路Day36一一Web开发综合案例(部门管理)
- 一.环境搭建
- 二.开发规范
- 三.部门管理
- 3.1查询
- 3.2删除
- 3.3新增
- 3.3修改
- 根据id来查询当前部门
- 修改部门当前部门
文章内容学习自黑马程序员BV1m84y1w7Tb
一.环境搭建
准备数据库表(dept,emp)
创建springboot工程,引入对应的起步依赖(web,mybatis,mysql驱动,lombok)
配置文件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基础结构
二.开发规范
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层的实体类对象,利用其中的查询,与数据库做交互,获得数据库中的数据。
下方的业务逻辑图很好的展示了整个过程的业务逻辑
实际业务逻辑过程
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程序,发送请求,获得了全部部门的信息
前后端联调
可以看到部门信息已经被加载到页面中了
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 更加直观和灵活。
核心作用
- 路径变量绑定
将 URL 中的动态部分(如/{id}
)映射到方法参数。 - RESTful 支持
支持创建符合 REST 风格的 API,例如通过 ID 查询资源:/users/{id}
。 - 类型自动转换
自动将路径变量转换为方法参数的类型(如Long
、Integer
等)。
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 等需要传递复杂数据的请求。
核心作用
- 请求体解析
将 HTTP 请求体中的数据(如 JSON 字符串)自动转换如 JSON 字符串)自动转换为 Java 对象。 - 类型适配
支持多种消息转换器(如 Jackson、Gson),根据请求的Content-Type
自动选择合适的转换器。 - 简化参数绑定
无需手动解析请求体,直接获取对象实例。
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属性
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);
至此部门管理的功能就全部实现