一、准备工作
1 需求&环境搭建
步骤:
- 准备数据库表(dept、emp)
- 创建 springboot 工程,引入对应的起步依赖(web、mybatis、mysql 驱动、lombok)
- 配置文件 application.properties 中引入 mybatis 的配置信息,准备对应的实体类
- 准备对应的 Mapper、Service(接口、实现类)、Controller 基础结构
2 开发规范
2.1 开发规范 - Restful
REST(REpresentational State Transfer),表述性状态转换,它是一种软件架构风格
- REST 是风格,是约定方式,约定不是规定,可以打破。
- 描述模块的功能通常使用复数,也就是加s的格式来描述,表示此类资源,而非单个资源。如:users、emps、books…
2.2 开发规范-统一响应结果
前后端交互统一响应结果 Result
package com.itheima.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@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.3 开发流程
二、部门管理
1 查询部门
在类上添加 @Slf4j 注解时,会自动生成 Logger 对象,对象名:log
@Slf4j
@RequestMapping("/depts")
@RestController
public class DeptController {//private static Logger log = LoggerFactory.getLogger(DeptController.class);@Autowiredprivate DeptService deptService;/*** 查询部门数据* @return*///@RequestMapping(value = "/depts",method = RequestMethod.GET) //指定请求方式为GET@GetMappingpublic Result list(){log.info("查询全部部门数据");//调用service查询部门数据List<Dept> deptList = deptService.list();return Result.success(deptList);}
}
public interface DeptService {/*** 查询全部部门数据* @return*/List<Dept> list();
}
@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;@Overridepublic List<Dept> list() {return deptMapper.list();}
}
@Mapper
public interface DeptMapper {/*** 查询全部部门* @return*/@Select("select * from dept")List<Dept> list();
}
2 前后端联调
将资料中提供的“前端工程” 文件夹中的压缩包,拷贝到一个没有中文不带空格的目录下,解压。
启动 nginx,访问测试:http://localhost:90
3 删除部门
@Slf4j
@RequestMapping("/depts")
@RestController
public class DeptController {//private static Logger log = LoggerFactory.getLogger(DeptController.class);@Autowiredprivate DeptService deptService;/*** 删除部门* @return*/@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id){log.info("根据id删除部门:{}",id);//调用service删除部门deptService.delete(id);return Result.success();}
}
public interface DeptService {/*** 删除部门* @param id*/void delete(Integer id);
}
@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;@Overridepublic void delete(Integer id) {deptMapper.deleteById(id);}
}
@Mapper
public interface DeptMapper {/*** 根据ID删除部门* @param id*/@Delete("delete from dept where id = #{id}")void deleteById(Integer id););
}
4 新增部门
@Slf4j
@RequestMapping("/depts")
@RestController
public class DeptController {//private static Logger log = LoggerFactory.getLogger(DeptController.class);@Autowiredprivate DeptService deptService;/*** 新增部门* @return*/@PostMappingpublic Result add(@RequestBody Dept dept){log.info("新增部门: {}" , dept);//调用service新增部门deptService.add(dept);return Result.success();}
}
三、员工管理
1 分页查询
1.1 基础分页
思路分析
/*** 分页查询结果封装类*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {private Long total;//总记录数private List rows;//数据列表}
/*** 员工管理*/
@Mapper
public interface EmpMapper {
/*** 分页查询,获取列表数据* @param start* @param pageSize* @return*/@Select("select * from emp limit #{start},#{pageSize}")public List<Emp> page(Integer start, Integer pageSize);
}
/*** 员工管理Controller*/
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {@Autowiredprivate EmpService empService;@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize){log.info("分页查询, 参数: {},{}",page,pageSize);//调用service分页查询PageBean pageBean = empService.page(page,pageSize);return Result.success(pageBean);}
}
@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic 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;}
}
1.2 分页插件
PageHelper 是 Mybatis 的一款功能强大、方便易用的分页插件,支持任何形式的单标、多表的分页查询。
官网:https://pagehelper.github.io/
/*** 员工管理*/
@Mapper
public interface EmpMapper {/*** 员工信息查询* @return*///@Select("select * from emp")public List<Emp> list();
}
@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic 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;}
}
2 分页查询(带条件)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper"><!--条件查询--><select id="list" resultType="com.itheima.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 entrydate between #{begin} and #{end}</if></where>order by update_time desc</select></mapper>
3 删除员工
思路分析