网站建设 ipv6,微信开放平台表情包,wordpress采集优酷视频,保定网站设计网站目录
1、需求说明#xff1a;实现对部门表和员工表的增删改查
2、环境搭建
3、部门管理
3.1 查询部门
3.2 前后端联调
3.3 删除部门
3.4 新增部门
3.5 根据ID查询数据
3.5 修改部门 总结#xff08;Controller层参数接收#xff09;#xff1a;
4、员工管理
4.…目录
1、需求说明实现对部门表和员工表的增删改查
2、环境搭建
3、部门管理
3.1 查询部门
3.2 前后端联调
3.3 删除部门
3.4 新增部门
3.5 根据ID查询数据
3.5 修改部门 总结Controller层参数接收
4、员工管理
4.1 分页查询
4.2 分页查询插件-PageHelper
4.3 分页查询带条件
4.4 删除员工
4.5 新增员工 该项目是在看完黑马2023年JavaWeb视频跟着做的一个简单的SpringBoot项目
基于前后端分离模式进行开发会遵循接口文档的开发规范
开发流程 1、需求说明实现对部门表和员工表的增删改查 2、环境搭建 1 准备数据库表dept、emp
在本地创建tlias数据库并复制资料中的两张表 2 创建SpringBoot工程 pom.xml
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.example/groupIdartifactIdtlias/artifactIdversion1.0-SNAPSHOT/versionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.2.7.RELEASE/version/parentdependencies!-- mybatis的起步依赖--dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.2.2/version/dependency!-- mysql 驱动包--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope/dependency!-- springboot单元测试--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-test/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency/dependencies/project 启动类tliasquickstartapplication
package pearl;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication//具有包扫描作用默认扫描当前包及其子包即demo01
public class tliasquickstartapplication {public static void main(String[] args) {SpringApplication.run(tliasquickstartapplication.class,args);}}
测试类tliasquickstartapplicationTest
package pearl;import org.springframework.boot.test.context.SpringBootTest;SpringBootTest //springboot整合单元测试的注解
public class tliasquickstartapplicationTest {}application.properties配置文件
# 配置数据库的链接信息 -四要素
#驱动类名称
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.urljdbc:mysql://localhost:3306/tlias?serverTimezoneUTC
#连接数据库的用户名
spring.datasource.usernameroot
#连接数据库的密码
spring.datasource.password# 配置mybatis的日志指定输出到控制台
mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl# 开启mybatis的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case true
创建实体类Emp、Dept
创建对应的Mapper接口、Service接口、实现类、Controller基础结构 3、部门管理
3.1 查询部门
EmpController: 首先返回一个空的数据测试端口号
Slf4j //定义一个日志记录对象 等价于下面对log对象的定义1.
RestController
public class DeptController {
// 1.定义一个日志记录对象
// 1.private static Logger log LoggerFactory.getLogger(DeptController.class);// RequestMapping(value /depts,method RequestMethod.GET)//指定请求方式为getGetMapping(/depts)// 指定/depts路由的请求方式为get 与上一行代码等价public Result list(){log.info(查询全部部门数据);return Result.success();}
} 然后运行启动类在postman中测试 没毛病然后定义一个Service层对象调用Service层方法查询数据
package pearl.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import pearl.pojo.Dept;
import pearl.pojo.Result;
import pearl.service.DeptService;import java.util.List;Slf4j //定义一个日志记录对象 等价于下面对log对象的定义1.
RestController
public class DeptController {
// 1.定义一个日志记录对象
// 1.private static Logger log LoggerFactory.getLogger(DeptController.class);Autowired//定义一个Service层对象private DeptService deptService;// RequestMapping(value /depts,method RequestMethod.GET)//指定请求方式为getGetMapping(/depts)// 指定/depts路由的请求方式为get 与上一行代码等价public Result list(){log.info(查询全部部门数据);// 调用service查询部门数据ListDept deptList deptService.list();//此时service层中还没定义该方法需要返回Service层中定义该方法return Result.success(deptList);}
}此时DeptService中还没有查询全部数据的list()方法所以现在去DeptService中定义list()接口 /** 查询全部部门数据* */ListDept list();
然后去 DeptService中定义list()的实现方法
即定义一个mapper层对象调用mapper层方法查询数据
package pearl.service.impl;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pearl.mapper.DeptMapper;
import pearl.pojo.Dept;import java.util.List;Service
public class DeptService implements pearl.service.DeptService {// 定义一个Mapper层对象Autowiredprivate DeptMapper deptMapper;Overridepublic ListDept list() {ListDept deptList deptMapper.list();//此时service层中还没定义该方法需要返回Service层中定义该方法return deptList;}
}此时mapper层中没有list()方法需要我们现在去DeptMapper中定义list()接口 /** 查询全部部门数据* */Select(select * from dept)ListDept list();
由于该SQL语句较简单所以直接使用注解方式配置
现在需要按mapper--service---controller的路径去查看返回数据是否正确
然后运行启动类查看查询结果 完成
3.2 前后端联调 前后端联调将前端工程、后端工程都启动起来然后访问前端工程通过前端工程访问服务程序进而进行调试 1.将资料中提供的“前端工程”文件中的压缩包拷贝到一个没有中文不带空格的目录下解压 2.启动nginx访问测试http://localhost:90 --ngix占用的是90端口
点击文件中的nginx.exe 然后通过任务管理器的详细信息查看nginx是否启动完成
然后在浏览器访问http://localhost:90进入前端页面
3.3 删除部门
EmpController编写删除函数调用Service删除接口
// 删除DeleteMapping(/depts/{id})public Result delete(PathVariable Integer id){ //PathVariable 表示绑定路径中的参数idlog.info(删除id为id的数据);deptService.delete(id);return Result.success();} PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中 URL 中的 {xxx} 占位符可以通过PathVariable(“xxx“) 绑定到操作方法的入参中 EmpService接口 /** 根据ID删除数据* */void delete(Integer id); EmpService实现类编写删除函数调用mapper 层删除接口 Overridepublic void delete(Integer id){deptMapper.delete(id);return ;}
EmpMapper: 编写删除接口与SQL语句 Delete(delete from dept where id #{id})void delete(Integer id);
启动测试类在postman中测试接口 完成
3.4 新增部门
新增部门逻辑与前面相似 注意新增部门时使用RequestBody 将请求参数封装到实体类中再在service层的实现方法类中补全实体类的属性值在执行插入到数据库的操作 EmpController:
// 新增部门PostMapping(/depts)public Result insert(RequestBody Dept dept){//RequestBody 将获取到的请求参数封装到实体类dept中log.info(新增部门dept);deptService.insert(dept);return Result.success();}
EmpService接口 /** 新增数据* */void insert(Dept dept); EmpService实现类 Overridepublic void insert(Dept dept) {dept.setCreateTime(LocalDateTime.now());//补全dept中的属性dept.setUpdateTime(LocalDateTime.now());deptMapper.insert(dept);}
EmpMapper Insert(insert into dept (name,create_time,update_time) values(#{name},#{createTime},#{updateTime}))void insert(Dept dept);
运行完成
3.5 根据ID查询数据
EmpController: /** 根据ID查询* */GetMapping(/depts/{id})public Result selectById(PathVariable Integer id){log.info(获取id为id的数据);Dept dept deptService.selectById(id);return Result.success(dept);} 注意这里路径中携带参数一定要使用PathVariable注解绑定 路径中的参数 EmpService接口 /** 根据ID查询数据* */Dept selectById(Integer id); EmpService实现类 Overridepublic Dept selectById(Integer id){Dept dept deptMapper.selectById(id);return dept;}
EmpMapper Select(select * from dept where id #{id})Dept selectById(Integer id);
3.5 修改部门
EmpController: /** 修改部门* */PutMapping(/depts)public Result update(RequestBody Dept dept){log.info(修改部门dept);deptService.update(dept);return Result.success();}
EmpService接口 /** 修改部门* */void update(Dept dept);EmpService实现类 Overridepublic void update(Dept dept){dept.setUpdateTime(LocalDateTime.now());deptMapper.update(dept);}
EmpMapper Update(update dept set name #{name}, update_time #{updateTime} where id #{id})void update(Dept dept);
完成
编辑之前 点击编辑 这里会自动回显利用的是通过ID查询数据功能
编辑完成后 此时部门管理的操作已经完成了返回来看我们DeptController文件中还可以优化
优化前
package pearl.controller;import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Insert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import pearl.pojo.Dept;
import pearl.pojo.Result;
import pearl.service.DeptService;import java.util.List;Slf4j //定义一个日志记录对象 等价于下面对log对象的定义1.
RestController
public class DeptController {
// 1.定义一个日志记录对象
// 1.private static Logger log LoggerFactory.getLogger(DeptController.class);Autowired//定义一个Service层对象private DeptService deptService;/** 查询* */
// RequestMapping(value /depts,method RequestMethod.GET)//指定请求方式为getGetMapping(/depts)// 指定/depts路由的请求方式为get 与上一行代码等价public Result list(){log.info(查询全部部门数据);// 调用service查询部门数据ListDept deptList deptService.list();//此时service层中还没定义该方法需要返回Service层中定义该方法return Result.success(deptList);}/** 根据ID查询* */GetMapping(/depts/{id})public Result selectById(PathVariable Integer id){log.info(获取id为id的数据);Dept dept deptService.selectById(id);return Result.success(dept);}/** 删除* */DeleteMapping(/depts/{id})public Result delete(PathVariable Integer id){ //PathVariable 表示绑定路径中的参数idlog.info(删除id为id的数据);deptService.delete(id);return Result.success();}/** 新增部门* */PostMapping(/depts)public Result insert(RequestBody Dept dept){//RequestBody 将获取到的请求参数封装到实体类dept中log.info(新增部门dept);deptService.insert(dept);return Result.success();}/** 修改部门* */PutMapping(/depts)public Result update(RequestBody Dept dept){log.info(修改部门dept);deptService.update(dept);return Result.success();}}由于该文件下的路径都是在/depts路径下所以就把这部分抽出类简化代码 完整的请求路径为类上RequestMappering的路径方法前的路径 简化后的代码如下 优化后
package pearl.controller;import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Insert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import pearl.pojo.Dept;
import pearl.pojo.Result;
import pearl.service.DeptService;import java.util.List;Slf4j
RequestMapping(/depts)
RestController
public class DeptController {Autowired//定义一个Service层对象private DeptService deptService;/** 查询* */GetMapping// 指定/depts路由的请求方式为get 与上一行代码等价public Result list(){log.info(查询全部部门数据);// 调用service查询部门数据ListDept deptList deptService.list();//此时service层中还没定义该方法需要返回Service层中定义该方法return Result.success(deptList);}/** 删除* */DeleteMapping(/{id})public Result delete(PathVariable Integer id){ //PathVariable 表示绑定路径中的参数idlog.info(删除id为id的数据);deptService.delete(id);return Result.success();}/** 新增部门* */PostMappingpublic Result insert(RequestBody Dept dept){//RequestBody 将获取到的请求参数封装到实体类dept中log.info(新增部门dept);deptService.insert(dept);return Result.success();}}总结Controller层参数接收 参数格式路径参数 使用 PathVariable 表示绑定路径中的参数id
eg1: DeleteMapping(/{id})public Result delete(PathVariable Integer id) 参数格式application/json 使用RequestBody 将获取到的请求参数封装到实体类中
eg: 请求参数是Dept类的部分属性值PostMappingpublic Result insert(RequestBody Dept dept) 参数格式queryString RequestParam(defaultValue 1) 设置默认值
下面的参数名称和类型一定要和文档中的保持一致否则传输不了数据
eg: public Result selectByPage(RequestParam(defaultValue 1) Integer page, RequestParam(defaultValue 5) Integer pageSize)4、员工管理
4.1 分页查询 分页查询语法 -- 参数1 b: 起始索引 页码-1* l -- 参数2 l: 查询返回记录数 每页展示的记录数 select * from emp limit b,l; 首先查看接口文档发现需要返回的数据类型是Json文件包含总记录数和数据列表
我们最好的选择就是把记录数和数据列表封装成一个实体类然后再返回给前端
PageBean:
package pearl.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;Data
NoArgsConstructor
AllArgsConstructor
public class PageBean {private Long total;//总记录数private List rows;//数据列表
}EmpController: //接收前端的请求参数并返回Result型数据
package pearl.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import pearl.pojo.PageBean;
import pearl.pojo.Result;
import pearl.service.EmpService;RestController
Slf4j
public class EmpController {Autowiredprivate EmpService empService;/** 分页查询* */GetMapping(/emps) //RequestParam(defaultValue 1) 设置默认值public Result selectByPage(RequestParam(defaultValue 1) Integer page, //注意这里的参数名称一定要和文档中的保持一致否则肯传输不了数据RequestParam(defaultValue 5) Integer pageSize){log.info(查询数据第{}页{}条数据,page,pageSize);PageBean pageBean empService.selectByPage(page,pageSize);return Result.success(pageBean);}
}EmpService接口 /** 分页查询* */PageBean selectByPage(Integer page, Integer pageSize);
EmpService实现类 Autowiredprivate EmpMapper empMapper;/** 分页查询* */Overridepublic PageBean selectByPage(Integer page, Integer pageSize) {ListEmp rows empMapper.selectByPage((page-1)*pageSize,pageSize);Long total empMapper.count();final PageBean pageBean new PageBean(total,rows);return pageBean;}
EmpMapper: /** 分页查询获取列表数据* */Select(select * from emp limit #{page},#{pageSize})ListEmp selectByPage(Integer page, Integer pageSize);/** 查询记录数* */Select(select count(*) from emp)Long count(); 完成
4.2 分页查询插件-PageHelper
使用PageHelper插件实现分页查询功能
pom文件中导入依赖
!-- pagehelper分页插件依赖 --dependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper-spring-boot-starter/artifactIdversion1.4.0/version/dependency EmpController 与EmpService接口代码不变
EmpService实现类 Overridepublic PageBean selectByPage(Integer page, Integer pageSize) {
// 1. 设置分页参数PageHelper.startPage(page,pageSize);
// 2. 执行查询ListEmp empList empMapper.list();PageEmp p (PageEmp) empList;
// 3. 封装成bean对象PageBean pageBean new PageBean(p.getTotal(),p.getResult());return pageBean;}
EmpMapper: /** 分页查询-使用PageHelper插件* */Select(select * from emp)public ListEmp list(); 完成
4.3 分页查询带条件 条件如上所示我们需要更改EmpController中的参数
EmpController GetMapping(/emps) //RequestParam(defaultValue 1) 设置默认值public Result selectByPage(RequestParam(defaultValue 1) Integer page, //注意这里的参数名称一定要和文档中的保持一致否则肯传输不了数据RequestParam(defaultValue 5) Integer pageSize,String name, Short gender,DateTimeFormat(pattern yyyy-MM-dd) LocalDate begin,//DateTimeFormat指定日期格式DateTimeFormat(pattern yyyy-MM-dd) LocalDate end){log.info(查询数据第{}页{}条数据,{},{},{},{},page,pageSize,name,gender,begin,end);PageBean pageBean empService.selectByPage(page,pageSize,name,gender,begin,end);return Result.success(pageBean);}
EmpService接口也需要增加参数 /** 分页查询-带条件* */PageBean selectByPage(Integer page, Integer pageSize, String name, Short gender,LocalDate begin, LocalDate end);
EmpService实现类参数 Overridepublic PageBean selectByPage(Integer page, Integer pageSize, String name, Short gender,LocalDate begin, LocalDate end) {
// 1. 设置分页参数PageHelper.startPage(page,pageSize);
// 2. 执行查询ListEmp empList empMapper.list(name,gender,begin,end);PageEmp p (PageEmp) empList;
// 3. 封装成bean对象PageBean pageBean new PageBean(p.getTotal(),p.getResult());return pageBean;}
EmpMapper接口 public ListEmp list(String name, Short gender,LocalDate begin, LocalDate end);由于条件参数非必须传递所以使用动态SQL配置在XML文件中
EmpMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacepearl.mapper.EmpMapperselect idlist resultTypepearl.pojo.Empselect * from empwhereif testname ! null and name ! name like concat(%, #{name},%)/ifif testgender ! nulland gender #{gender}/ifif testbegin ! null and end ! nulland entrydate between #{begin} and #{end}/if/where/select
/mapper 完成!
4.4 删除员工
具体代码如下不做过多描述 4.5 新增员工
具体代码如下不做过多描述