SpringBoot基础学习

SpringBoot基础学习

1.SpringBoot基础知识

  • parent

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    

    pom文件中依赖了父类spring-boot-starter-parent,继续分析进入

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>3.1.1</version>
    </parent>
    

    再点击进入spring-boot-dependencies,可以看到定义了各种依赖的坐标和版本信息,统一管理,简化了配置开发。parent中规定好了所有依赖的版本信息。

  • starter

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    指定项目导入哪些依赖项,再通过继承的父类来指定版本

  • 启动类

    @SpringBootApplication
    public class SpringBootPro01Application {
    	public static void main(String[] args) {
    		SpringApplication.run(SpringBootPro01Application.class, args);
    	}
    }
    
    • 通过运行引导类启动项目,运行后初始化Spring容器,扫描引导类所在包及其同目录下所有包下的类
    • @SpringBootApplication实现了Spring所有配置,简化开发。
  • 辅助功能(举例:切换内置服务器,主要是理解方法)

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
    </dependencies>
    
    • 内嵌Tomcat服务器是SpringBoot辅助功能之一
    • 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理
    • 变更内嵌服务器思想是去除现有服务器,添加全新的服务器

2. 配置文件

2.1. 配置文件类型

  • SpringBoot默认配置文件application.properties

  • SpringBoot提供了多种属性配置方式

    • application.properties
    server.port=80
    
    • application.yml(主流)
    server:
      port: 81
    
    • application.yaml
    server:
      port: 82
    
  • 三种配置文件可以同时存在,其优先级为*.properties > *.yml > *.yaml

  • 不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留

2.2. YAML格式

  • 单一属性值
username: zhangshan

user:
  name: zhangshan
  • 通过@Value("${属性值}")获取属性值
@Value(${username})
private String username1;

@Value(${user.name})
private String username2;
  • 变量引用
    • 在配置文件中可以使用${属性名}方式引用属性值
    • 属性中出项特殊字符,可以使用双引号包裹起来作为字符解析
dirtest: c:/windows
rounte: ${dirtest}/path.html
  • yaml数据读取

    SpringBoot中提供了Environment对象,配置文件的属性都封装到Environment对象中

    user:
      username: zhangshan
      address: chongqing
      age: 20
    
        @Autowired
        private Environment environment;
    
        @GetMapping
        public void method(){
            User user = new User();
            user.setUsername(environment.getProperty("user.username"));
            user.setAddress(environment.getProperty("user.address"));
            user.setAge(Integer.valueOf(environment.getProperty("user.age")));
            System.out.println(user);
        }
    
  • 自定义封装数据对象

    • 首先是通过@Component定义,被Spring容器加载到生成初始化Bean,否则无法进行属性注入
    • 通过@ConfigurationProperties(prefix = "datasource")来指定配置文件属性的前缀,绑定配置信息到封装类中
    • 底层在通过类提供的setter方法对名称对应的属性值进行赋值
datasource:
  driver: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://127.0.0.1:3306/db1
  username: root
  password: 123456
  list:
  	- test1
  	- test2
  	- test3
@Component
@Data
@ConfigurationProperties(prefix = "datasource")
public class DataSource {
    private String driver;
    private String url;
    private String username;
    private String password;
    private List<String> list;
}
  • 需要注意数组的赋值,这里提供的通过配置bean的方式实现的,通过@Value赋值需要在配置文件写成list:test1,test2,test3的形式,否则找不到对应参数名。

3. SpringBoot整合第三方

3.1. 技术整合

  • JUnit整合

    • 在springboot中封装好了测试类,通过依赖导入。
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
    • 使用@SpringBootTest修饰测试类,@Test修饰测试方法。
    • 测试类@SpringBootApplication启动类的包或子包下,可以省略启动类的设置
    @SpringBootTest
    class SpringBootPro02ApplicationTests {
    }
    
    • 如果不在上述范围,需要加上class属性
    @SpringBootTest(classes = SpringBootPro02Application.class)
    class SpringBootPro02ApplicationTests {
    }
    
    • 使用自动装配的形式添加要测试的对象。
  • MyBatis整合

    • 通过勾选或者手动导入依赖坐标。
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>3.0.2</version>
    </dependency>
    
    • SpringBoot自动实现了相关配置信息。
    • SQL映射通过@Mapper注解被容器识别。
    @Mapper
    public interface BookDao{
    }
    
    • 其余操作相同,在resources文件夹下建立相同目录结构,实现xml形式的SQL语句或者通过注解的形式实现。
  • MyBatis Plus整合

    • 手动导入依赖坐标。
    • mybatisplus注意SpringBoot版本信息,在SpringBoot3.x版本不能实现mybatisplus相关的配置,不能初始化工厂和初始化持久层的Bean,需要使用SpringBoot2.x版本才能正常使用。
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.2</version>
    </dependency>
    
  • Druid整合

    • 手动导入依赖坐标。
    <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.8</version>
    </dependency>
    
    • 通过application.yml来实现数据库连接配置信息。
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/db1
        username: root
        password: 123456
        type: com.alibaba.druid.pool.DruidDataSource
    
    • 这里是SpringBoot提供的通用数据库连接,通过type来指定是是数据源。SpringBoot中默认Hikari

    druid也提供了自己数据库连接配置信息的格式:

    spring:
      datasource:
        druid:
          driver: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/db1
          password: 123456
          username: root
    

    但是根据运行测试,并不能连接到数据库,找不到datasource,原因未知。还是推荐使用第一种连接方式。

    • Druid主要是通过和MyBatis结合使用,在MyBatisPlus中,可以不使用。

