一. SpringBoot介绍

1.1. 引言

  • 为了使用SSM框架去开发, 准备SSM框架的模板配置
  • 为了使Spring整合第三方框架, 单独的去编写xml文件
  • 导致SSM项目后期xml文件特别多, 维护xml文件的成本是很高的
  • SSM工程部署也是很麻烦, 依赖第三方的容器
  • SSM开发方式很是笨重

1.2 SpringBoot

  • SpringBoot是由Pivota团队研发的,. SpringBoot并不是一门新技术, 只是将之前常用的Spring, SpringMVC, MyBatis等常用的框架封装到了一起, 帮助你隐藏这些框架的实现细节, 实现敏捷开发
  • SpringBoot就是一个工具集
  • SpringBoot的特点:
    • SpringBoot不需要模板化的配置
    • SpringBoot在整合第三方框架时, 只需要导入响应的starter依赖包, 就自动整合了
    • SpringBoot默认只有一个properties配置文件, 不推荐使用xml, 后期会采用Java的文件去编写配置信息
    • SpringBoot工程在部署时, 采用的是jar包的方式, 内部自动依赖Tomcat容器, 提供了多环境的配置
    • 后期要学习的SpringCloud需要建立在SpringBoot的基础上

二. SpringBoot快速入门

2.1 快速构建SpringBoot

  • IDEA中使用Spring Initializr创建SpringBoot项目
  • 创建过程和创建Maven项目区别不大
  • 中间可以选择语言(默认Java), 打包方式(默认Jar), Java版本(默认最新版,我手动改为Java8了), 还有各种依赖的选择(一般选Web)
  • 第一次创建SpringBoot工程时, 会下载大量的依赖, 一定要确保Maven已经配置了私服, 不然可能会下载失败
  • 创建完成后删除目前不需要的文件, 只留下.idea,src目录和pom.xml,以及.iml, .gitignore文件
  • 如果创建过程中没有勾选Web, 则需要在pom.xml中修改依赖
    • 把spring-boot-starter修改为spring-boot-starter-web即可
  • 然后编写Controller进行测试
package com.dz.springboot_study.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
@RequestMapping("/hello")
public class HelloController { @RequestMapping("/hello")
@ResponseBody
public String hello() {
return "Hello SpringBoot!";
}
}
  • 启动SpringBoot工程(运行启动类中的main方法)

2.2 SpringBoot的目录结构

  1. pom.xml文件

    1. 指定了一个父工程: 指定当前工程为SpringBoot, 帮助我们声明了starter依赖的版本
    2. 项目的元数据: 包名, 项目名, 版本号
    3. 指定了properties的信息: 指定了java版本为1.8
    4. 导入依赖: 默认情况导入spring-boot-starter, spring-boot-starter-test
    5. 插件: spring-boot-maven-plugin
  2. .gitignore文件: 默认帮我们忽略一些文件和目录
  3. src目录
-src
-main
-java
-包名
启动类.java #需要将controller类, 放在启动类的子包中或者同级目录下
-resources
-static #存放静态资源的
-templates #存放模板页面的
application.properties #SpringBoot提供的唯一配置文件(可以改为yaml或yml的格式)
-test #为了测试

2.3 SpringBoot两种启动方式

  1. 运行启动类中的main方法即可运行SpringBoot工程
  2. 采用jar包的方式
    • 将当前项目打包成一个jar文件
    • 通过java -jar jar文件

三. SpringBoot常用注解

3.1 @Configuration和@Bean

  • 之前使用SSM去开发时, 在xml文件中编写bean标签, 但是在SpringBoot不推荐使用xml文件
  • 导入lombok依赖(正常使用lombok还需在IDEA中下载插件)
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
  • @Configuration注解相当于bean标签
  • @Bean注解相当于bean标签
    • id="方法名 | 注解中的name属性"
    • class="方法的返回结果"
