HTTP请求数据格式
常见的响应状态码
HTTP响应数据格式
接口测试工具
Bean组件扫描
前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
@ComponentScan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包。
@Resource 与@Autowired区别
@Autowired是spring框架提供的注解,而@Resource是JDK提供的注解。
@Autowired 默认是按照类型注入,而@Resource默认是按照名称注入。
注意事项:REST是风格,是约定方式,约定不是规定,可以打破。
描述模块的功能通常使用复数,也就是加s的格式来描述,表示此类资源,而非单个资源。如: users、emps、books…
DeptMapper
@Mapper
public interface DeptMapper {
//查询全部部门数据
@Select("select * from dept")
List<Dept> list();
//根据主键id删除
@Delete("delete from dept where id=#{id}")
void deleteById(Integer id);
//新增部门
@Insert("insert into dept (name,create_time,update_time) values (#{name},#{createTime},#{updateTime})")
void insert(Dept dept);
//根据id查询
@Select("select * from dept where id=#{id}")
Dept getById(Integer id);
//修改部门信息
@Update("update dept set name=#{name},update_time=#{updateTime} where id=#{id}")
void update(Dept dept);
}
DeptService
public interface DeptService {
//查询全部部门信息
List<Dept> list();
//删除部门
void delete(Integer id);
//新增部门
void add(Dept dept);
//根据id查询
Dept getById(Integer id);
//修改部门
void update(Dept dept);
}
DeptServiceimpl
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptMapper deptMapper;
//查询部门信息
@Override
public List<Dept> list() {
return deptMapper.list();
}
//删除部门信息
@Override
public void delete(Integer id) {
deptMapper.deleteById(id);
}
//新增部门
@Override
public void add(Dept dept) {
dept.setCreateTime(LocalDateTime.now());
dept.setUpdateTime(LocalDateTime.now());
deptMapper.insert(dept);
}
//根据id查询部门
@Override
public Dept getById(Integer id) {
return deptMapper.getById(id);
}
//修改部门信息
@Override
public void update(Dept dept) {
dept.setUpdateTime(LocalDateTime.now());
deptMapper.update(dept);
}
DeptController
//部门管理
@Slf4j
@RestController
@RequestMapping("/depts")
public class DeptController {
@Autowired
private DeptService deptService;
// 查询全部部门的数据
@GetMapping
public Result list() {
log.info("查询全部部门数据");
//调用service查询部门数据
List<Dept> deptList =deptService.list();
return Result.success(deptList);
}
//删除部门
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id){
deptService.delete(id);
return Result.success();
}
//新增部门·
@PostMapping
public Result add(@RequestBody Dept dept){
deptService.add(dept);
return Result.success();
}
//根据id查询部门信息
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id){
Dept dept=deptService.getById(id);
return Result.success(dept);
}
//修改部门信息
@PutMapping
public Result update(@RequestBody Dept dept){
deptService.update(dept);
return Result.success();
}
分页查询结果封装类(属性名要与前端所传属性名保持一致)
//分页查询结果封装类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {
private Long total;//总记录数
private List rows;//数据列表
}
Empcontroller
@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){
log.info("分页查询{},{}",page,pageSize);
//调用service分页查询
PageBean pageBean =empService.page(page,pageSize);
return Result.success(pageBean);
}
Empservice
public interface EmpService {
PageBean page(Integer page, Integer pageSize);
}
EmpServiceimpl
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper empMapper;
@Override
public PageBean page(Integer page, Integer pageSize) {
//获取总记录数
Long count= empMapper.count();
//1获取分页查询的结果列表
Integer start=(page-1)*pageSize;
List<Emp> empList=empMapper.page(start,pageSize);
//封装pagebean对象
PageBean pageBean=new PageBean(count,empList);
return pageBean;
}
EmpMapper
@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);
}
在使用原始方法时会发现,分页查询步骤固定,代码繁琐,而Mybatis有专门的分页查询PageHelper插件,可以简洁高效的进行开发。
引入pagehelper插件依赖
< dependency>
< groupId>com.github.pagehelper< /groupId>
< artifactId>pagehelper-spring-boot-starter< /artifactId>
< version>1.4.2< /version>
< /dependency>
EmpCOntroller
@Autowired
private EmpService empService;
@GetMapping
public Result page(@RequestParam(defaultValue = "10") 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);
EmpServiceImpl
@Override
public PageBean page(Integer page,Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {
PageHelper.startPage(page,pageSize);
List<Emp> empList = empMapper.list(name,gender,begin,end);
Page<Emp> p=(Page<Emp>) empList;
//封装pagebean对象
PageBean pageBean=new PageBean(p.getTotal(),p.getResult());
return pageBean;
}
Empmaapper.java
//条件查询
//@Select("select * from emp")
public List<Emp> list(String name,Short gender, LocalDate begin,LocalDate end);
Empmaapper.xml
<select id="list" resultType="com.itheima.pojo.Emp">
select id, username, password,name,gender,image,job,entrydate,
dept_id as deptId, create_time as createTime, update_time as updateTime 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>
简介
文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。
文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。
本地存储
在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中。
文件上传的实现代码
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String username, Integer age, MultipartFile image) throws Exception {
log.info("文件上传:{},{},{}",username,age,image);
//获取原始文件名
String originalFilename = image.getOriginalFilename();
//构造唯一文件名 不能重复uuid
String extname=originalFilename.substring(originalFilename.lastIndexOf("."));
//拼接新名字
String newfilename= UUID.randomUUID().toString()+extname;
log.info("新文件名,{}",newfilename);
//将文件存储在服务器磁盘目录中
image.transferTo(new File("C:\\Users\\86178\\Desktop\\瑞吉外卖资料\\瑞吉外卖项目\\资料\\图片资源\\"+newfilename));
return Result.success();
}
String getOriginalFilename();//获取原始文件名
void transferTo(File dest);//将接收的文件转存到磁盘文件中
long getSize(); l/获取文件的大小,单位:字节
byte] getBytes();//获取文件内容的字节数组
Ilnputsteam getlnputStream();//获取接收到的文件内容的输入流
阿里云OSS
阿里云对象存储OSS (0bject Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。
引入阿里云AliOSSUtils工具类
/**
* 阿里云 OSS 工具类
*/
@Component
public class AliOSSUtils {
private String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
private String accessKeyId = "***********";
private String accessKeySecret = "************";
private String bucketName = "hmleadnews-tlias";
/**
*
*
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//上传文件到 OSS
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径
String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
}
文件上传和下载的实现UploadController
@Slf4j
@RestController
public class UploadController {
@Autowired
private AliOSSUtils aliOSSUtils;
@PostMapping("/upload")
public Result upload(MultipartFile image) throws IOException {
log.info("文件上传, 文件名: {}", image.getOriginalFilename());
//调用阿里云OSS工具类进行文件上传
String url = aliOSSUtils.upload(image);
log.info("文件上传完成,文件访问的url: {}", url);
return Result.success(url);
}
}
EmpControoler
//删除员工
@DeleteMapping("/{ids}")
public Result delete(@PathVariable List<Integer> ids){
log.info("批量删除{}",ids);
empService.delete(ids);
return Result.success();
}
//新增员工
@PostMapping
public Result save(@RequestBody Emp emp){
log.info("新增员工{}",emp);
empService.save(emp);
return Result.success();
}
//根据id查询员工
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id){
log.info("根据id查询员工信息,{}",id);
Emp emp=empService.getById(id);
return Result.success(emp);
}
//修改部门信息
@PutMapping
public Result update(@RequestBody Emp emp){
log.info("更新员工信息,{}",emp);
empService.update(emp);
return Result.success();
}
EmpService
//批量删除
void delete(List<Integer> ids);
//新增员工
void save(Emp emp);
//根据id查询
Emp getById(Integer id);
//修改员工信息
void update(Emp emp);
EmpServceImpl
//删除员工
@Override
public void delete(List<Integer> ids) {
empMapper.delete(ids);
}
//新增员工信息
@Override
public void save(Emp emp) {
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
empMapper.insert(emp);
}
//根据id查询
@Override
public Emp getById(Integer id) {
return empMapper.getById(id);
}
//修改员工信息
@Override
public void update(Emp emp) {
emp.setUpdateTime(LocalDateTime.now());
empMapper.update(emp);
}
EmpMapper.java
//批量删除
void delete(List<Integer> ids);
//新增员工信息
@Insert("insert into emp (username,name,gender,image,job,entrydate,dept_id,create_time,update_time)" +
"values(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
void insert(Emp emp);
//根据id查询
@Select("select * from emp where id=#{id}")
Emp getById(Integer id);
//修改员工信息
void update(Emp emp);
EmpMapper.xml
<!--批量删除-->
<delete id="delete">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach>
</delete>
<!-- 修改员工信息-->
<update id="update">
update emp
<set>
<if test="username!=null and username!=''">username=#{username},</if>
<if test="password!=null and password!=''">password=#{password},</if>
<if test="name!=null and name!=''">name=#{name},</if>
<if test="gender!=null">gender=#{gender},</if>
<if test="image!=null and image!=''">image=#{image},</if>
<if test="job!=null">job=#{job},</if>
<if test="entrydate!=null">entrydate=#{entrydate},</if>
<if test="deptId!=null">dept_id=#{deptId},</if>
<if test="updateTime!=null">update_time=#{updateTime}</if>
</set>
where id=#{id}
</update>
工具类中通过get可以获取所配置的属性值