9_SpringBoot
一. 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的目录结构
- pom.xml文件
- 指定了一个父工程: 指定当前工程为SpringBoot, 帮助我们声明了starter依赖的版本
- 项目的元数据: 包名, 项目名, 版本号
- 指定了properties的信息: 指定了java版本为1.8
- 导入依赖: 默认情况导入spring-boot-starter, spring-boot-starter-test
- 插件: spring-boot-maven-plugin
- .gitignore文件: 默认帮我们忽略一些文件和目录
- src目录
-src
-main
-java
-包名
启动类.java #需要将controller类, 放在启动类的子包中或者同级目录下
-resources
-static #存放静态资源的
-templates #存放模板页面的
application.properties #SpringBoot提供的唯一配置文件(可以改为yaml或yml的格式)
-test #为了测试
2.3 SpringBoot两种启动方式
- 运行启动类中的main方法即可运行SpringBoot工程
- 采用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就是一个组合注解
@SpringBootConfiguration就是@Configuration注解, 代表启动类就是一个配置类
@EnableAutoConfiguration是用来实现自动装配的, SpringBoot工程启动时, 运行一个SpringFactoriesLoader的类, 加载META-INF/spring.factories配置类(已经开启的), 通过SpringFactoriesLoader中的load方法, 以while循环的方式, 一个一个加载
好处: 无需编写大量的整合配置信息, 只需按照SpringBoot提供好的约定去整合即可
坏处: 如果说我们导入了一个starter依赖, 那么就需要填写其对应的配置信息,否则就会报错
手动关闭自动装配指定内容: @SpringBootApplication(exclude = QuartzAutoConfiguration.class)
@ComponentScan就相当于<context:component-scan base-Package="包名" /> 帮助扫描注解的
四. SpringBoot常用配置
4.1 SpringBoot的配置文件格式
- SpringBoot配置文件支持properties和yml, 甚至还支持json
- 更推荐使用yml文件格式
- yml文件, 会根据换行和缩进帮助我们管理配置文件的所在位置
- yml文件, 相比properties更轻量级一些
- yml文件的劣势:
- 严格遵循换行和缩进
- 在填写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的更多相关文章
随机推荐
- Arm32进行远程调试
Arm 32bit Goland 远程调试 32位支持issue Goland配置Go remote支持文档 https://mojotv.cn/go/golang-remote_debug Delv ...
- mysql 存储过程和触发器
存储过程 -- 声明结束符 -- 创建存储过程 DELIMITER $ -- 声明存储过程的结束符 CREATE PROCEDURE pro_test() --存储过程名称(参数列表) BEGIN - ...
- Java学习(二)Dos
打开CMD方式 开始+系统+命令提示符 WIN键+R 输入cmd 在任意的文件夹下面,按住SHIFT键+鼠标右键,在此处打开命令行窗口 在资源管理器的地址栏前面加上cmd 路径 常用Dos命令 #盘符 ...
- MySQL-配置参数时 报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu......
报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu...... 原因: 1.第一次配置参数时,不完整,出现错误!,(报错也会产生CMak ...
- Python逆向爬虫之scrapy框架,非常详细
爬虫系列目录 目录 Python逆向爬虫之scrapy框架,非常详细 一.爬虫入门 1.1 定义需求 1.2 需求分析 1.2.1 下载某个页面上所有的图片 1.2.2 分页 1.2.3 进行下载图片 ...
- Word 脚注和尾注是什么?怎么设置?
描述 脚注一般位于页面的底部,作为文档某处内容的注释.尾注一般位于文档的末尾,列出引文的出处等. 设置脚注和尾注 将光标移动到要插入脚注或尾注的地方,然后点击"引用"选项卡. 左边 ...
- Spring源码-xml解析
Spring使用SAX解析xml.SAX的全称是Simple APIs for XML,也即XML简单应用程序接口.与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式. ...
- 自定义注解,利用AOP实现日志保存(数据库),代码全贴,复制就能用
前言 1,在一些特定的场景我们往往需要看一下接口的入参,特别是跨系统的接口调用(下发,推送),这个时候的接口入参就很重要,我们保存入参入库,如果出问题就可以马上定位是上游还是下游的问题(方便扯皮) 2 ...
- LOJ2312 LUOGU-P3733「HAOI2017」八纵八横 (异或线性基、生成树、线段树分治)
八纵八横 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路的两端都是城市(可能两端是同一个 ...
- 漂亮简洁的PHP导航源码-蘑菇导航
蘑菇导航 蘑菇导航是根据SimpleWebNavigation修改而来的一个php网址导航.支持php8,支持左侧锚点,支持自定义fontawesome图标. 可以作为群组导航.图床导航.vps导航等 ...