这么小声还想做后端?不!我要快速搭建一个简易后端(2020后端学习总结)

文章开始 让我们大喊一声! 开军舰!!

新年快乐 前阵子在忙考研 虽然也过不了 最近没啥事写个总结吧
文章代码已放置 github
https://github.com/dmhsq/easy-Spring-Boot-demo
Spring Boot 快速搭建后端
数据库为Mysql
开发工具为 IntelliJ IDEA
文章过长 建议听歌曲看哦
点击下方歌曲听歌哦

歌曲

开发环境需求

Java和Maven

安装配置Java环境

下载地址 Java 8u271
在这里插入图片描述根据自己的电脑下载
可以查看我的电脑属性
在这里插入图片描述
可以看移步这个安装配置教程
也可以看这里的
打开exe安装包
在这里插入图片描述
在这里插入图片描述这里可以更改路径 然后安装即可
如果有jre(有的安装包不带)那就选择相同路径即可
没有就不用管 安装就好

选择你要安装的路径即可安装

验证安装

打开控制台 winodws下可以 win+r
在这里插入图片描述
输入 java
在这里插入图片描述
安装成功

如果安装完成却验证失败

在这里插入图片描述手动配置环境变量
找到java安装地址
新建系统环境变量
在这里插入图片描述
然后找到path (环境变量)
在这里插入图片描述

新建
%JAVA_HOME%\bin
在这里插入图片描述

安装Maven

下载Maven

下载地址 maven

在这里插入图片描述

在这里插入图片描述
下载后解压
在这里插入图片描述

配置环境变量

在这里插入图片描述
在这里插入图片描述
然后在Path中
在这里插入图片描述新增一个
在这里插入图片描述
输入%MAVEN_HOME%\bin
在这里插入图片描述

验证安装

打开控制台 winodws下可以 win+r
在这里插入图片描述
输入mvn -v 如果显示以下信息就是安装完成
在这里插入图片描述

项目搭建

新建项目

新建一个项目
在这里插入图片描述选择 Spring Initializr
在这里插入图片描述Next
在这里插入图片描述Next 依赖根据需求 添加 这里我们不添加 后面选择性添加

在这里插入图片描述这里完成项目搭建


修改文件和目录

修改前

搭建好的时候是这样的

在这里插入图片描述

修改后

在这里插入图片描述
注意
application-dev和application-prod 为开发和生成模式配置
在application.yml配置当前模式
在这里插入图片描述

添加依赖

在pom.xml中添加两个依赖 方便操作数据库
注意在pom.xml中我们可以配置我们的依赖

在这里插入图片描述添加Sprng Web依赖 处理GET POST等请求
在这里插入图片描述

配置完成记得Import Changes
在这里插入图片描述

配置项目

在这里插入图片描述

配置端口和路径

在这里插入图片描述

比8848多辣么一点点

配置数据库连接

在这里插入图片描述

其它配置

连接Redis

如果你需要redis
在这里插入图片描述

邮箱发送服务

host username password需要去你想用的邮箱开通服务
在这里插入图片描述
比如在qq邮箱
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
设置我们的host为stmp.qq.com
至于如何用 后续会说

编写domain文件

数据返回格式类

为什么要定义数据返回格式
统一数据返回格式 方便前端使用
在这里插入图片描述

package zmxs.kjj.domain;

/**
 * @Author: xxx  这么小声还想看名字
 * @Time: 2222/2/2 22:22 我就是二狗哈士奇
 * 返回类
 */

public class RespBean {
    
    
    /**
     * 状态码
     */
    private Integer status;

    /**
     * 返回信息
     */
    private String msg=null;

    /**
     * 返回数据
     */
    private Object data;

    public static RespBean ok(String msg){
    
    
        return new RespBean(200,null,null);
    }

    public static RespBean ok(String msg,Object obj){
    
    
        return new RespBean(200,msg,obj);
    }

    public static RespBean error(String msg){
    
    
        return new RespBean(666,null,null);
    }

    public static RespBean error(String msg,Object obj){
    
    
        return new RespBean(666,msg,obj);
    }

    private RespBean(){
    
    
    }

    private RespBean(Integer status, String msg, Object data) {
    
    
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    public Integer getStatus() {
    
    
        return status;
    }

    public void setStatus(Integer status) {
    
    
        this.status = status;
    }

    public String getMsg() {
    
    
        return msg;
    }

    public void setMsg(String msg) {
    
    
        this.msg = msg;
    }

    public Object getData() {
    
    
        return data;
    }

    public void setData(Object obj) {
    
    
        this.data = obj;
    }
}

定义一个实体类

在这里插入图片描述

ZmxsHxKjj
添加@Entity注解 会自动生成数据库 因为数据库没有这个表

注意这里的get set toString 都是快速生成
键盘快捷键 ALT+INS
在这里插入图片描述

package zmxs.kjj.domain;

import javax.persistence.Entity;
import javax.persistence.Id;

/**
 * @Author: 张灿
 * @Time: 2021/1/9 17:45
 */
@Entity
public class ZmxsHxKjj {
    
    

