web开发综合案例(部门管理,员工管理):服务端接口开发

目录

1.准备工作

 开发流程

​编辑

2.部门管理

查询部门

删除部门

新增部门

3.员工管理

分页查询

​编辑 

分页插件PageHelpe

条件分页查询

删除员工


1.准备工作

准备数据库表(dept、emp)

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

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

准备对应的Mapper(数据访问操作)、Service(接口、实现类)(逻辑处理)、Controller基础结构(接收请求处理响应)

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

注意:1.REST是风格,是约定方式,约定不是规定,可以打破。

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

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

放到pojo类中:

@Data

@NoArgsConstructor

@AllArgsConstructor

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);    

}

}

 开发流程

2.部门管理

查询部门

 前端发送请求后,请求到controller方法当中,先调用service获取数据,在servie中调用了mapper接口当中的方法,来查询全部部门信息,mapper接口往数据库发送sql语句,查询全部部门,将查询的信息封装到list的集合当中,最终将集合数据返回给service,然后在返回给controller,controller拿到返回数据之后,将返回结果封装在统一响应结果result对象中,最终响应给前端

DeptController 中:

 DeptService中:

public interface DeptService {
    /**
     * 查询全部部门数据
     * @return
     */
    List<Dept> list();
 

 Servicelmpl中

@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptMapper deptMapper;

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

 DeptMapper中:

@Mapper
public interface DeptMapper {
    /**
     * 查询全部部门
     * @return
     */
    @Select("select * from dept")
    List<Dept> list();

前后端联调

将前端工程,后端工程都启动起来,然后访问前端工程,通过前端工程,来访问服务端程序,进而进行调试

1.将前端压缩包,拷贝到一个没有中文,不带空格目录下,解压

2.启动nginx,访问测试:http://localhost:90

删除部门

    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id){   //获取路径变量中id,绑定给id参数
        log.info("根据id删除部门:{}",id);   //一个大括号,一个参数占位符
        //调用service删除部门
        deptService.delete(id); 
        return Result.success(); //删除操作不获取返回值,无参
    }

void delete(Integer id); 

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

@Delete("delete from dept where id = #{id}")
    void deleteById(Integer id); 

 

新增部门

   /**
     * 新增部门
     * @return
     */
    @PostMapping
    public Result add(@RequestBody Dept dept){
        log.info("新增部门: {}" , dept);
        //调用service新增部门
        deptService.add(dept);
        return Result.success();
    }


    void add(Dept dept);

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

        deptMapper.insert(dept);
    }


    @Insert("insert into dept(name, create_time, update_time) values(#{name},#{createTime},#{updateTime})")
    void insert(Dept dept); 

公共上的写一个

一个完整的请求路径,应该是类上的 @RequestMapping 的value属性 + 方法上的 @RequestMapping的value属性。

3.员工管理

分页查询

请求参数:页码,每页展示记录数

响应结果:总记录数,结果列表(PageBean)

 

 pojo下的PageBean中:

/**
 * 分页查询结果封装类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {

    private Long total;  //总记录数
    private List rows;   //数据列表

}
 

/**
 * 员工管理
 */
@Mapper
public interface EmpMapper {

    /**
     * 查询总记录数
     */
    @Select("select count(*) from emp")
    public Long count();

    /**
     * 分页查询,获取列表数据

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

@RequestParam 的属性defaultValue可以来设置参数的默认值。 

@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {

    @Autowired
    private EmpService empService;

    @GetMapping
    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);

       
     //调用service分页查询
        PageBean pageBean = empService.page(page,pageSize,name,gender,begin,end);
        return Result.success(pageBean);
    }
 

 EmpService接口中:

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

@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;

    /*@Override
    public PageBean page(Integer page, Integer pageSize) {
        //1. 获取总记录数
        Long count = empMapper.count();

        //2. 获取分页查询结果列表
        Integer start = (page - 1) * pageSize;
        List<Emp> empList = empMapper.page(start, pageSize);

        //3. 封装PageBean对象
        PageBean pageBean = new PageBean(count, empList);
        return pageBean;
    }*/

分页插件PageHelpe

controller不变,service不变,需要依赖

1.pom.xml加入分页插件依赖:

    <!--PageHelper分页插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.2</version>
        </dependency>
    </dependencies>
 

2. Empmapper接口中:

@Select("select * from emp")
    public List<Emp> list(String name, Short gender,LocalDate begin,LocalDate end);

3. EmpServicelmpl类中:

@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);//现在获取到的list集      合是一个分页查询结果的封装类,page类型

    //将emplist强转为page类型,page封装分页查询结果,然后调用page对象中的方法
        Page<Emp> p = (Page<Emp>) empList; //<emp>:每一条记录封装的对象    

        //3. 封装PageBean对象(总记录数,结果列表),返回给controller
        PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
        return pageBean;
    }

条件分页查询

 --条件查询员工-姓名、性别、入职时间
select *
from emp
where
name like concat('%','张','%')    //模糊匹配
and gender =1       //精确查询
and entrydate between '2000-01-01' and '2010-01-01' //范围查询
order by update_time desc;  //倒叙排序

 

 代码如上

动态mysql

 Empmapper接口中:

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

 resources下创建目录com.it.mapper,定义文件EmpMapper.XML

<?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.itheima.mapper.EmpMapper"> //mapper接口全类名  右键cope
   

    <!--条件查询-->
    <select id="list" resultType="com.itheima.pojo.Emp">  //id与mapper接口方法名保持一致,返回类型一致,resultType代表单条记录封装的类型=emp实体类,右键copy
        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>

</mapper>

删除员工

  @DeleteMapping("/{ids}")
    public Result delete(@PathVariable List<Integer> ids){   
        log.info("批量删除操作, ids:{}",id s);
        empService.delete(ids);
        return Result.success();
    }

 EmpService接口:

void delete(List<Integer> ids); 

实现类 

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

 EmpMapper接口delect方法

void delete(List<Integer> ids); //alt+回车快速生成映射配置文件

 <!--批量删除员工 (1, 2, 3)   crat+alt+l 格式化-->
    <delete id="delete">
        delete
        from emp
        where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete> 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值