SpringBoot知识点积累

137 阅读5分钟

SpringBoot常用的配置※

1.设置端口

server:
  port: 80

2.关于配置文件的优先级

image-20221213131725277.png

SpringBoot常用依赖※

【提示】版本可能会变化,建议安装合适的版本,避免出现其他问题

【快捷导入】

<!--MySQL数据库驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
</dependency>
<!--druid连接池依赖,注意,还需要在配置文件application.yml中配置属性-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.15</version>
</dependency>
<!--MyBatis Plus依赖-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>
<!--Lombok依赖-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
</dependency>

【注意】需要安装其他类型的数据的依赖需要在网上查找对应的依赖

1.MySQL数据库驱动

  • pom.xml中导入该依赖
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
</dependency>

2.Druid连接池

【作用】连接池,加快访问速度

  • pom.xml中导入该依赖
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.15</version>
</dependency>
  • application.yml中配置
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/数据库?serverTimezone=UTC
      #serverTimezone=UTC建议加上
      username: root
      password: password

3.MyBatis Plus依赖

【作用】用于数据查询等,主要对于单表查询有很大的简化

  • pom.xml中导入该依赖
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>
  • application.yml中配置
#使用配置方式开启日志,是指日志输出方式为标准s
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#将关于mybatis-plus操作的表加上特定的前缀
  global-config:
    db-config:
      table-prefix: 前缀

【拓展】将实体中的主键id等设置为自增时,使用方法userMapper.insert(user)后,输出的user中的id,此时就是自增之后的id了(使用此种方式,userid需要先设置为空,否则就按照普通的插入方式处理)

image-20221211114008588.png
Mybatis Plus依赖有关的注解
1. @TableId(type = IdType.AUTO)

【作用】告诉Mybatis Plus这是主键并且是自增的

4.Swagger依赖

【作用】直观得展示接口以及接口的类型,需要满足Restful原则,但是版本已经很久远了,目前不适配新版的SpringBoot

【注意点】使用该依赖时一般都需要遵守Restful准则,其中GET等都是浏览器等的提交方式。

image-20221213132331538.png

  • pom.xml中导入该依赖
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>
  • 使用之后需要在config文件中新建Swagger2Config(类名可自定义)
package com.example.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.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
​
@Configuration
@EnableSwagger2//启用Swagger2功能
public class Swagger2Config {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com"))
                //com下所有的API交给Swagger2管理
                .paths(PathSelectors.any()).build();
    }
    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("演示项目API")//标题
                .description("学习Swagger2的演示项目")//概述
                .version("1.0")
                .build();
    }
}
  • 在浏览器中输入对应的网址即可查看对应的接口
5.Lombok依赖

【作用】便于实现实体类的一些方法(setget方法以及toString方法)

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
</dependency>
Lombok依赖相关的注释
1. @Data