@Configuration//代表当前类是一个配置类
public class UserConfig { @Bean(name = "user1") //构建一个实例, 放进Spring容器中
public User user() { return new User("张三",18,true);
}
/*
* 以上写法相当于在.xml文件中的
* <beans>
* <bean id="user1" class="com.dz.pojo.User"/>
* </beans>
* */
}

3.2 @SpringBootApplication

  • @SpringBootApplication就是一个组合注解
  1. @SpringBootConfiguration就是@Configuration注解, 代表启动类就是一个配置类

  2. @EnableAutoConfiguration是用来实现自动装配的, SpringBoot工程启动时, 运行一个SpringFactoriesLoader的类, 加载META-INF/spring.factories配置类(已经开启的), 通过SpringFactoriesLoader中的load方法, 以while循环的方式, 一个一个加载

    好处: 无需编写大量的整合配置信息, 只需按照SpringBoot提供好的约定去整合即可

    坏处: 如果说我们导入了一个starter依赖, 那么就需要填写其对应的配置信息,否则就会报错

    手动关闭自动装配指定内容: @SpringBootApplication(exclude = QuartzAutoConfiguration.class)

  3. @ComponentScan就相当于<context:component-scan base-Package="包名" /> 帮助扫描注解的

四. SpringBoot常用配置

4.1 SpringBoot的配置文件格式

  • SpringBoot配置文件支持properties和yml, 甚至还支持json
  • 更推荐使用yml文件格式
    1. yml文件, 会根据换行和缩进帮助我们管理配置文件的所在位置
    2. yml文件, 相比properties更轻量级一些
  • yml文件的劣势:
    1. 严格遵循换行和缩进
    2. 在填写value时, 一定要在: 后面加上一个空格

4.2 多环境配置

  • 在application.yml中添加一个配置项
spring:
profiles:
active: 环境名
  • 在resources目录下, 创建多个application-环境名 .yml 文件即可
  • 在部署工程时 通过java -jar jar文件 --spring.profiles.active=环境

4.3 引入外部配置文件信息

  • 和传统的SSM方式一样, 通过@Value的注解去获取properties/yml文件中的内容
  • 如果在yml文件中需要编写大量的自定义配置, 并且具有统一的前缀时, 采用如下方式
@Component
@ConfigurationProperties(prefix = "person")
@Data
public class Person { private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String, Object> map;
private List<Object> list;
private Dog dog; }
person:
name: 张三
age: ${random.int}
happy: true
birth: 2000/01/01
map: {k1: v1,k2: v2}
list: [code,music,girl]
dog:
name: 小黑
age: 2
  • 使用@ConfigurationProperties注解时会出现爆红提示, 但不影响使用, 如想要消除爆红, 导入以下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

4.4 热加载

  • 导入以下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
  • 修改IDEA设置 Settings > Build,Execution > Compiler > 勾选Build project automatically
  • 之后项目内容修改后,只需Build一下即可,无需重新部署项目

五. SpringBoot整合MyBatis

5.1 xml方式整合MyBatis

5.1.1 导入依赖
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
5.1.2 准备实体类
  • 数据库表准备完成后, 可以手动创建实体类, 也可以使用IDEA自动创建实体类, 这里我们使用第二种

    • IDEA连接MySQL, 出现时区问题加上Asia/Shanghai
    • 选中要建实体类的表 ==> 右键选择Scripted Extensions ==> Generate Pojos.groovy, 然后选择实体类创建的位置
//部门表
package com.dz.pojo; import lombok.Data; import java.io.Serializable; @Data
public class TDepartment implements Serializable { private Integer id;
private String name;
private String location; }

//员工表
package com.dz.pojo; import lombok.Data; import java.io.Serializable; @Data
public class TEmployee implements Serializable { private Integer id;
private String name;
private double salary;
private TDepartment department; }
5.1.3 准备Mapper接口
package com.dz.mapper;

