菜鸟之路Day37一一Web开发综合案例(员工管理)

简介: 本文介绍了基于Web开发的员工管理综合案例,涵盖分页查询、条件分页查询、删除员工和新增员工四大功能模块。通过前后端交互,前端传递参数(如页码、每页记录数、查询条件等),后端使用MyBatis与PageHelper插件处理数据查询与操作。代码结构清晰,包括Controller层接收请求、Service层业务逻辑处理以及Mapper层数据访问,并结合XML动态SQL实现灵活的条件查询。此外,新增与删除功能分别通过POST与DELETE请求完成,确保系统功能完整且高效。

菜鸟之路Day37一一Web开发综合案例(员工管理)

作者:blue

时间:2025.5.30

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

1.员工列表查询

前端传递给后端的参数:

当前页码:page

每页展示记录数:pageSize

后端给前端返回的数据:

数据列表:List

select * from emp limit ?,?;
AI 代码解读

总记录数:total

select count(*) from emp;
AI 代码解读

由于后端要返回两个参数,所以我们在这里对实体类做一个包装

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageBean {
   
    private Long total;
    private List rows;
}
AI 代码解读

image-20250531112256592.png

EmpController

@Slf4j
@RestController
public class EmpController {
   

    @Autowired
    EmpService empService;

    @GetMapping("/emps")
    public Result page(@RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10")  Integer pageSize)
    {
   
        log.info("分页查询,页码{},条目数{}",page,pageSize);

        PageBean pageBean = empService.page(page,pageSize);

        return Result.success(pageBean);
    }
}
AI 代码解读

EmpServiceImpl

@Service
public class EmpServiceImpl implements EmpService {
   

    @Autowired
    private EmpMapper empMapper;
    /*
    * 进行分页查询
    * */
    @Override
    public PageBean page(Integer page, Integer pageSize) {
   
        //查询总数
        Long total = empMapper.count();

        //分页查询
        Integer start = (page - 1) * pageSize;
        List<Emp> list = empMapper.page(start, pageSize);

        return new PageBean(total, list);
    }
}
AI 代码解读

EmpMapper

@Mapper
public interface EmpMapper {
   

    /*
    * 查询员工信息记录数
    * */
    @Select("select count(*) from emp")
    Long count();

    /*
    * 分页查询
    * */
    @Select("Select * from emp limit #{start},#{pageSize}")
    List<Emp> page(Integer start, Integer pageSize);
}
AI 代码解读

以上就是分页查询的基础代码,但其中需要用到两条SQL语句,这个分页查询的业务功能比较常见,代码也比较固定,所以我们可以使用PageHelper这个插件来简化代码。

引入PageHelper依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.6</version>
</dependency>
AI 代码解读

EmpMapper

/*
* 查询全部员工
* */
@Select("select * from emp")
List<Emp> list();
AI 代码解读

EmpServiceImpl

@Override
public PageBean page(Integer page, Integer pageSize) {
   
    //1.设置分页参数
    PageHelper.startPage(page, pageSize);

    //2.执行查询
    List<Emp> empList = empMapper.list();
    Page<Emp> p = (Page<Emp>) empList;

    //封装PageBean对象
    return new PageBean(p.getTotal(), p.getResult());
}
AI 代码解读

2.条件分页查询

接口文档中要求我们是可以支持条件分页查询的,所以这部分我们来实现这个功能

image-20250531162819352.png

首先是Controller层,我们需要将前端传递过来的数据都接收一下

