Springboot案例 操作员工

        相比于dept部门信息,员工信息Emp显得复杂许多,所以说操作起来也更加地繁琐;但总体来说,思路和操作dept是如出一辙的,主要仍然还是三层架构结合Mybatis对数据库操作,但因为Emp的对象相对复杂不少,所以说在编写mapper代码的时候,大部分SQL都是基于.xml文件进行配置的。

        Emp实体类

package com.wzb.pojo20240929;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
    private Integer id;
    private String username;
    private String password;
    private String name;
    private Short gender;
    private String image;
    private Short job;
    private LocalDate entrydate;
    private Integer deptId;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

        Result统一返回结果

package com.wzb.pojo20240929;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
    private Integer code; // 响应码,1是响应成功,2是响应失败
    private String message; // 响应信息,描述响应结果的字符串
    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 fail(String message) {
        return new Result(0, message, null);
    }
}

        分页查询返回结果

package com.wzb.pojo20240929;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {
    private Long total;
    private List<Emp> rows;
}

        Controller层代码

package com.wzb.controller20240929;


import com.wzb.pojo20240929.Emp;
import com.wzb.pojo20240929.PageBean;
import com.wzb.pojo20240929.Result;
import com.wzb.service20240929.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.util.List;


@RestController
public class EmpController {

    @Autowired
    private EmpService empService;

    // 没有条件、查询全部的分页查询
    @GetMapping("/emps")
    // 请求路径中没有参数,前端请求的参数被@RequestParam注解所接收了,并且若不传参则使用@RequestParam设置的默认参数
    public Result pageSelect(@RequestParam(defaultValue = "1") Integer page,
                             @RequestParam(defaultValue = "10") Integer pageSize) {
        System.out.printf("分页查询,参数:查的%d页,这一页有%d条", page, pageSize);
        PageBean pageBean = empService.pageAllSelect(page, pageSize);
        return Result.success(pageBean);
    }

//     上述分页查询只是查询表中所有的数据,并进行分页,不能自定义查询内容,所以说要通过动态SQL来改进分页查询
//     需求:可以通过指定姓名、性别、入职时间来自定义分页查询条件

    // 为什么要用@DateTimeFormat注解?
    // 因为Http请求都是String类型,但是需要的是LocalDate的对象,使用@DateTimeFormat注解并限定其模式,可以自动转换为LocalDate类型
    // GET /your-endpoint?begin=2024-01-01&end=2024-12-31
    // @DateTimeFormat自动解析:begin解析为LocalDate.of(2024, 1, 1),end解析为LocalDate.of(2024, 12, 31)
    @GetMapping("/condition")
    public Result pageSelect(@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) {
        // 记录日志
        System.out.println("条件分页查询");
        // 通过Service层操作数据库并得到返回的PageBean对象
        PageBean pageBean = empService.pageSelect(page, pageSize, name, gender, begin, end);
        // 响应
        return Result.success(pageBean);
    }

    // 删除员工
    // 当勾选前端页面的复选框,然后点击批量删除,就可以将这一批次的员工信息删除了
    // 同时也可以只勾选一个复选框,仅删除一个员工信息

    // 不需要开发多个功能接口————因为删除多个员工这个功能接口包含了只删除一个员工的功能

    // 如何在controller中接收到请求路径中的路径参数?
    // --使用@PathVariable注解,写在方法的参数前面

    // 如何限定请求的方式是delete?
    // --使用@DeleteMapping注解,写在方法上面

    // 在Mapper接口中,执行delete操作SQL语句时,如何实现动态SQL?
    // --使用Mybatis中的forEach实现
    @DeleteMapping("/emps/{ids}")
    public Result deleteEmp(@PathVariable List<Integer> ids){
        empService.deleteEmp(ids);
        return Result.success();
    }


    // 新增员工
    // 在新增员工时,需要保存用户的基本信息,并且需要上传员工的图片(上传文件)

    // 保存文件的基本信息
    // 思路:
    // Controller层接收并封装参数,然后调用Service方法保存数据,最后响应前端
    // service层对实体类的属性进行补充,然后调用mapper接口进行保存数据操作(数据库)
    // mapper层中用SQL语句操作数据库保存员工,完成新增
    @PostMapping("/emps")
    public Result insertEmp(@RequestBody Emp emp) {
        // 记录日志
        System.out.println("新增了一个员工");
        // 调用业务层新增功能
        empService.insertEmp(emp);
        // 响应
        return Result.success();
    }



}

        Service层接口

package com.wzb.service20240929;

import com.wzb.pojo20240929.Emp;
import com.wzb.pojo20240929.PageBean;

import java.time.LocalDate;
import java.util.List;

public interface EmpService {

    PageBean pageAllSelect(Integer page, Integer pageSize);