import com.dz.pojo.TEmployee;
import org.springframework.stereotype.Repository; import java.util.List; @Repository("empMapper")
public interface EmpMapper {
List<TEmployee> findAll();
}
5.1.4 扫描Mapper接口所在的包
  • 在启动类上添加注解, 扫描Mapper接口所在的包
@MapperScan(basePackages = "com.dz.mapper")
5.1.5 准备Mapper映射文件
  • resources目录下创建mapper目录, 用来存放Mapper映射文件

EmpMapper.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.dz.mapper.EmpMapper">
<resultMap id="emp_resultMap" type="TEmployee">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="salary" property="salary"/>
<association property="department" javaType="TDepartment">
<id column="dpt_id" property="id"/>
<result column="dpt_name" property="name"/>
<result column="location" property="location"/>
</association>
</resultMap>
<!--List<TEmployee> findAll();-->
<select id="findAll" resultMap="emp_resultMap">
select emp.id,emp.name,salary,dpt.id dpt_id,dpt.name dpt_name,dpt.location
from t_employee emp
join t_department dpt
on emp.dept_id=dpt.id
</select>
</mapper>
5.1.6 添加yml文件配置信息
  • MyBatis设置

    • 扫描映射文件
    • 配置实体类别名
#MyBatis设置
mybatis:
#扫描映射文件
mapper-locations: classpath:mapper/*.xml
#配置别名扫描的包, 别名=实体类类名
type-aliases-package: com.dz.pojo
#开启驼峰映射配置
configuration:
map-underscore-to-camel-case: true
5.1.7 指定连接数据库的信息
#连接数据库的信息
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///mybatis_db
username: root
password: 8031
type: com.alibaba.druid.pool.DruidDataSource
5.1.8 测试
  • 直接在EmpMapper接口双击接口名选中右键 ==> Go to ==> Test
  • 选中我们要测试的方法findAll, 就会自动创建当前接口的测试类EmpMapperTest.java
  • 给SpringBoot的主测试类加一个public, 然后让我们的EmpMapperTest测试类继承SpringBoot的主测试类, 就可以进行测试了
package com.dz.mapper;

import com.dz.Springboot02ConfigApplicationTests;
import com.dz.pojo.TEmployee;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import java.util.List; class EmpMapperTest extends Springboot02ConfigApplicationTests { @Autowired
private EmpMapper empMapper; @Test
void findAll() {
List<TEmployee> tEmployees = empMapper.findAll();
for (TEmployee tEmployee : tEmployees) {
System.out.println(tEmployee);
}
}
}
  • 如果出现timezone之类的错误,就在.yml中的数据库连接配置中的url后面加上?serverTimezone=Asia/Shanghai, 因为SpringBoot默认导入的mysql是8.X的

5.2 注解方式整合MyBatis

5.2.1 创建Department的Mapper接口
package com.dz.mapper;

import com.dz.pojo.TDepartment;
import org.apache.ibatis.annotations.Param; import java.util.List; @Repository("dptMapper")
public interface DptMapper {
//查询所有部门
List<TDepartment> findAll();
//根据id查一个部门
TDepartment findOneById(@Param("id") Integer id);
}
5.2.2 添加MyBatis注解
  • 针对增删改查: @Insert, @Delete, @Update, @Select
  • 但还是需要在启动类中添加@MapperScan(basePackages = "com.dz.mapper")注解的, 只是不用在.yml配置文件中配置.xml文件的扫描和实体类别名了
package com.dz.mapper;

import com.dz.pojo.TDepartment;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import java.util.List; @Repository("dptMapper")
public interface DptMapper {
@Select("select * from t_department")
List<TDepartment> findAll(); @Select("select * from t_department where id=#{id}")
TDepartment findOneById(@Param("id") Integer id);
}
5.2.3 测试, 看到执行的sql语句
#查看sql语句
logging:
level:
com.dz.mapper: debug

package com.dz.mapper; import com.dz.Springboot02ConfigApplicationTests;
import com.dz.pojo.TDepartment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import java.util.List; class DptMapperTest extends Springboot02ConfigApplicationTests {
@Autowired
private DptMapper dptMapper; @Test
void findAll() {
List<TDepartment> departments = dptMapper.findAll();
for (TDepartment department : departments) {
System.out.println(department);
}
} @Test
void findOneById() {
TDepartment department = dptMapper.findOneById(1);
System.out.println(department);
}
}

5.3 SpringBoot整合分页助手

5.3.1 导入依赖
<!--分页助手PageHelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
5.3.2 测试使用
package com.dz.mapper;

import com.dz.Springboot02ConfigApplicationTests;
import com.dz.pojo.TEmployee;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import java.util.List; class EmpMapperTest extends Springboot02ConfigApplicationTests { @Autowired
private EmpMapper empMapper; @Test
void findAll() {
List<TEmployee> tEmployees = empMapper.findAll();
for (TEmployee tEmployee : tEmployees) {
System.out.println(tEmployee);
}
} @Test
void findAllByPage() {
//1. 执行分页
PageHelper.startPage(1,2);
//2. 执行查询
List<TEmployee> employees = empMapper.findAll();
//3. 封装PageInfo对象
PageInfo<TEmployee> pageInfo = new PageInfo<>(employees);
//4. 输出
for (TEmployee employee : pageInfo.getList()) {
System.out.println(employee);
}
}
}

9_SpringBoot的更多相关文章

随机推荐

  1. 003 Jwt登录流程图

    用户\角色\权限 用户是一个基本的单位 用户和角色的关系是多对多,所以要有一张保存用户和角色关系的中间表 角色也不能直接决定这个用户能做什么操作,有哪些权限, 需要再关联权限表决定 角色和权限也是多对 ...

  2. 丽泽普及2022交流赛day19 半社论

    目录 No Problem Str Not TSP 题面 题解 代码 Game 题面 题解 代码 No Problem 暴力 Str 存在循环节,大力找出来即可,长度显然不超过 \(10^3\) . ...

  3. 关于静态 RMQ 问题

    目录 1. 普通做法 2. Four Russian 算法 3. 随机数据的一种做法 4. 有关转 LCA 的做法 1.1. RMQ 转 LCA 再转 ±1RMQ(RMQ 标准算法) 1.2. 一个优 ...

  4. 解决 Vue 部署在域名子路由 问题

    我们先看下官方说明 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上,例如 https://www.my-app.com/ .如果应用被部署在一个子路径上,你就需要用这个选项指定 ...

  5. Apache DolphinScheduler&ShenYu(Incubating) 联合 Meetup,暖春 3 月与你相约!

    云霞出海曙,梅柳渡江春. 2022 年的早春在疫情中显得格外生机勃勃,虽然接下来寒流仍有可能造访国内部分地区,但开源的世界,早已热闹非凡! 2022 年 3 月 26 日(星期六), Apache D ...

  6. Linux 02 基本命令

    参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 工具 清屏 cl ...

  7. SpringBoot 注解简介(持续更新)

    虽然工作中交替会使用spring mvc 和spring boot 框架,但实际对spring中的很多注解并不是很了解,本篇将持续更新学习到的spring 注解. Spring 主入口类上的注解 Sp ...

  8. C++大数据的读写

    当一个文件1G以上的这种,使用内存文件映射会提高读写效率: 下边时段出自<windows核心编程>,读取一个大文件,然后统计里边字符出现次数的函数: __int64 CountOs(voi ...

  9. Python小游戏——外星人入侵(保姆级教程)第一章 07调整飞船速度 08限制飞船活动范围

    系列文章目录 第一章:武装飞船 07调整飞船速度 08限制飞船活动范围 一.代码及演示 1.修改settings 修改文件:settings.py 点击查看代码 #渗透小红帽python的学习之路 # ...

  10. 未来的可再生能源电网!FREEDM 论文阅读

    全文主旨[省时间快读] 背景: 论文标题:The Future Renewable Electric Energy Delivery and Management (FREEDM) System: T ...