3.2. 使用注意事项

  • 使用MyBatisPlus需要设置id生成策略,默认可能是雪花算法,这里设置为自增。
mybatis-plus:
  global-config:
    db-config:
      table-prefix:
      id-type: auto # 和数据库保持一致使用自增策略

id-type:指定id的生成策略。table-prefix:指定数据表的前缀。

可以通过@TableName@TableField来指定表名和对应的字段名。

@Data
@TableName("tb_books")
public class Book {
    private Integer id;
    @TableField("name")
    private String name;
    private String series;
    private String description;
}
  • 开启MyBatisPlus的日志。
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.3. MyBatis Plus使用

  • 提供 BaseMapper<T>提供增删改查的各种SQL操作,简化持久层开发。
@Mapper
public interface BookDao extends BaseMapper<Book> {
}
  • 提供IService<T>ServiceImpl<M, T>接口提供业务层的各种操作,简化业务层开发。根据需要,可以自定义业务层操作。
public interface BookIService extends IService<Book> {
    IPage<Book> getPage(int currentPage,int size);
    IPage<Book> getPage(int currentPage,int size, Book book);
}
@Service
public class BookIServiceImp1 extends ServiceImpl<BookDao, Book> implements BookIService {

    @Override
    public IPage<Book> getPage(int currentPage, int size) {
        IPage<Book> page = new Page<>(currentPage, size);
        return this.page(page);
    }

    @Override
    public IPage<Book> getPage(int currentPage, int size, Book book) {
        IPage<Book> bookPage = new Page<>(currentPage, size);
        LambdaQueryWrapper<Book> queryWrapper = new LambdaQueryWrapper<>();
        if(book != null){
            queryWrapper.like(book.getDescription() != null, 
                    Book::getDescription, book.getDescription());
            queryWrapper.like(book.getName() != null, Book::getName, book.getName());
            queryWrapper.like(book.getSeries() != null, Book::getSeries, book.getSeries());
        }
        return this.page(bookPage, queryWrapper);
    }
}
  • 主要介绍MyBatis Plus的分页查询和条件查询

    • 分页查询,MyBatis Plus是通过分页拦截器实现。interceptor可以添加各种拦截器在里面。
    • 动态修改SQL语句在语句后面加上限制条件limit实现分页效果。
    @Configuration
    public class MybatisPlusConfig {
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor(){
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
            return interceptor;
        }
    }
    
        @Override
        public IPage<Book> getPage(int currentPage, int size) {
            IPage<Book> page = new Page<>(currentPage, size);
            return this.page(page);
        }
    
    • 使用IPage<T>设置分页的条件。设置当前页数currentPage和每页数据条数size

    • 通过page()方法查询所有加上参数page,设置分页查询。

    • 条件查询

        @Override
        public IPage<Book> getPage(int currentPage, int size, Book book) {
            IPage<Book> bookPage = new Page<>(currentPage, size);
            LambdaQueryWrapper<Book> queryWrapper = new LambdaQueryWrapper<>();
            if(book != null){
                queryWrapper.like(book.getDescription() != null, 
                        Book::getDescription, book.getDescription());
                queryWrapper.like(book.getName() != null, Book::getName, book.getName());
                queryWrapper.like(book.getSeries() != null, Book::getSeries, book.getSeries());
            }
            return this.page(bookPage, queryWrapper);
        }
    
    • LambdaQueryWrapper类来设置查询条件
     queryWrapper.like(book.getName() != null, Book::getName, book.getName());
    
    • 代码解释:

      • book.getName() != null判断条件,条件成立则增加对应字段的条件查询

      • Book::getNamelambda表达式来设置映射字段

      • book.getName()设置对应的值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值