    @GetMapping("/emps")
    public Result page(@RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10")  Integer pageSize,
                       String name, Short gender,
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                       @DateTimeFormat(pattern = "yyyy-MM-dd")LocalDate end)
    {
   
        log.info("分页查询,页码{},条目数{},姓名{},性别{},开始时间{},结束时间{}",page,pageSize,name,gender,begin,end);

        PageBean pageBean = empService.page(page,pageSize,name,gender,begin,end);

        return Result.success(pageBean);
    }
AI 代码解读

然后是Service层,同样进行修改

@Override
public PageBean page(Integer page, Integer pageSize, String name, Short gender,
                     LocalDate begin, LocalDate end) {
   
    //1.设置分页参数
    PageHelper.startPage(page, pageSize);

    //2.执行查询
    List<Emp> empList = empMapper.list(name,gender,begin,end);
    Page<Emp> p = (Page<Emp>) empList;

    //封装PageBean对象
    return new PageBean(p.getTotal(), p.getResult());
}
AI 代码解读

然后是Mapper层,条件查询需要动态SQL,所以我们在这里使用XML映射

List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
AI 代码解读
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.bluening.talis_web_demo.mapper.EmpMapper">
    <select id="list" resultType="com.bluening.talis_web_demo.pojo.Emp">
        select *
        from emp
        <where>
            <if test="name != null and name != ''">
                name like concat('%', #{name}, '%')
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
            <if test="begin != null and end != null">
                and entry_date between #{begin} and #{end}
            </if>
        </where>
        order by update_time desc
    </select>
</mapper>
AI 代码解读

3.删除员工

EmpController

@DeleteMapping("/emps/{ids}")
public Result delete(@PathVariable("ids") List<Integer> ids) {
   
    log.info("删除员工{}",ids);
    empService.delete(ids);
    return Result.success();
}
AI 代码解读

EmpService

@Override
public void delete(List<Integer> ids) {
   
    empMapper.delete(ids);
}
AI 代码解读

EmpMapper

void delete(List<Integer> ids);
AI 代码解读

XML映射

<!--删除员工-->
<delete id="delete">
    delete from emp where id in
    <foreach collection="ids" item="id" separator="," open="(" close=")">
        #{id}
    </foreach>
</delete>
AI 代码解读

4.新增员工

EmpController

@PostMapping("/emps")
public Result save(@RequestBody Emp emp) {
   
    log.info("新增员工");
    empService.save(emp);
    return Result.success();
}
AI 代码解读

EmpService

@Override
public void save(Emp emp) {
   
    emp.setCreateTime(LocalDateTime.now());
    emp.setUpdateTime(LocalDateTime.now());
    empMapper.insert(emp);
}
AI 代码解读

EmpMapper

    @Insert("insert into emp(username,name,gender,image,job,entry_date,dept_id,create_time,update_time)" +
            "values (#{username},#{name},#{gender},#{image},#{job},#{entryDate},#{deptId},#{createTime},#{updateTime})")
    void insert(Emp emp);
AI 代码解读
目录
打赏
0
7
7
0
174
分享
相关文章
菜鸟之路Day36一一Web开发综合案例(部门管理)
本文详细记录了基于Spring Boot的Web开发综合案例——部门管理功能的实现过程。从环境搭建到功能开发,涵盖数据库表设计、Spring Boot项目创建、依赖引入、配置文件设置以及Mapper、Service、Controller的基础结构构建。文章重点讲解了查询、删除、新增和修改部门信息的业务逻辑实现,遵循RESTful规范设计接口,并通过统一响应结果类`Result`优化前后端交互体验。借助Spring的IoC容器管理与MyBatis的SQL映射,实现了高效的数据操作与业务处理,最终完成部门管理的全功能开发。
99 12
菜鸟之路Day38一一Web开发综合案例(三)
本文介绍了Web开发中的文件上传与员工信息修改的综合案例,涵盖前端到后端的完整流程。重点讲解了阿里云OSS的集成,包括Bucket创建、密钥获取及SDK使用,并通过Spring Boot实现文件上传功能。同时,详细描述了员工信息查询与修改的操作逻辑,涉及Controller、Service和Mapper层代码实现。最后探讨了配置文件的优化,对比@Value与@ConfigurationProperties注解,展示了如何通过实体类批量注入配置参数,提升代码可维护性与灵活性。
66 1
鸿蒙5开发宝藏案例分享---Web适配一多开发实践
这是一份实用的鸿蒙Web多设备适配开发指南,针对开发者在不同屏幕尺寸下的布局难题提供了解决方案。文章通过三大法宝(相对单位、媒体查询和窗口监听)详细介绍如何实现智能适配,并提供了多个实战案例,如宫格布局、对话框变形和自适应轮播图等。此外,还分享了调试技巧及工具推荐,帮助开发者快速上手并优化性能。最后鼓励读者实践探索,并提示更多官方资源等待发现。
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
467 1
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
【前端web入门第五天】03 清除默认样式与外边距问题【附综合案例产品卡片与新闻列表】
本文档详细介绍了CSS中清除默认样式的方法,包括清除内外边距、列表项目符号等;探讨了外边距的合并与塌陷问题及其解决策略;讲解了行内元素垂直边距的处理技巧;并介绍了圆角与盒子阴影效果的实现方法。最后通过产品卡片和新闻列表两个综合案例,展示了所学知识的实际应用。
255 11
前端web入门第四天】03 显示模式+综合案例热词与banner效果
本文档介绍了HTML中标签的三种显示模式:块级元素、行内元素与行内块元素,并详细解释了各自的特性和应用场景。块级元素独占一行,宽度默认为父级100%,可设置宽高;行内元素在同一行显示,尺寸由内容决定,设置宽高无效;行内块元素在同一行显示,尺寸由内容决定,可设置宽高。此外,还提供了两个综合案例,包括热词展示和banner效果实现,帮助读者更好地理解和应用这些显示模式。
105 6
【RF案例】Web自动化测试弹窗处理
在进行Web自动化测试时,常会遇到不同类型的弹窗,如ajax、iframe、新窗口及alert/Confirm等。这些弹窗可通过Selenium进行定位与处理。其中,ajax弹窗直接定位处理;iframe需先选中再操作;新窗口类似iframe处理;而alert/Confirm则需特殊方法应对。在Robot Framework中,需先定义并获取窗口后使用特定关键字处理。此外,还有部分div弹窗需在消失前快速定位。希望本文能帮助大家更好地处理各类弹窗。
199 6
【RF案例】Web自动化测试弹窗处理
【前端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;`)以及字符实体的应用。此外,还提供了一个完整的注册信息表单案例,涵盖个人信息、教育经历和工作经历等部分,展示了如何综合运用上述元素构建实用的表单。
175 6
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
【前端web入门第一天】03 综合案例 个人简介与vue简介
该网页采用“从上到下,先整体再局部”的制作思路,逐步分析并编写代码实现个人简介页面。内容涵盖尤雨溪的背景、学习经历及主要成就,同时介绍其开发的Vue.js框架特点。代码结构清晰,注重细节处理,如使用快捷键提高效率,预留超链接位置等,确保最终效果符合预期。
193 7
【语言无界·体验无疆】解锁Vaadin应用全球化秘籍:从代码到文化,让你的应用畅游世界每一个角落!
【8月更文挑战第31天】《国际化与本地化实战:构建多语言支持的Vaadin应用》详细介绍了如何使用Vaadin框架实现应用的国际化和本地化,提升用户体验和市场竞争力。文章涵盖资源文件的创建与管理、消息绑定与动态加载、日期和数字格式化及文化敏感性处理等方面,通过具体示例代码和最佳实践,帮助开发者构建适应不同语言和地区设置的Vaadin应用。通过这些步骤,您的应用将更加灵活,满足全球用户需求。
143 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问