springboot整合
1.springboot框架
1.1 什么是Springboot以及Springboot的特点。
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程 . 理解:spring框架搭建的步骤:[1]依赖 [2]配置文件。 使用springboot可以简化上面的两个步骤。
1.2 springboot的特点
① 创建独立的 Spring 应用程序
② 嵌入的 Tomcat,无需部署 WAR 文件
③ 简化 Maven 配置
④ 自动配置 Spring
⑤ 提供生产就绪型功能,如指标,健康检查和外部配置
⑥ 开箱即用,没有代码生成,也无需 XML 配置。
2 使用idea快速搭建springboot工程
2.1创建springboot工程
2.2 加载pom.xml配置依赖
创建controller层,conrtroller要在主体类包下(spring默认包扫描在主体类下)
2.3springboot 常用的配置文件类型.
properties和yml格式。他们的区别就是格式上不同。
properties格式如下:
#修改端口号
server.port=8888
# 修改上下文路径
server.servlet.context-path=/aaa
yml结构
server:
port: 8887
servlet:
context-path: /bbb
2.4 springboot整合数据源
druid数据源: ----连接数据库
(1) 在pom.xml引入相关的依赖。
<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) 在application.properties中配置数据源信息
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=root
spring.datasource.druid.initial-size=5
2.5 springboot整合mybatis
(1) 相关依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
(2) 在application.properties中添加mybatis配置
#指定映射文件所在的路径--
mybatis.mapper-locations=classpath:mapper/*.xml
#mybatis日志文件
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
(3)主体类中注解
(4)测试
mapper接口
public interface EmpMapper {
public List<Student> findAll();
}
实体类
@TableName(value = “tbl_student”)实体类与表名进行映射
//使用递增 要想使用递增策略:必须保证表中的id递增 需要在主键上在加上 @TableId(type = IdType.AUTO)
@Tableid注解的value属性值为表中主键的字段名既可以对应上
@TableField(exist = false) 表中不存在该字段
@TableField(value = “name”) 实体类的属性名与表中列名不一致时要进行修改
//@TableName(value = "tbl_student")实体类与表名进行映射
public class Student {
//表中的主键名不为id时,要进行人为修改
//mp中默认主键的生成策略: 雪花算法 唯一id值
//使用递增 要想使用递增策略:必须保证表中的id递增 需要在主键上在加上 @TableId(type = IdType.AUTO)
@TableId(type = IdType.AUTO)
private int sid;
//@TableField(value = "name") 实体类的属性名与表中列名不一致时要进行修改
private String sname;
private int age;
private int cid;
@TableField(exist = false) //表中不存在该字段
private Class aClass;
}
测试类
@SpringBootTest
class Qy163Springboot02ApplicationTests {
@Autowired
private StudentMapper studentMapper;
@Test
void contextLoads() {
System.out.println(studentMapper.findAll());
}
}
3 springboot自动装配原理]
3.1 springboot包扫描原理
包建议大家放在主类所在包或者子包。默认包扫描的是主类所在的包以及子包。
主函数在运行时会加载一个使用@SpringBootApplication标记的类。而该注解是一个复合注解,包含@EnableAutoConfiguration,这个注解开启了自动配置功能。 该注解也是一个复合注解,包含@AutoConfigurationPackage。 该注解中包含@Import({Registrar.class}),这个注解引入Registrar类。该类中存在registerBeanDefinitions,可以获取扫描的包名。
如果需要人为修改扫描包的名称则需要在主类上@ComponentScan(basepackage={“包名”})
3.2 springboot自动装配原理
思考: 有没有自己使用DispatcherServlet. 为什么DispatcherServlet能用。
主函数在运行会执行一个使用@SpringbootApplication注解的类,该注解是一个复合注解,包含@EnableAutoConfiguration, 该注解开启自动配置功能,该注解也是一个复合注解,包含@Import() 该注解需要导入AutoConfigurationImportSelector类。 该类会加载很多自动装配类,而这些自动装配类完成相应的自动装配原理。
更加详细的springboot自动装配原理可借鉴
链接: springboot自动装配
4 springboot整合mybatis-plus
4.1 mybatis-plus概述
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
不能替代mybatis ,以后对于单表操作的所有功能,都可以使用mp完成。但是链表操作的功能还得要校验mybatis.
4.2如何使用mp
(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)创建一个mapper接口
mapper需要继承BaseMapper<>
public interface UserMapper extends BaseMapper<User> {
}
(6)为接口生成代理实现类
@SpringBootApplication
@MapperScan(basePackages = "com.zyx.dao")
public class Qy163Springboot03Application {
public static void main(String[] args) {
SpringApplication.run(Qy163Springboot03Application.class, args);
}
}
(7)测试
@SpringBootTest
class Qy163Springboot03ApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void testFindById() {
User user = userMapper.selectById(6);
System.out.println(user);
}
}
4.3 使用mp完成CRUD
@SpringBootTest
class Springboot3ApplicationTests {
@Autowired
private StudentMapper studentMapper;
@Test
void insert() {
Student student= new Student();
student.setSname("zyz");
System.out.println(studentMapper.insert(student));
}
@Test
void delete() {
System.out.println(studentMapper.deleteById(5));
}
@Test
void findAllPage(){
Page<Student> page = new Page<>(1,2);
studentMapper.selectPage(page,null);
System.out.println("当前页的记录"+page.getRecords());//获取当前页的记录
System.out.println("获取总页数"+page.getPages());//获取当前页的记录
System.out.println("获取总条数"+page.getTotal());//获取当前页的记录
}
@Test
void update() {
Student student= new Student();
student.setSname("zy");
student.setSid(6);
System.out.println(studentMapper.updateById(student));
}
4.4 使用mp完成分页条件查询
1.创建分页插件
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
2.StudentMapper接口
public interface StudentMapper extends BaseMapper<Student> {
IPage<Student> findALl(IPage<Student> page,@Param("ew") Wrapper<Student> wrapper);
}
3.mapper.xml映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zyx.springboot3.mapper.StudentMapper">
<resultMap id="BaseResultMap" type="com.zyx.springboot3.pojo.Student">
<id property="sid" column="sid" jdbcType="INTEGER"/>
<result property="sname" column="sname" jdbcType="VARCHAR"/>
<result property="age" column="age" jdbcType="INTEGER"/>
<result property="cid" column="cid" jdbcType="INTEGER"/>
<association property="aClass" javaType="com.zyx.springboot3.pojo.Class" autoMapping="true">
<id property="cid" column="cid"/>
</association>
</resultMap>
<sql id="Base_Column_List">
sid,sname,age,
cid,c.cname
</sql>
<select id="findALl" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/> from student s join class c on s.cid=c.cid
//判断条件
<if test="ew !=null">
<where>
${ew.sqlSegment}
</where>
</if>
</select>
</mapper>
4.Test测试类
@SpringBootTest
class Springboot3ApplicationTests {
@Autowired
private StudentMapper studentMapper;
@Test
void findAllPage(){
Page<Student> page = new Page<>(1,3);
QueryWrapper<Student> wrapper = new QueryWrapper<>();
wrapper.le("sid",5);
studentMapper.findALl(page, wrapper);
System.out.println("当前页的记录"+page.getRecords());//获取当前页的记录
System.out.println("获取总页数"+page.getPages());//获取当前页的记录
System.out.println("获取总条数"+page.getTotal());//获取当前页的记录
}
}
5 springboot整合swagger2
5.1 什么是swagger2
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务的接口文档 . 接口: controller相应的路径方法
5.2 为什么是swagger2
目前的项目基本都是前后端分离,后端为前端提供接口的同时,还需同时提供接口的说明文档。但我们的代码总是会根据实际情况来实时更新,这个时候有可能会忘记更新接口的说明文档,造成一些不必要的问题。
5.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.zyx.controller")) //注意只为com.ykq.controller包下的类生成接口文档
.build();
return docket;
}
private ApiInfo getInfo(){
Contact DEFAULT_CONTACT = new Contact("王永亮", "http://www.baidu.com", "120@qq.com");
ApiInfo apiInfo=new ApiInfo("QY163心里测试系统API", "QY163心里测试系统API", "1.1.0", "http://www.jd.com",
DEFAULT_CONTACT, "志远科技", "http://www.aaa.com", new ArrayList<VendorExtension>());
return apiInfo;
}
}
(3)访问swagger在线文档
swagger在线文档
(4) swagger中常用的注解
使用swagger注解对接口参数加以说明。
@Api(tags=“”)====使用在controller类上
@ApiOperation(value=“”)====接口方法上 接口方法加以说明
@ApiParam(value = “”,name = “”,required = true)
@ApiModel====实体类
@ApiModelProperty===>实体类的属性说明
6.springboot整合定时器-quartz
Cron表达式在线工具
定时器: 在指定的时间执行相应的业务代码。
应用场景: 比如: 定时删除OSS中冗余的文件
三十分钟未支付---->取消订单。
定时发送短信---->11.11====>
(1)引入quartz依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
(2)配置定时器任务
Cron 表达式:* * * * * ?
@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.zyx.dao")
@EnableScheduling //开启定时器注解
public class Qy163Springboot03Application {
public static void main(String[] args) {
SpringApplication.run(Qy163Springboot03Application.class, args);
}
}