    @Id
    private String jjName;

    private String stuName;

    private String kjjFun;

    private String grade;

    public String getJjName() {
    
    
        return jjName;
    }

    public void setJjName(String jjName) {
    
    
        this.jjName = jjName;
    }

    public String getStuName() {
    
    
        return stuName;
    }

    public void setStuName(String stuName) {
    
    
        this.stuName = stuName;
    }

    public String getKjjFun() {
    
    
        return kjjFun;
    }

    public void setKjjFun(String kjjFun) {
    
    
        this.kjjFun = kjjFun;
    }

    public String getGrade() {
    
    
        return grade;
    }

    public void setGrade(String grade) {
    
    
        this.grade = grade;
    }

    @Override
    public String toString() {
    
    
        return "ZmxsHxKjj{" +
                "jjName='" + jjName + '\'' +
                ", stuName='" + stuName + '\'' +
                ", kjjFun='" + kjjFun + '\'' +
                ", grade='" + grade + '\'' +
                '}';
    }
}





编写DAO(不是DIO)

口no Dio 哒
你给路达由

在dao文件夹下创建新文件 Java Class
ZmxsHxKjjRepository
用来编写操作数据库的接口
在这里插入图片描述
在这里插入图片描述

package zmxs.kjj.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import zmxs.kjj.domain.ZmxsHxKjj;

import java.util.List;

/**
 * @Author: 张灿
 * @Time: 2021/1/9 17:55
 */

public interface ZmxsHxKjjRepository extends JpaRepository<ZmxsHxKjj,String> {
    
    

    /**
     * 模糊查询
     * @param string
     * @return
     */
    List<ZmxsHxKjj> findAllByGradeLike(String string);
}

编写service

操作数据库 查询全部 分页查询 模糊匹配
在这里插入图片描述

package zmxs.kjj.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import zmxs.kjj.dao.ZmxsHxKjjRepository;
import zmxs.kjj.domain.RespBean;

/**
 * @Author: 张灿
 * @Time: 2021/1/9 17:57
 */
@Service
public class ZmxsHxKjjService {
    
    
    @Autowired
    ZmxsHxKjjRepository zmxsHxKjjRepository;

    /**
     * 查询全部
     * @return
     */
    public RespBean findAll(){
    
    
        return RespBean.ok("你给路哒哟",zmxsHxKjjRepository.findAll());
    }

    /**
     * 分页查询
     * @param currentPage
     * @param pagesize
     * @return
     */
    public RespBean findAllByPage(Integer currentPage,Integer pagesize){
    
    
        Pageable pageable = PageRequest.of(currentPage-1,pagesize);
        return RespBean.ok("分页开军舰",zmxsHxKjjRepository.findAll(pageable));
    }

    /**
     * 模糊查询
     * @param grade
     * @return
     */
    public RespBean findByGrade(String grade){
    
    
        grade = grade+"%";
        return RespBean.ok("模糊开军舰",zmxsHxKjjRepository.findAllByGradeLike(grade));
    }


}

编写Controller

让前端等访问到我们的接口
在这里插入图片描述

package zmxs.kjj.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import zmxs.kjj.domain.RespBean;
import zmxs.kjj.service.ZmxsHxKjjService;

/**
 * @Author: 张灿
 * @Time: 2021/1/9 18:09
 */
@CrossOrigin
@RestController
public class KjjController {
    
    

    private final static Logger logger = LoggerFactory.getLogger(KjjController.class);

    @Autowired
    ZmxsHxKjjService zmxsHxKjjService;

    /**
     * 查询所有数据
     * @return
     */
    @GetMapping("/findAll")
    public RespBean KJJ(){
    
    
        return zmxsHxKjjService.findAll();
    }

    /**
     * 分页查询
     * @param page
     * @param size
     * @return
     */
    @GetMapping("/findPage")
    public RespBean KJJPage(@RequestParam("page") Integer page,
                        @RequestParam("size") Integer size){
    
    
        return zmxsHxKjjService.findAllByPage(page, size);
    }

    /**
     * 模糊查询
     * @param grade
     * @return
     */
    @GetMapping("/findByGrade")
    public RespBean KJJGrade(@RequestParam("grade") String grade){
    
    
        return zmxsHxKjjService.findByGrade(grade);
    }

}


配置跨域

在控制类中加
@CrossOrigin
在这里插入图片描述

在这里插入图片描述

package zmxs.kjj.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.logging.LogRecord;


/**
 * @Author: 张灿
 * @Time: 2020/1/3 16:36 很久之前写的了哈哈
 */
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
public class CORSFilter implements Filter {
    
    

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
    
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin","*");
        response.setHeader("Access-Control-Allow-Credentials","true");
        response.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,PUT,DELETE,PATCH,HEAD");
        response.setHeader("Access-Control-Allow-Max-Age","3600");
        response.setHeader("Access-Control-Allow-Headers","*");
        if("OPTIONS".equalsIgnoreCase(request.getMethod())){
    
    
            response.setStatus(HttpServletResponse.SC_OK);
        }else{
    
    
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }


    public boolean isLoggable(LogRecord record) {
    
    
        return false;
    }
}

配置日志


在这里插入图片描述

package zmxs.kjj.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author: 张灿
 * @Time: 2019/11/27 14:56 没错这是我之前写的 直接复制改改用了
 */
@Aspect
@Component
public class HttpAspect {
    
    
    private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);


    @Pointcut("execution(public * zmxs.kjj.controller.KjjController.*(..))")
    public void log(){
    
    
    }

    @Before("log()")
    public void doBefore(JoinPoint joinPoint){
    
    

        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        //url
        logger.info("url={}",request.getRequestURL());
        //method
        logger.info("method={}",request.getMethod());
        //ip
        logger.info("ip={}",request.getRemoteAddr());
        //类方法
        logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName() + "." +joinPoint.getSignature().getName());
        //参数
        logger.info("arges={}",joinPoint.getArgs());
    }

    @After("log()")
    public void doAfter(){
    
    
        logger.info("成功运行");
    }

    @AfterReturning(returning = "object",pointcut = "log()")
    public  void  doAfterReturning(Object object){
    
    
        logger.info("response={}",object.toString());
    }
}

运行

在这里插入图片描述
在这里插入图片描述项目运行成功

运行前数据库没有表
在这里插入图片描述
运行后

在这里插入图片描述

测试

我们往数据库写几个数据
在这里插入图片描述

测试 GetMapping("/findAll")

在这里插入图片描述

测试 GetMapping("/findPage")

在这里插入图片描述

测试 GetMapping("/findByGrade")

在这里插入图片描述在这里插入图片描述

响应头

查看响应头可以看到我们自定义的拦截规则
在这里插入图片描述

在这里插入图片描述

查看日志

项目正式打包后会在运行目录 产生日志
开发模式可查看控制台打印的结果
在这里插入图片描述

整合Swagger2

为什么要整合 为了方便前端看和调用
在这里插入图片描述可以看到 这里可以直接测试
在这里插入图片描述
如何整合 如下
写一个配置类
在这里插入图片描述

package zmxs.kjj.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @Author: 张灿
 * @Time: 2021/1/9 20:14
 */

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    
    
    @Bean
    public Docket createRestApi() {
    
    
        return new Docket(DocumentationType.SWAGGER_2)
                .pathMapping("/")
                .select()
                .apis(RequestHandlerSelectors.basePackage("zmxs.kjj.controller"))
                .paths(PathSelectors.any())
                .build().apiInfo(new ApiInfoBuilder()
                        .title("奥里给星弟们")
                        .description("奥里给接口,老大哥......")
                        .version("1.0")
                        .build());
    }
}

然后在 控制类添加注解
在这里插入图片描述
在接口处添加注解
在这里插入图片描述解释
@ApiOperation 接口作用
@ApiImplicitParams({
@ApiImplicitParam(name = “page”,value = “当前第几页”,defaultValue = “1”),
@ApiImplicitParam(name = “size”,value = “页面大小”,defaultValue = “5”)
})
定义了接口数据 如果只有一个可以写成
在这里插入图片描述完成后 重启(运行)项目
浏览器输入
http://localhost:8849/kjj/swagger-ui.htm
localhost/端口号/项目路径(如果没有设置不写)/swagger-ui.html

结语

到此 一个简单的后端项目就完成了
如果需要拓展自己的业务
就按照 dao - service - controller 来写
此代码已上传github
项目地址
https://github.com/dmhsq/easy-Spring-Boot-demo

拓展

鉴权

如果你想要做鉴权 就添加以下依赖 不过要配置哦
在这里插入图片描述在这里插入图片描述

邮件服务

需要用到以下依赖
在上面的 项目配置 其它配置中也有提到
在这里插入图片描述

在这里插入图片描述

邮件服务和鉴权以后会在我的Java进阶教程博客中提到
有兴趣的小伙伴也可以去网上先康康 这可是好东西哦







  大家好,我是代码哈士奇,是一名软件学院网络工程的学生,因为我是“狗”,狗走千里吃肉。想把大学期间学的东西和大家分享,和大家一起进步。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页:https://blog.csdn.net/qq_42027681

未经本人允许,禁止转载

在这里插入图片描述


后续会推出

前端:vue入门 vue开发小程序 等
后端: java入门 springboot入门等
服务器:mysql入门 服务器简单指令 云服务器运行项目
python:推荐不温卜火 一定要看哦
一些插件的使用等

大学之道亦在自身,努力学习,热血青春
如果对编程感兴趣可以加入我们的qq群一起交流:974178910
在这里插入图片描述

有问题可以下方留言,看到了会回复哦

猜你喜欢

转载自blog.csdn.net/qq_42027681/article/details/112393418