    PageBean pageSelect(Integer page, Integer pageSize, String name, Short gender,
                        LocalDate begin, LocalDate end);

    void deleteEmp(List<Integer> ids);

    void insertEmp(Emp emp);

}

        Service层实现类

package com.wzb.service20240929;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.wzb.mapper20240929.EmpMapper;
import com.wzb.pojo20240929.Emp;
import com.wzb.pojo20240929.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@Service
public class EmpServiceImplement implements EmpService {
    @Autowired
    private EmpMapper empMapper;

//    @Override
//    public PageBean pageAllSelect(Integer page, Integer pageSize) {
//        // 获取总记录数
//        Long count = empMapper.getTotal();
//        // 计算想要查询页码的起始索引
//        int start = (page - 1) * pageSize;
//        // 获取分页查询的查询列表
//        List<Emp> empList = empMapper.getList(start, pageSize);
//        // 给controller层返回PageBean封装对象
//        return new PageBean(count, empList);
//    }

    @Override
    public PageBean pageAllSelect(Integer page, Integer pageSize) {
        // 设置分页参数
        // 需要传递的参数:查询第……页,每一页的页面大小(条目数量)
        PageHelper.startPage(page, pageSize);
        // 通过empMapper执行分页查询
        List<Emp> empList = empMapper.pageAllSelect();
        // 获取分页查询结果
        // 通过PageHelper插件得到的查询列表,需要进行类型转换,转换成Page<查询内容的类型>才可以使用getResult等方法
        Page<Emp> p = (Page<Emp>) empList;
        // 封装pageBean
        return new PageBean(p.getTotal(), p.getResult());
    }

    @Override
    public PageBean pageSelect(Integer page, Integer pageSize, String name,
                               Short gender, LocalDate begin, LocalDate end) {
        //设置分页参数
        PageHelper.startPage(page, pageSize);
        //执行条件分页查询
        List<Emp> empList = empMapper.pageSelect(name, gender, begin, end);
        //获取查询结果
        Page<Emp> p = (Page<Emp>) empList;
        //封装PageBean
        return new PageBean(p.getTotal(), p.getResult());
    }

    @Override
    public void deleteEmp(List<Integer> ids) {
        empMapper.deleteEmp(ids);
    }

    @Override
    public void insertEmp(Emp emp) {
        // 因为前端无法发送创建时间、更新时间等数据,所以说后端需要对数据进行补全
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        // 调用mapper中的添加方法
        empMapper.insertEmp(emp);
    }
}

        Mapper层

package com.wzb.mapper20240929;

import com.wzb.pojo20240929.Emp;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDate;
import java.util.List;

@Mapper
public interface EmpMapper {

//    @Select("select count(*) from emp")
//    public Long getTotal();
//
//    @Select("select * from emp limit #{start}, #{pageSize}")
//    public List<Emp> getList(Integer start, Integer pageSize);


    // 使用分页插件pageHelper便捷地进行分页查询

    // 获取当前页的查询结果
    @Select("select * from emp")
    List<Emp> pageAllSelect();

    List<Emp> pageSelect(String name, Short gender, LocalDate begin, LocalDate end);

    void deleteEmp(List<Integer> ids);

    void insertEmp(Emp emp);

}

        xml配置文件操作SQL

<?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.wzb.mapper20240929.EmpMapper">
    <!-- 执行条件分页查询 -->
    <!-- 条件分页查询 -->
    <select id="pageSelect" resultType="com.wzb.pojo20240929.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 entrydate between #{begin} and #{end}
            </if>
        </where>
        order by update_time desc
    </select>

    <!--批量删除员工-->
    <delete id="deleteEmp">
        delete from emp where id in
        <foreach collection="ids" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>

    <!-- 新增员工 -->
    <!--
    当进行条件判断时,必须使用Java类中的属性名(如:deptId),
    而不是数据库中的列名(如:dept_id),因为前端的数据已经封装到Java实例中了
    MyBatis是根据Java对象的属性值来进行条件判断的
-->
    <insert id="insertEmp">
        insert into emp
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username != null">username,</if>
            <if test="name != null">name,</if>
            <if test="gender != -1">gender,</if>
            <if test="image != null">image,</if>
            <if test="job != -1">job,</if>
            <if test="entrydate != null">entrydate,</if>
            <if test="deptId != -1">dept_id,</if>
            create_time, update_time
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username != null">#{username},</if>
            <if test="name != null">#{name},</if>
            <if test="gender != -1">#{gender},</if>
            <if test="image != null">#{image},</if>
            <if test="job != -1">#{job},</if>
            <if test="entrydate != null">#{entrydate},</if>
            <if test="deptId != -1">#{deptId},</if>
            #{createTime}, #{updateTime}
        </trim>
    </insert>

</mapper>

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值