springboot框架
- 什么是Springboot以及Springboot的特点。
2- 快速搭建springboot项目
3 - springboot常用的配置文件类型.
4 - 读取springboot配置文件的内容
5 - 多环境配置
6 - springboot整合数据源。
7 - springboot整合mybatis.
8. springboot自动装配原理—
9 springboot整合mbatis-plus
10 springboot整合swagger2
11 springboot整合定时器
1.什么是Springboot以及Springboot的特点
1.1 什么是springboot?
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程 . 理解:spring框架搭建的步骤:[1]依赖 [2]配置文件。 使用springboot可以简化上面的两个步骤
1.2 Springboot的特点
① 创建独立的 Spring 应用程序
② 嵌入的 Tomcat,无需部署 WAR 文件
③ 简化 Maven 配置
④ 自动配置 Spring
⑤ 提供生产就绪型功能,如指标,健康检查和外部配置
⑥ 开箱即用,没有代码生成,也无需 XML 配置。
- 使用idea快速搭建springboot工程
3.1在拥有互联网的情况下
创建出一个coller包
@RestController
public class HelloWorldController {
@GetMapping("student")
public Map<String,Object> hello(){
Map<String,Object> map=new HashMap<>();
map.put("name","黄黄");
map.put("age",28);
return map;
}
}
4.pringboot常用的配置文件类型.
properties和yml格式。他们的区别就是格式上不同。
properties格式如下:
#修改端口号 server.port=8888 # 修改上下文路径 server.servlet.context-path=/fxd
yml结构
server: port: 8888 servlet: context-path: /huanghuang
不管使用哪个配置文件,他们的名字必须叫application. 如果上面两个配置文件同时存在,而且里面有相同的配置。则properties优先级高于yml优先级。
5. java如何读取配置文件中的内容
java为什么需要读取配置文件的内容,我们开发时需要把哪些内容放入配置文件。
OSS:上传文件。accessKeyId,accessKeySecret等,这些内容能写在java源代码中。硬编码文件,不利维护。 我们需要把信息写入配置文件。
读取方式有两种:
第一种方式: 在类上@ConfigurationProperties(prefix=“”)
@Data @Component @ConfigurationProperties(prefix = "student") public class Student { private String name; private Integer age; private String address; private List<String> hobby; private Map<String,Object> map; }
第二种使用@Value读取属性:—他只能读取基本类型和String类型。加在属性上
@Value("${student.map}") private Map<String,Object> map; @GetMapping("a") public Map<String,Object> a(){ return map; }
6. springboot整合数据源
druid数据源: ----连接数据库
(1)引入相关的依赖。
<!--mysql的驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
(2)配置数据源信息
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/company?serverTimezone=Asia/Shanghai
spring.datasource.druid.username=root
spring.datasource.druid.password=dongdong
spring.datasource.druid.initial-size=5
别忘记修改数据库!!!!!
(3)测试
@SpringBootTest
class Qy163Springboot01ApplicationTests {
@Autowired
private DataSource dataSource;
@Test
void contextLoads() throws Exception{
System.out.println(dataSource);
}
}
7. springboot整合mybatis
(1)相关依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ykq</groupId>
<artifactId>qy163-springboot02</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>qy163-springboot02</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis和springboot整合的依赖 启动依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
(2)修改配置文件
#数据源
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.username=root
spring.datasource.druid.password=root
spring.datasource.druid.url=jdbc:mysql://localhost:3306/company
#指定映射文件所在的路径--
mybatis.mapper-locations=classpath:mapper/*.xml
#mybatis日志文件
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ykq.mapper.EmpMapper.queryAllById
(3) mapper接口
public interface EmpMapper {
public List<Integer id> queryAllById();
}
(4)为mapper接口生成代理实现类
8. springboot自动装配原理
8.1 springboot包扫描原理
包建议大家放在主类所在包或者子包。默认包扫描的是主类所在的包以及子包。
主函数在运行时会加载一个使用@SpringBootApplication标记的类。而该注解是一个复合注解,包含@EnableAutoConfiguration,这个注解开启了自动配置功能。 该注解也是一个复合注解,包含@AutoConfigurationPackage。 该注解中包含@Import({Registrar.class}),这个注解引入Registrar类。该类中存在registerBeanDefinitions,可以获取扫描的包名。
如果需要人为修改扫描包的名称则需要在主类上@ComponentScan(basepackage={“包名也就是mapper层”})
8.2 springboot自动装配原理
主函数在运行会执行一个使用@SpringbootApplication注解的类,该注解是一个复合注解,包含@EnableAutoConfiguration, 该注解开启自动配置功能,该注解也是一个复合注解,包含@Import() 该注解需要导入AutoConfigurationImportSelector类。 该类会加载很多自动装配类,而这些自动装配类完成相应的自动装配原理。
9. springboot整合mybatis-plus
9.1 mybatis-plus概述
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
不能替代mybatis ,以后对于单表操作的所有功能,都可以使用mp完成。但是链表操作的功能还得要校验mybatis.
9.2 如何使用emp
(1)创建表并加入数据
DELETE FROM user;
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
(2)创建一个springboot工程并引入相关的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ykq</groupId>
<artifactId>qy163-springboot03</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>qy163-springboot03</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
(3)配置数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql:///company
(4)创建实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
(5)创建一个dao接口
public interface pulas extends BaseMapper<User> {
}
(6)为接口生成代理实现类
@SpringBootApplication
@MapperScan(basePackages = "com.fxd.dao")
public class Qy163Springboot03Application {
public static void main(String[] args) {
SpringApplication.run(Qy163Springboot03Application.class, args);
}
}
(7)测试
package com.ykq;
import com.ykq.dao.pulas;
import com.ykq.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Qy163Springboot03ApplicationTests {
@Autowired
private pulas pulas;
@Test
void testFindById() {
User user = userMapper.selectById(6);
System.out.println(user);
}
}
4.3 使用mp完成CRUD
@Test
void testfinByid(){
System.out.println(pulas.selectById(1));
}
//删除
@Test
void deleteByid(){
int i = pulas.deleteById(1);
System.out.println(i);
//获取到多个id删除
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
int i1 = pulas.deleteBatchIds(ids);
System.out.println(i1);
}
//默认主键的生成策略:雪花算法-唯一id值。
//使用递增 如果想使用递增策略:必须保证表中的id递增,而且需要在@TableId(type=IdType.AUTO)
@Test
void testinsert(){
User user = new User( 6L,"HUANGHUANG",12,"112312@!11");
int insert = pulas.insert(user);
System.out.println(insert);
}
@Test
void testUpdate(){
User user = new User(6L,"黄启龙",110,"112213412@1");
pulas.updateById(user);
}
@Test
void testFind(){
//select * from user where uname like '%乔%' or age 19 and 25;
//Wrapper<T> queryWrapper:查询对象。 条件接口。QUeryWrapper 查询条件类 UpdateWrapper更新条件类 LambdaWrapper 使用lambda表达式
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.likeRight("name","_启");
queryWrapper.or();
queryWrapper.between("age",10,1000);
List<User> users = pulas.selectList(queryWrapper);
System.out.println(users);
}
@Test
void testpage(){
Page<User> page = new Page<>(1, 5);//current:当前第几页 size:每页显示条数
pulas.selectPage(page,null);
System.out.println("当前页的记录"+page.getRecords());//获取当前页的记录
System.out.println("获取总页数"+page.getPages());//获取当前页的记录
System.out.println("获取总条数"+page.getTotal());//获取当前页的记录
}
//联表查询
@Test
void tsetpage2(){
Page<Student> page = new Page<>(1, 2);//current:当前第几页 size:每页显示条数
QueryWrapper<Student> wrapper=new QueryWrapper<>();
wrapper.gt("smpno",3);
studentMapper.findPage(page,wrapper);
System.out.println("当前页的记录"+page.getRecords());//获取当前页的记录
System.out.println("获取总页数"+page.getPages());//获取当前页的记录
System.out.println("获取总条数"+page.getTotal());//获取当前页的记录
}
10.springboot整合swagger2
10.1 什么是swagger2
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务的接口文档 . 接口: controller相应的路径方法
10.2 为什么是swagger2
目前的项目基本都是前后端分离,后端为前端提供接口的同时,还需同时提供接口的说明文档。但我们的代码总是会根据实际情况来实时更新,这个时候有可能会忘记更新接口的说明文档,造成一些不必要的问题。
10.3 如何使用接口文档swagger2
<!--swagger2依赖-->
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.9.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.7.8</version>
</dependency>
(2)创建一个配置类-swagger2
@Configuration
@EnableSwagger2 //开启swagger注解驱动
public class SwaggerConfig {
@Bean //把方法返回的数据对象 交于spring容器管理
public Docket docket(){
Docket docket = new Docket(DocumentationType.SWAGGER_2).groupName("qy163")
.apiInfo(getInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.ykq.controller")) //只为com.ykq.controller包下的类生成接口文档
.build();
return docket;
}
private ApiInfo getInfo(){
Contact DEFAULT_CONTACT = new Contact("黄黄", "http://www.fanqie.com", "28913312@qq.com");
ApiInfo apiInfo=new ApiInfo("QY163心里测试系统API", "黄黄爱看番茄毒皇API", "1.1.0", "http://www.jd.com",
DEFAULT_CONTACT, "黄黄", "http://www.fxd.com", new ArrayList<VendorExtension>());
return apiInfo;
}
}
(3)访问swagger在线文档
http://ip:port/swagger-ui.html路径
http://ip:port/doc.html
10.4 swagger中常用的注解
使用swagger注解对接口参数加以说明。
@Api(tags=“”)====使用在controller类上
@ApiOperation(value=“”)====接口方法上 接口方法加以说明
@ApiParam(value = “”,name = “”,required = true)
@ApiModel====实体类
@ApiModelProperty===>实体类的属性说明
4. springboot整合定时器-quartz
https://www.pppet.net/
定时器: 在指定的时间执行相应的业务代码。
应用场景: 比如: 定时删除OSS中冗余的文件
三十分钟未支付---->取消订单。
定时发送短信---->11.11====>
(1)引入quartz依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
(2)配置定时器任务
@Component //交于spring容器该类对象
public class QuarzConfig {
@Autowired
private EmpMapper empMapper;
@Scheduled(cron = "0/5 * * * * ? ")
public void show(){
//1.查询过期的订单
List<Emp> emps = empMapper.selectList(null);
System.out.println(emps);
//2.删除过期的订单
}
}
(3)开启定时器注解驱动
@SpringBootApplication
@MapperScan(basePackages = "com.ykq.dao")
@EnableScheduling //开启定时器注解
public class Qy163Springboot03Application {
public static void main(String[] args) {
SpringApplication.run(Qy163Springboot03Application.class, args);
}
}