目录
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>