Hello,今天给各位童鞋们分享的是SpringBoot,赶紧拿出小本子记下来吧
一 SpringBoot 介绍
原有Spring优缺点分析
优点:
Spring是于2003 年兴起的一个轻量级的Java 开源框架。
Spring为企业级Java开发提供了一种相对简单的方法,通过IOC和AOP,用简单的Java对象(POJO)实现之前只有EJB才能完成的事情。
缺点:
虽然Spring的组件代码是轻量级的,但它在开发时整合的配置却是重量级的,比如:
- 在管理整个项目依赖时,总是会发生jar包的版本冲突问题。
- 项目添加一个框架或者技术时,需要导入的maven依赖太多。
- 项目添加一个框架或者技术时,需要一个对应的xml配置文件。
SpringBoot 概述
SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
版本锁定
- 解决是maven依赖版本容易冲突的问题,集合了常用的并且测试过的所有版本
起步依赖
- 解决了完成某一个功能要整合的jar包过多的问题,集合了常用的jar包
自动配置
- 解决了整合框架或者技术的配置文件过多,集合了所有的约定的默认配置
内置Tomcat
- 通过内置的tomcat,无需再用其他外置的Tomcat就直接可以运行javaEE程序
总之:人们把Spring Boot 称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。
之前实现ssm整合:2个小时时间
现在学习了springboot,完成ssm整合:10分钟
二 快速入门
需求:浏览器访问localhost:8080/hello, 返回hello, springboot!这句话
1 搭建环境
创建springboot-qucik模块,导入依赖
2 UserController
@SpringBootApplication// 表示当前是一个springboot环境的启动类 public class QuickApplication {
public static void main(String[] args) {
SpringApplication.run(QuickApplication.class,args);
}
}
3 启动类
放在父包下.例如:com.itheima
4 启动并测试
三 入门解析
1 版本锁定
我们项目继承了spring-boot-starter-parent父工程,它内部有一堆已经指定好的版本号,组合了一套最优搭配的技术版本。
2 起步依赖
在各种starter中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程。
spring官网中,提供了大量功能的起步依赖,大家可以直接使用
例如:
很多第三方技术也提供了与springboot整合的起步依赖,比如:mybatis
下次课咱们讲如何自定义起步依赖
3 自动配置
springboot是基于约定的,大家约定好的,都这么用,所以很多配置都有默认值。
**比如说:**tomcat默认端口 8080、redis 默认端口6379 、session 的过期默认时间为30m等等
搜索:spring-configuration-metadata.json
四 配置文件
1 自定义配置文件
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,可以通过在resources下创建文件:
- application.yml
- application.yaml
- application.properties
注意:如果多个配置文件同时配置了相同的内容,SpringBoot以properties文件为准。
2 YAML简介
YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 xml 、properties格式方便。
YAML语法
严格区分大小写,层级之间使用缩进表示,属性值和冒号之间必须有空格
server:
port: 8082
YAML数据格式:
简单类型,特殊:username 和 name 不要指定 nickname: jack
对象类型 user: username: lucy #也可以使用${nickname}获取上面定义的jack age: 18
集合类型 addresList:
- '北京'
- '上海'
- '广州'
3 读取配置文件
@Value
此注解是Spring框架提供的,用来读取配置文件中的属性值并逐个注入到Bean对象的对应属性中。
Environment
此对象是Spring框架提供的,用来表示整个应用运行时的环境,可以读取配置文件中的属性值并逐个注入到Bean对象的对应属性中。
@ConfigurationProperties
此注解是Spring Boot框架提供的,用来快速、方便地将配置文件中的自定义属性值批量注入到某个Bean对象的多个对应属性中。
org.springframework.boot spring-boot-configuration-processor五 了解启动流程
六 整合其它框架
1 整合Junit
spring官方提供了junit起步依赖,在pom.xml当中导入即可
org.springframework.boot spring-boot-starter-test@SpringBootTest//声明这是springboot测试类 注意放到扫描的包及其子包下 //@SpringBootTest(classes = QuickApp.class)//声明这是springboot测试类,且指定启动类 @RunWith(SpringRunner.class) //@RunWith(SpringJUnit4ClassRunner.class)//也可以 public class TestJunit {
@Autowired
PersonProperties personProperties;
@Test
public void test0() {
System.out.println(personProperties);
}
}
2 整合SpringMVC
访问静态资源
现在,我们的项目是一个jar工程,那么就没有webapp,我们的静态资源该放哪里呢?
springboot启动时,加载org.springframework.boot.autoconfigure.web.ResourceProperties资源属性类
拦截器配置
拦截器也是我们经常需要使用的,在SpringBoot中该如何配置呢?
自定义一个springMVC拦截器类,实现 HandlerInterceptor 接口
@Component public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("拦截了请求。。。。");
return true;
}
}
自定义一个springMVC的配置类,实现WebMvcConfigurer接口
@Configuration // web环境的配置类,添加自定义拦截器 public class MyWebConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)
.addPathPatterns("/**")// 指定拦截路径
.excludePathPatterns("/a1.png");// 排除某个资源
}
}
3 整合Mybatis -理解
环境搭建
① 导入起步依赖
mysql mysql-connector-java 5.1.47 org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.1② 导入数据库
CREATE DATABASE springboot_db;
USE springboot_db;
CREATE TABLE tb_user (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
username varchar(20) NOT NULL COMMENT '用户名',
password varchar(20) NOT NULL COMMENT '密码',
nick_name varchar(30) DEFAULT NULL COMMENT '姓名',
age int(11) DEFAULT NULL COMMENT '年龄',
email varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
insert into tb_user(id,username,password,nick_name,age,email) values (1,'zhangsan','123456','张三',18,'test1@itcast.cn'),(2,'lisi','123456','李四',20,'test2@itcast.cn'),(3,'wangwu','123456','王五',28,'test3@itcast.cn'),(4,'zhaoliu','123456','赵六',21,'test4@itcast.cn'),(5,'tianqi','123456','田七',24,'test5@itcast.cn');
代码实现
① User实体
@Data @AllArgsConstructor @NoArgsConstructor public class User {
private Integer id;
private String username;
private String password;
private String nickName;
private Integer age;
private String email;
}
② UserMapper接口和映射
// @Mapper // 告诉springboot创建此接口的mapper代理对象,每个mapper接口上都需要加(麻烦) public interface UserMapper {
List<User> findAll();
}
映射文件不需要和接口同名同包了
<select id="findAll" resultType="User">
select * from tb_user
</select>
③ application.yml配置
数据源(连接池)、mybatis
数据源配置(2.0版本之后内置hikariCP连接池) spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/springboot_db username: root password: 1234 # 注意 springboot连接数据库时 密码为纯数字有可能报错
mybatis配置 mybatis: mapper-locations: classpath:mapper/** # 扫描并加载mapper映射文件 type-aliases-package: com.itheima.pojo # 实体别名 configuration: map-underscore-to-camel-case: true # 开启驼峰映射
开启日志 logging: level: com.itheima: debug # 日志级别:warn、info、debug
④ 启动类
⑤ 单元测试
@RunWith(SpringRunner.class) @SpringBootTest public class MybatisTest {
@Autowired
private UserMapper userMapper; // 这里面注入报错不用管
@Test
public void test01()throws Exception{
List<User> list = userMapper.findAll();
for (User user : list) {
System.out.println(user);
}
}
}
Druid连接池
我们在整合mybatis时发现,springboot 2.2.0版本之后,内置了HiKariCP连接池,那如何替换成阿里的druid连接池
① 导入druid依赖
com.alibaba druid 1.0.9② 修改application.yml
4 整合Mybatis Plus
简介
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行。
快速入门
需求
完成用户列表查询
大体步骤
- 导依赖,
- 写启动类
- 写实体–指定和那张表映射 @TableName
- 写mapper–继承BaseMapper
- 配置数据源
① 创建java模块,导入依赖
org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools runtime true org.springframework.boot spring-boot-configuration-processor true org.springframework.boot spring-boot-starter-test org.projectlombok lombok true mysql mysql-connector-java 5.1.47 com.baomidou mybatis-plus-boot-starter 3.4.0② 启动类
@SpringBootApplication // 启动类 @MapperScan("com.itheima.mapper") // 扫描包创建mapper代理对象 public class MPApplication {
public static void main(String[] args) {
SpringApplication.run(MPApplication.class, args);
}
}
③User实体
@Data @AllArgsConstructor @NoArgsConstructor @TableName("tb_user") // 指定表名 public class User {
// 下面的成员属性需要与表中字段一一对应,默认开启了驼峰映射
private Long id;
private String username;
private String password;
private String nickName;
private Integer age;
private String email;
}
④ UserMapper接口
public interface UserMapper extends BaseMapper { // 继承父接口,自动生成CRUD方法 }
⑤ application.yml配置
数据源配置、开启日志
数据源配置(2.0版本之后内置hikariCP连接池)
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/springboot_db username: root password: root
开启日志
logging: level: com.itheima: debug # 日志级别:warn、info、debug
⑥ 单元测试
@RunWith(SpringRunner.class) @SpringBootTest public class MPTest {
@Autowired
private UserMapper userMapper;
@Test
public void test01()throws Exception{
List<User> list = userMapper.selectList(null);
for (User user : list) {
System.out.println(user);
}
}
}
CRUD
就是来学习BseMapper提供的API方法
@SpringBootTest @RunWith(SpringRunner.class) public class TestMP {
@Autowired
UserMapper userMapper;
@Test
public void testFindAll() {
List<User> list = userMapper.selectList(null);
for (User user : list) {
System.err.println(user);
}
}
@Test
public void testInsert() {
//创建一个user对象,底层默认就是动态sql
User user = new User();
user.setUsername("xionger2");
user.setPassword("123");
user.setNickName("熊二");
userMapper.insert(user);
System.err.println(user.getId());
}
@Test
public void testUpdate() {
//创建一个user对象,底层默认就是动态sql
User user = new User();
user.setId(1403921804690546690L);
user.setUsername("xiaoer");
user.setNickName("小二");
user.setAge(22);
userMapper.updateById(user);
}
@Test
public void testDelete() {
userMapper.deleteById(1403921804690546690L);
}
@Test
public void testFindById() {
User user = userMapper.selectById(1);
System.out.println(user);
}
}
条件查询
官网QueryWrapper用于生成 sql 的 where 条件
@Test public void testFindByCondition() { //创建条件对象 QueryWrapper qw = new QueryWrapper<>();
qw.gt("age",18).likeRight("username","li").orderByDesc("age");
//qw.likeRight("username","li");// li%
//qw.likeLeft("username","li");// %li
//qw.like("username","li");//%li%
List<User> users = userMapper.selectList(qw);
for (User user : users) {
System.out.println(user);
}
}
自定义sql
在实际开发中,有些特殊需求,可能mp没有实现此功能,没关系我们可以自定义扩展
内置分页插件
@Configuration //加入spring容器 public class MPConfig {
@Bean
public MybatisPlusInterceptor createPageInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//添加mysql的分页插件
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return mybatisPlusInterceptor;
}
}
测试代码
@Test public void testFindByPage() { //设置分页r> page = new Page<>(2, 5);
page = userMapper.selectPage(page, null);
//输出总记录数
System.out.println(page.getTotal());
//输出当前页的list
List<User> list = page.getRecords();
for (User user : list) {
System.err.println(user);
}
}
七 扩展-热部署
在开发过程中,通常会对一段业务代码不断地修改测试,在修改之后往往需要重启服务,有些服务需要加载很久才能启动成功,这种不必要的重复操作极大的降低了程序开发效率。为此,Spring Boot框架专门提供了进行热部署的依赖启动器,用于进行项目热部署,而无需手动重启项目
- pom.xml
2.选择IDEA工具界面的【File】->【Settings】选项,打开Compiler面板设置页面
3.在项目任意页面中使用组合快捷键“Ctrl+Shift+Alt+/”打开Maintenance选项框,选中并打开Registry
4.找到“compiler.automake.allow.when.app.running”,将该选项后的Value值勾选
5.想让修改后的代码立即生效,ctrl+F9
好啦,今天的文章就到这里了,希望能够帮助到屏幕前迷茫的你们