项目目录
- 此项目为了伙伴们可以快速入手SpringBoot项目,全网最详细的版本,每个伙伴都可以学会,这个项目每一步都会带大家做,学完后可以保证熟悉SpringBoot的开发流程
- 项目介绍:项目使用springboot +mybatis进行开发
- 带你一起写小项目
- 先把初始环境给你们
- 第一步新建springboot项目
- 返回结果的封装类 Result
- SpringBoot的三层架构
- 数据库,实体类
- 配置Mybatis
- mybatis.xml的三个规范
- 第一个是同包同名
- 第二个,mapper.xml的namespace要与mapper全类名进行一致
- 第三个是方法中的 id 要与maper的方法名一致
- 第一个业务的开发 部门查询
- 前后端联调
- 总结
- 删除部门业务
- 删除部门的业务
- 部门管理-新增部门
- 部门管理-修改部门
- 分页查询
- 分页查询-思路
- 使用分页插件 PageHelper
- 文件上传
- 文件上传接入云服务 阿里云OSS
- 修改员工-查询回显
- 配置文件-参数配置化
- 配置文件-@ConfigurationProperties
- 员工性别统计
此项目为了伙伴们可以快速入手SpringBoot项目,全网最详细的版本,每个伙伴都可以学会,这个项目每一步都会带大家做,学完后可以保证熟悉SpringBoot的开发流程
项目介绍:项目使用springboot +mybatis进行开发
带你一起写小项目
先把初始环境给你们
链接: https://pan.baidu.com/s/1At81Y_CQZlKFOPqzyY4vXw?pwd=tvhs 提取码: tvhs 复制这段内容后打开百度网盘手机App,操作更方便哦
下载资料,里面有sql文件,写后
然后根据开发规范的Result类
第一步新建springboot项目
springboot是对spring的封装
然后我们点击创建项目
创建完后我们会进入这个页面
选择两个文件然后删除
然后根据开发流程
前后端分离开发,后端要根据接口文档进行开发,接口文档在前面分享的资料里面
返回结果的封装类 Result
首先我们要确定开发规范,也就是遵守restful开发风格规范,返回值要result封装为统一的格式
package com.healer.common;
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);
}
}
一个result类
里面有 code msg 还有data
然后result里面有静态方法
有成功的返回方法
SpringBoot的三层架构
开发项目的时候,要进行分层,有controller层 还有service层 还有mapper层, 这三层结构是互相调用的,前段发起请求请求到达controller层,然后controller调用service 最后service调用mapper
数据库,实体类
在资料里面有实体类的创建,可以直接用,
然后导入到 idea中 ,实体类要导入到 com.healer.pojo中
然后直接使用lombok注解
@Data 这个作用是lombok在编译的时候会给实体类加入get set 方法
然后写入 @NoArgsConstructor @AllArgsConstructor
那么这个实体类就创建完毕了
实体类的作用是与数据库中的表字段进行对应,一个实体类对应一个表
只有这样,才能将数据库中的数据查询出来然后返回给实体类,实体类再进行封装为对象
现在我们的项目基础的搭建以及完成了
就是丢一个common包下的result
然后是controller包下的
然后是service下面的
接口与实现类实现类继承接口,然后实现类上面要加入@Service注解,这个作用是告诉spring这是一个service对象,要让spring将这个类加入到ioc容器中,被spring管理,所以我们使用@Autowride拿到的bean对象都是被spring管理的对象,也就是代理对象
mapper也是,也要加入@Mapper
配置Mybatis
mybatis的起步依赖,数据库的连接依赖
mybatis的起步依赖配置后,要配置mapper的xml文件
mybatis.xml的三个规范
第一个是同包同名
也就是
xml要与mapper所在相同的级别并且类名要与xml名一致
第二个,mapper.xml的namespace要与mapper全类名进行一致
第三个是方法中的 id 要与maper的方法名一致
然后xml创建好后,就可以配置properties的配置
#下面这些内容是为了让MyBatis映射
#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mappers/*xml
#指定Mybatis的实体目录
mybatis.type-aliases-package=com.healer.pojo
#驼峰映射
mybatis.configuration.map-underscore-to-camel-case=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/tails?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
开启mybatis的驼峰映射
第一个业务的开发 部门查询
根据接口文档
首先是一个部门的查询
那么我们就从DeptController进行开发
package com.healer.controller;
import com.healer.common.Result;
import com.healer.pojo.Dept;
import com.healer.service.DeptService;
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.RestController;
import java.util.List;
/**
* @author healer
* @Description DeptController
* @data 2024-05-30 16:31
*/
@RestController
@Slf4j
@RequestMapping("/depts")
public class DeptController {
@Autowired
private DeptService deptService;
@GetMapping
public Result selectDeptList() {
List<Dept> deptList = deptService.selectDeptList();
return Result.success(deptList);
}
}
首先进行@ResultController,表示这个是一个controller层
然后引入service
由于service被spring管理了,所以直接引入就行
然后我们就根据接口文档进行开发
我们查询的是所有的部门所以,要使用list集合去接收数据
List<Dept> deptList = deptService.selectDeptList();
return Result.success(deptList);
然后返回Result.success(deptList);
开发service层
然后调用mapper
使用注解直接查询
进行测试
postman测试
前后端联调
开发完接口后,进行前后端联调
首先打开前端,使用nginx运行后,访问
访问后有数据说明前后端联调成功
查看nginx.conf
nginx端口号90
然后进行代理
总结
开发流程 : 明确需求 接口文档 思路分析 接口开发
删除部门业务
删除部门的业务
首先写sql语句测试,测试之后就根据开发文档进行开发
先看请求地址
然后再看请求方式
请求参数是一个id
响应结果是直接返回删除成功
所以不需要service层返回值
直接在controller层调用service方法后就直接返回成功就行
然后进行测试,测试通过
controller层
/**
* 根据id删除部门
* @param id
* @return
*/
@DeleteMapping("/{id}")
public Result delectDeptById(@PathVariable("id") Integer id) {
deptService.delectDeptById(id);
return Result.success();
}
service层
@Override
public void delectDeptById(Integer id) {
deptMapper.delectDeptById(id);
}
mapper层
@Delete("delete from dept where id=#{id}")
void delectDeptById(@Param("id") Integer id);
部门管理-新增部门
开发新增部门
首先查看接口四要素
请求方式为post
请求路径为 /depts
请求参数是一个name
返回值,相应数据
为json数据
直接返回成功的信息
书写controller层代码
@PostMapping
public Result addDept(@RequestBody Dept dept) {
log.info("开始新增部门");
deptService.addDept(dept);
return Result.success();
}
写service层
@Override
public void addDept(Dept dept) {
dept.setCreateTime(LocalDateTime.now());
dept.setUpdateTime(LocalDateTime.now());
deptMapper.addDept(dept);
}
mapper层
@Insert("insert into dept ( name, create_time, update_time) values (#{dept.name},#{dept.createTime},#{dept.updateTime})")
void addDept(@Param("dept") Dept dept);
书写之后进行测试
添加成功
使用post请求
发送json数据
{
“name”: “测试部”
}
部门管理-修改部门
两个接口
一个是根据id查询 部门
一个是根据id修改部门
分析接口四要素
请求方式
请求参数
请求路径
返回值
直接返回就行了
controller层
/**
* 根据部门id查询部门信息
*
* @param id
* @return
*/
@GetMapping("/{id}")
public Result findDeptById(@PathVariable("id") Integer id) {
Dept dept = deptService.findDeptById(id);
return Result.success(dept);
}
/**
* 根据id修改部门
*
* @param dept
* @return
*/
@PutMapping
public Result updateDept(@RequestBody Dept dept) {
log.info("开始进行部门修改");
deptService.updateDept(dept);
return Result.success();
}
service层
@Override
public Dept findDeptById(Integer id) {
Dept dept = deptMapper.findDeptById(id);
return dept;
}
@Override
public void updateDept(Dept dept) {
dept.setUpdateTime(LocalDateTime.now());
deptMapper.updateDept(dept);
}
mapper层
@Select("select id, name, create_time, update_time from dept where id=#{id}")
Dept findDeptById(@Param("id") Integer id);
@Update("update dept set name=#{dept.name} ,update_time=#{dept.updateTime} where id =#{dept.id}")
void updateDept(@Param("dept") Dept dept);
然后进行测试
分页查询
不管做什么项目,只要是分页查询,那么前端就给服务器两个参数
一个是pagenum
一个是pagesize
那么服务器端也就返回
List数据
还有total总记录数
返回结果
data
要返回给前端两个参数
项目开发返回的是Result对象
data里面存储的是数据
所以,一次不能返回两个数据,
只能把这个两个数据都封装在一个对象里面,
一个是list 一个是total
将page对象封装进data中
使用pageBean进行两个参数的封装
package com.healer.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author healer
* @Description PageBean
* @data 2024-05-30 22:41
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {
// 总记录数
private Long total;
private List<Emp> rows;
}
分页查询-思路
分页查询需要两个sql语句
一个用于查询总数
一个用于分页查询
controller层
当进行分页查询的时候,前端会进行传递两个参数
一个参数是page一个参数是pgesize
controller层接收到请求后 直接调用service
service中要先去获取总记录数
再去获取结果列表
最后再将 总记录数与结构列表封装pagebean,返回给controller
controller层
service层
查询了两个接口
使用分页插件 PageHelper
分页的步骤都是重复的,所以可以使用插件
文件上传
文件上传前端怎么做
前端页面
所有的文件上传都使用post
文件上传
使用表单
使用表单提交数据
需要在表单上面加入 enctype="multipart/form-data"
<form action="/upload" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="username">
<br>
年龄:<input type="text" name="age">
<br>
图像:<input type="file" name="image">
<br>
<input type="submit" value="提交">
</form>
后端接受请求
使用参数接受
下面是详细讲解
首先前端三个要素
第一个使用post提交
action 使用 /upload
然后上传的文件使用 file
type =file
在controller中书写
@PostMapping("/upload")
public Result uploadFile(String username, Integer age, MultipartFile image) throws IOException {
log.info("文件上传.....{} {}", username, age);
image.transferTo(new File("D:\\images\\1.md"));
return Result.success();
}
文件上传接入云服务 阿里云OSS
这个功能单独提取出来进行详解,可以直接进入,详细教程
链接: link
也可以使用腾讯云,下面介绍多种云的使用
修改员工-查询回显
首先修改员工的话,第一步就是继续页面的回显,回显就是根据id查询员工
当点击编辑的时候
页面会进行回显
# 更新员工
直接调用mapper进行书写更新接口
配置文件-参数配置化
容易变动的参数都放置在配置文件
参数配置化是将参数动态的配置在参数文件当中
然后使用只需要加载就可以 使用@Value()
配置文件-@ConfigurationProperties
先定义一个实体类
需要使用@ConfigurationProperties(prefix=“aliyun.oss”)
原则怎么是简单怎么来
@Value
与@ConfigurationProperties
员工性别统计
是根据性别分组
首先是使用if语句,将查询出来的数据进行修改
然后再起别名 讲字段名字进行修改