【作用】设置了(一般给实体类设置该属性)该属性,该实体类就可以不用手动添加setget方法,以及其他的方法(例如toString

package com.example.entity;
​
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
​
@Data
public class User {
    @TableId(type = IdType.AUTO)
    private int id;
    private String username;
    private int age;
    private String city;
    private String password;
}

SpringBoot常用的注解

1..@RequestBody注解※

【作用】@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(即请求体中的数据的);

  • 当客户端的HTTP请求参数contentType设置为:application/json
  • 服务端的处理接口参数使用:@RequestBody注解,就会把客户参数当成一个javaBean进行耦合字段赋值,简单的说就是,把客户的json对象转换为javaBean对象
@PostMapping
public String insert(@RequestBody User user) {
    if(userService.save(user)){
        return "添加成功";
    }else {
        return "添加失败";
    }
}

2..@ResponseBody注解

其他重要功能

1.使用分页功能
  • 需要先创建一个配置类(很重要),暂且取名叫MPConfig,其中创建一个Bean,这个Bean是分页功能所需要的。
package com.example.config;
​
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
​
@Configuration
public class MPConfig {
    @Bean//创建拦截器的Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}
  • 代码中可以使用(在测试类中添加)
@Test
public void testGetPage(){
    IPage page=new Page(1,5);//Page(1,5)含义为,将获得的数据每5条为一页数据,去其中的第1页的数据
    userMapper.selectPage(page,null);//后面的null是queryWrapper的位置,此处添加之后就可以对数据库中的数据进行筛选后在进行分页的操作
}

【拓展】page有如下几个方法,可以方便使用

image-20221211200222489.png

2.关于QueryWrapper

【作用】使用后可以更方便地使用单表查询(具有常用的筛选功能)

【举例】筛选用户名中含有“明”的用户

QueryWrapper<User> qw=new QueryWrapper<>();
qw.like("username","明");//设置条件
userMapper.selectList(qw);

【注意】假如觉得这里的username容易写错,就可以使用LambdaQueryWrapper对象(见下方)。

3.关于LambdaQueryWrapper

【作用】和QueryWrapper执行效果类似,在QueryWrapper对象的基础上和Lombok进行整合。

【举例】筛选用户名中含有“明”的用户

LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<User>();
lqw.like(User::getUsername,"明");
userMapper.selectList(lqw);
  • 一般书写方案
String name=null;//输入一个名字关键字来查询
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<User>();
lqw.like(User::getUsername,name);
userMapper.selectList(lqw);
  • 假如名字为空,输出的结果直接是使用了null当成了一个查询的条件

image-20221213122015606.png

【分析】输出结果不符合预期

  • 改进方案:lqw.like(判断,User::getUsername,name);这里的like字段可以添加一个判断,如果判断结果为true,那么就会执行这个筛选;为false则不会执行。
String name=null;
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<User>();
lqw.like(name!=null,User::getUsername,name);
userMapper.selectList(lqw);

【拓展】Java判断字符串为空:利用Strings.isNullOrEmpty(字符串)

4.MyBatis Plus还能用于业务层

【作用】实现常见的业务层逻辑代码及方法(包括增、删、改、查等),方便使用。

  • 添加抽象类,并使该抽象类继承IService<实体类>
package com.example.service;
​
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.entity.User;
import java.util.List;
​
public interface UserService extends IService<User> {
}
  • 添加实现类,并使该实现类继承ServiceImpl<实体类的Mapper,实体类>
package com.example.service.impl;
​
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.stereotype.Service;
import java.util.List;
​
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
}
  • 在测试类中进行测试
@Autowired
private UserService userService;
​
@Test
public void save(){
    User user=new User();
    user.setUsername("老王");
    user.setPassword("1111");
    userService.save(user);
}

image-20221213215542421.png

【拓展】常见的业务层函数(以用户user的业务层UserService为例)

@Autowired
private UserService userService;//方法体之外,自动装配
//在某方法中使用
User user=new User();
//增加
userService.save(user);//添加一个用户到数据库
//删除
userService.removeById(id);//通过id删除用户
//更新
userService.updateById(user);//更新数据库中的user用户
//查询
userService.getById(id);//查询id对应的用户
userService.list();//查询所有用户
userService.list(queryWrapper);//查询符合条件的用户
//分页查询
IPage<User> page =new Page<User>(1,5);
userService.page(page);
userService.page(page,queryWrapper);//给分页查询添加条件,返回值是一个IPage<User>对象
//方法实例
//分页查询
@GetMapping("/page")
@ResponseBody
public IPage<User> getPage(){
    IPage<User> page =new Page<>(1,5);
    return userService.page(page);
}

【注意】可以重写父类的方法。可以使用@Override进行验证,能重写时

image-20221213221118872.png运行不会产生错误

不能重写时(不是父类中的方法,即没有覆盖父类中的方法)

image-20221213221213731.png运行就会提示错误

假如想自己写又不想重写方法,可以使用其他关键字命名进行添加。(在通用类型基础上做的功能重载或功能追加)(注意重载时不要覆盖原始操作,避免原始提供的功能丢失)

1.简单来说@override注解是告诉编译器,下面的方法是重写父类的方法
2.如果不写@override注解去直接重写方法,编译器是不会判断你是不是正确重写了父类中的方法的。如重写方法时参数与父类不同,程序是不会提示报错的。这会留下一个潜在的bug。当你写了@override注解时,程序会判断你是否正确的重写了父类的对应方法。而且加上此注解后,程序会自动屏蔽父类的方法。

【注意】分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能, 使用MyBatisPlus拦截器实现

5.一致性处理(R对象)

【作用】一个工具类,是为了方便前端人员的使用,用于统一返回的数据格式。

【背景】 image-20221214165354254.png

这个空值的指明不明确,存在问题。

  • 设计表现层返回结果的模型类,用于后端于前端进行数据格式统一,也称为前后端数据协议(常见形式如下)
package com.example.controller.utils;
​
import lombok.Data;
​
@Data
public class R {
    private Boolean flag;//flag是判断是否传输成功
    private Object data;//data是数据
​
    public R() {
    }
​
    public R(Boolean flag) {
        this.flag = flag;
    }
    public R(Boolean flag,Object data){
        this.flag=flag;
        this.data=data;
    }
}
6.Java常见知识点
7.前端发送请求到后端
                //列表
                getAll() {
                    //发送ajax请求
                    axios.get("/books").then((res)=>{
                        this.dataList = res.data.data;
                        console.log(res.data);
                    });
                },
                    //添加                
                    handleAdd () {
                    //发送ajax请求
                    axios.post("/books",this.formData).then((res)=>{
                        console.log(res.data);
                        //如果操作成功,关闭弹层,显示数据
                        if(res.data.code == 20011){
                            this.dialogFormVisible = false;
                            this.$message.success("添加成功");
                        }else if(res.data.code == 20010){
                            this.$message.error("添加失败");
                        }else{
                            this.$message.error(res.data.msg);
                        }
                    }).finally(()=>{
                        this.getAll();
                    });
                }