基础篇
# 基础篇
# SpringBoot基础
# 新建项目
- 设置maven版本 (使用默认设置 (opens new window))
- 测试一下
https://start.spring.io/的连接情况,setting——>http——>检测连接,连接上才可以创建工程 - 一般来说连接上都需要翻墙,新建项目都需要联网
- 使用阿里云网站
https://start.aliyun.com/
# 执行项目
使用
maven——package打一个jar包在命令行输入
java -jar jar包名例如java -jar demo1-0.0.1-SNAPSHOT.jarctrl+c退出服务springBoot主启动类
//springBoot 主启动类 @SpringBootApplication public class Demo1Application { public static void main(String[] args) { SpringApplication.run(Demo1Application.class, args); } }内嵌Tomcat服务器
- 内嵌Tomcat服务器的工作原理是将Tomcat服务器作为对象运行,并将对象交给Spirng容器管理。
jar 包
maven 打包插件
<plugins> <!-- Maven 打包插件--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins>jar包描述文件

端口占用解决


idea中配置临时属性 (一般不用,了解即可)
public static void main(String[] args) { //可以通过修改args来 增加一些临时配置 String[] arg=new String[1]; arg[0]="--server.port=8082"; SpringApplication.run(SsmApplication.class, arg); //可以在启动boot程序时断开读取外部临时配置对应的入口,也就是去掉读取外部参数的形参 args //SpringApplication.run(SsmApplication.class); }idea中的配置覆盖

# Linux下运行项目
- 等学会Linux,再来看 视频 (opens new window)
# 起步依赖
starter
- SpringBoot中常见的项目名称,定义了当前项目使用的所有项目坐标,以达到减少依赖配置的目的
parent
- 所有SpringBoot要继承的项目,定义了若干个坐标版本号,以达到减少依赖冲突的目的
实际开发
- 使用任意坐标时,仅书写
GVA中的G和A,V由SpirngBoot提供 - 如果发生坐标错误(可能性很小),在指定version
G: groupIdA: artifactIdV:version
- 使用任意坐标时,仅书写
换技术
不想用 tomcat,想用jetty
jetty更轻量级一些,内部功能很少,自己用到什么配什么;而tomcat 里面集成了相当多的功能
排除tomcat依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 排除 tomcat 服务器--> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>引入jetty依赖
<dependency><!-- 使用jetty服务器--> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
# 基础配置
# 官方配置 (opens new window)
# 配件文件格式
appplication.propertiesserver.port=82
application.yml主写这个,
server: port: 82 #设置端口号 servlet: context-path: /123 #增加访问前缀 #Tomcat started on port(s): 82 (http) with context path '/123' #访问时,需要增加前缀才可以访问到 #原访问路径 http://localhost:82/books/2 #现访问路径 http://localhost:82/123/books/2
application.yaml这个好像不支持
server: port: 81
配置文件优先级
appplication.properties>application.yml>application.yaml
# yaml
一种 数据序列化格式
优点
- 容易阅读
- 容易与脚本语言交互
- 以数据为核心,重数据轻格式
文件扩展名
.yml(主流).yaml
语法规则
大小写敏感
属性层级关系使用多行描述,每行结尾使用冒号结束(或者数据结束)
使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)——>(跟python类似)
属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
#表示注释logging: level: root: info #debug,info,warn 从前往后日志信息依次减少,info是默认数组数据在数据书写位置的下方使用减号作为数据的开始符合,减号和数据之间用空格分离
likes: - game - code
yaml文件中的变量引用
n: 崩坏三 game: # name: 崩坏三 name: ${n} #引用文件中的变量 #这句话和上面的意思是一样的yaml文件解析转义字符
lesson: "SpringBoot\tss" #用引号引起来,可以读取转义字符 \t 表示制表符tab # 读出lesson的值为 SpringBoot ss数据读取
server: port: 81 logging: level: root: info #debug,info,warn 从前往后日志信息依次减少,info是默认 game: name: 崩坏三 age: 4 likes: - 丽塔 - 爱丽希雅 - diana lesson: SpringBoot单个读取
//1.挨个配置,读取配置文件中的数据 @Value("${lesson}") private String lesson; @Value("${game.likes[0]}") private String like_0; @Value("${logging.level.root}") private String log;读取全部
//2.直接读取所有 @Autowired private Environment environment; System.out.println(environment.getProperty("lesson")); System.out.println(environment.getProperty("game.likes[0]")); System.out.println(environment.getProperty("logging.level.root"));自定义对象读取
这个用的多,可以在里面配置 mybatis 数据等,框架内部有定义好的对象,会读取咱们配置的数据,所有格式一定要对
自定义对象数据警告解决方案
<!-- 自定义对象封装数据警告解决方案--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>自定义对象写法
@Component @ConfigurationProperties(prefix = "game") //表明读取配置文件中的game public class Game { private String name; private Integer age; private String[] likes; } //3.使用java对象读取 @Autowired private Game game; System.out.println(game);
# 多环境启动
# yml
单文件配置
demo1项目中设置不同的环境,它们之间用
---分隔开他们之间的参数都是独立的,都是只归定义的环境所有,比如在 pro下定义的参数,使用test环境运行,就读取不到该参数。
但是写在最上面的参数,是它们公有的,都可以读取到
# 设置启用的环境 spring: profiles: active: pro # 这些参数是公共的,都可以使用 logging: level: root: info #debug,info,warn 从前往后日志信息依次减少,info是默认 game: name: 崩坏三 age: 4 likes: - 丽塔 - 爱丽希雅 - diana lesson: SpringBoot --- #开发 spring: config: activate: on-profile: dev server: port: 81 --- #生产 spring: config: activate: on-profile: pro server: port: 82 --- #测试 spring: config: activate: on-profile: test server: port: 83
多文件配置
demo2项目中- 可以将一个文件分拆成4个,一个主的,一个开发,一个生产,一个测试
- 注意 文件命名 参照图片

- 可以将一个文件分拆成4个,一个主的,一个开发,一个生产,一个测试
多环境开发独立配置文件


# properties
demo1项目中
只支持多文件配置
存到了bak 备份文件夹中
# Maven与SpringBoot
运行jar包的话,是maven打的包,所以maven优先级要高
在配置文件
application.yml中引用pom文件中定义的属性pom文件 要使用这个插件 帮助maven解析资源文件中的占位符<!-- 告诉maven 我要处理资源文件——资源文件中可以用${}读取maven的属性值 默认是resources文件夹--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.2.0</version> <configuration> <encoding>UTF-8</encoding> <useDefaultDelimiters>true</useDefaultDelimiters> </configuration> </plugin><!-- maven 多环境 配置--> <!-- 配置多环境--> <profiles> <!-- 开发环境--> <profile> <!-- id 随便起--> <id>dev</id> <properties> <!-- 自定义 属性 名字随便起 --> <profile.active>dev</profile.active> </properties> <!-- 设定 是否为默认环境--> <activation> <activeByDefault> true </activeByDefault> </activation> </profile> <!-- 生产环境--> <profile> <!-- id 随便起--> <id>pro</id> <properties> <!-- 自定义 属性 名字随便起 --> <profile.active>pro</profile.active> </properties> </profile> <!-- 测试环境--> <profile> <!-- id 随便起--> <id>test</id> <properties> <!-- 自定义 属性 名字随便起 --> <profile.active>test</profile.active> </properties> </profile> </profiles>application.yml文件# 设置启用的环境 spring: profiles: #active: dev #直接使用下面定义的 数据 active: ${profile.active} #使用pom文件中的 自定义的属性
# 参数配置
打jar包
- 把多余的配置文件 放入bak文件夹,留作备份,不用影响正常测试
- 把项目的语言环境设置为utf-8
- 使用
maven-clean,清除之前的包 - 使用
maven-package,打包
运行jar包 (可以使用命令行参数输入,来覆盖默认的参数)
java jar -demo1-0.0.1-SNAPSHOT.jar按照默认参数运行java jar -demo1-0.0.1-SNAPSHOT.jar --spring.profiles.active=test修改运行环境为 test环境java jar -demo1-0.0.1-SNAPSHOT.jar --server.port=88修改端口号为 88java jar -demo1-0.0.1-SNAPSHOT.jar --spring.profiles.active=test --server.port=88修改运行环境为 test,同时修改端口号为88
-

# 配置文件分类
1. 共有4种配置文件,1级 优先级最高,4级优先级最低 ———— 项目demo1中
file —— 一般做测试,或者生产的时候用这些来配置 —— 留作系统打包后设置通用属性
1级 file: config/application.yml 在jar所在目录下新建一个config包,里面放入配置文件,优先级最高
2级 file: application.yml 在jar所在目录下新建一个配置文件,优先级为第二
classpath —— 在做开发的时候,用这些配置 —— 留作系统开发阶段设置通用属性
3级 classpath : config/application.yml 在resource文件下新建一个config包,里面放入配置文件
4级 classpath : application.yml 在resource文件下新建一个配置文件,优先级最低
自定义配置文件 ———— 项目
ssm中- 默认配置文件名称为
application.yml,可以使用配置覆盖的方式,来自定义配置文件名称 spring.config.name只写名称,不写后缀名

- 可以在一个值内,同时配置多个文件,后面会覆盖前面一样的,前面的其他配置正常生效。
- 例 diana——server.port=80 , diana——server.port=82 ,执行结果是 82

- 默认配置文件名称为
基于微服务(SpringCloud)开发时,配置文件将使用配置中心进行管理,2 所说的自定义配置文件,用的地方不多,用处不大,了解即可。
# 日志
demo2项目中
# 代码
代码1 —— 使用日志来记录 比直接打印输出要好
import org.slf4j.LoggerFactory; import org.slf4j.Logger; public class BookController { //创建记录日志的对象 private static final Logger log= LoggerFactory.getLogger(BookController.class); @GetMapping("/{id}") public String getById(@PathVariable int id){ //日志的使用 比使用打印输出要好 log.debug("debug..."); //默认不开启 log.info("info..."); log.warn("warn..."); log.error("error..."); return "hello springBoot!"; } }代码2—— 使用注解——使用 @Slf4j 来代替 创建日志对象的代码 (需要导入 lombok 的包)
//日志的使用 @Slf4j @RestController @RequestMapping("/books") public class BookController { //创建记录日志的对象 // private static final Logger log= LoggerFactory.getLogger(BookController.class); //可以使用 @Slf4j 来代替 这一行代码 需要导入 lombok 的包 @GetMapping("/{id}") public String getById(@PathVariable int id){ //日志的使用 比使用打印输出要好 log.debug("debug..."); log.info("info..."); log.warn("warn..."); log.error("error..."); return "hello springBoot!"; } }
# 总*配置文件
- 可以设置总的日志级别 ——
root - 可以设置某个组的日志级别 ——
group
#日志设置
logging:
#设置分组
group:
my: com.diana
isservice: com.alibaba
level:
#设置总的日志级别
root: info #debug,info,warn 从前往后日志信息依次减少,info是默认
#设置某个包的日志级别
#com.diana.controller: debug #不推荐使用太麻烦
#设置某个组设置日志级别
my: debug
#设置日志的模板格式
#pattern:
#console: "%d--%m %n" # %d 表示时间; %m 表示消息; %n 表示换行
#console: "%d--%clr(%5p) %n" # %5p 表示消息,5表示 统一长度,p表示日志级别 ; %clr表示彩色,加在谁上面用括号包裹即可
#console: "%d--%clr(%5p) -----[%16t] %-40c %n" # %t表示线程名称 %c表示类名 %-40c 表示长度限制40,负号表示左对齐
#console: "%d--%clr(%5p) -----[%16t] %clr(%-40.40c){red} : %m %n" #%-40.40c 中的 .40 表示截取40位,就剩下40位
# %clr(){red} 表示设置日志颜色 red-红 cyan-青色
#保存日志
file:
name: server.log # 名字随便起
#path: #默认路径是项目最外部
#设置日志存储格式
logback:
rollingpolicy:
file-name-pattern: server.%d{yyyy-MM-dd}.%i.log
#设置文件名格式 server.2022-04-30.1.log %d 表示日期,{}里可以指定格式; %i表示第几个,从0开始
max-file-size: 4KB #设置最大上限
# 日志格式
默认格式

配置文件 修改日志输出格式
- 一般不用自己写,了解即可
#设置日志的模板格式 pattern: #console: "%d--%m %n" # %d 表示时间; %m 表示消息; %n 表示换行 #console: "%d--%clr(%5p) %n" # %5p 表示消息,5表示 统一长度,p表示日志级别 ; %clr表示彩色,加在谁上面用括号包裹即可 #console: "%d--%clr(%5p) -----[%16t] %-40c %n" # %t表示线程名称 %c表示类名 %-40c 表示长度限制40,负号表示左对齐 console: "%d--%clr(%5p) -----[%16t] %clr(%-40.40c){red} : %m %n" #%-40.40c 中的 .40 表示截取40位,就剩下40位 # %clr(){red} 表示设置日志颜色 red-红 cyan-青色
# 日志存储
#保存日志(单一日志,所有的日志都存入里面)
file:
name: server.log # 名字随便起
#path: #默认路径是项目最外部
#设置日志存储格式
logback:
rollingpolicy: #(设置滚动日志,日志存储到达上限后,新建一个日志)
file-name-pattern: server.%d{yyyy-MM-dd}.%i.log
#设置文件名格式 server.2022-04-30.1.log %d 表示日期,{}里可以指定格式; %i表示第几个,从0开始
max-file-size: 4KB #设置最大上限
# SpringBoot整合
# 整合 junit
- @SpringBootTest 设置Junit加载SpringBoot启动类(MybatisJunitApplication.java)
- 测试类和主启动类,要在一个包下,不然加载不了配置
package com.diana;
@SpringBootTest
class MybatisJunitApplicationTests {
@Autowired
private BookService bookService;
@Test
public void test1(){
bookService.save();
}
}
测试类和引导类不在一个包下时,要使用classes属性,声明引导类
@SpringBootTest(classes = JunitMybatisApplication.class)package com.test; //测试类和引导类不在一个包下时,要使用classes属性,声明引导类 @SpringBootTest(classes = JunitMybatisApplication.class) public class OneTest { @Autowired BookMapper bookMapper; @Test public void testMapper() { System.out.println(bookMapper.getById(2)); } }
# 整合mybatis
配置文件
springboot 2.4.2 以前会有时区问题, 需要加上
serverTimezone=UTC如果要设置数据源,需要导入
druid,导入这个坐标的话,只能用下面配置数据源的方式引入druid<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.9</version> </dependency>
#配置数据源 ————通用型 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql:///test?useSSL=false&useServerPrepStmts=true&serverTimezone=UTC #2.4.2以前需要设置时区 最后一个 username: root password: 1234 type: com.alibaba.druid.pool.DruidDataSource #设置数据源Mapper类
加上@Mapper 注解
@Mapper public interface BookMapper { @Select("select * from book where id=#{id}") Book getById(int id); }测试
@SpringBootTest class JunitMybatisApplicationTests { @Autowired BookService bookService; @Autowired BookMapper bookMapper; @Test public void testService() { bookService.save(); } @Test public void testMapper() { System.out.println(bookMapper.getById(2)); } }
# 整合 mybatisplus
- 项目在
mybatisplus中。 - md文件
# 整合druid
导入
druid简单使用,参照 整合mybatis中druid的导入整合
druid导入坐标 --(整合
druid专用坐标)<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.9</version> </dependency>完成配置 --(只有导入了上面的坐标,才能这样配置)
#整合druid spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql:///test?useSSL=false&useServerPrepStmts=true&serverTimezone=UTC #2.4.2以前需要设置时区 最后一个 username: root password: 1234
这两种方式 一样用,差不多
# 整合三方技术
- 导入对应的
starter - 根据提供的配置格式,配置非默认值对应的配置项
# SSM整合
引入数据源
<!--TODO 引入druid数据源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.9</version> </dependency># TODO 配置数据源相关信息 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql:///test?useSSL=false&useServerPrepStmts=true username: root password: 1234 server: port: 80添加@Mapper
//TODO 添加@Mapper @Mapper public interface BookMapper {}删除配置文件
将web静态资源放入
resources下的static中- 这样也不需要进行静态资源的放行
TODO 标签
- 使用该标签 标注,可以在下方通过点击的方式,进行快速定位
Ctrl+F12- 快速打开文件结构
# SSMP 整合
# 分页查询
Mapper
//使用mybatisPlus @Mapper public interface BookMapper2 extends BaseMapper<Book> {} //内部已经实现了一些基本的增删改查,不用自己手动实现了 //只需要自己手动实现一些比较复杂的多表操作即可IService
//TODO Ctrl+F12 快速打开 文件目录 //使用mybatisPlus //提供了很多基础的 CRUD操作 这些简单的不用自己再实现了 //自己去定义一些比较复杂的,切合项目需求的方法,尽量不要覆盖原有的方法 public interface IBookService extends IService<Book> { //自己定义方法 IPage<Book> getPage(int current, int pagesize); //分页操作 }IServiceImpl
//里面有很多基本的增删改操作 @Service ////使用mybatisPlus public class BookServiceImp2 extends ServiceImpl<BookMapper2,Book> implements IBookService { @Autowired private BookMapper2 mapper; //实现自己定义的方法 //分页操作 public IPage<Book> getPage(int current,int pagesize){ IPage<Book> page=new Page<Book>(current,pagesize); mapper.selectPage(page,null); return page; } } //IBookServiceTest //基本的增删改查操作对应 ————Book book=new Book(); // 添加 save(book) // 更新 updateById(book) // 按照id删除 removeById(9) // 查询单个 getById(3) // 查询全部 list()BookController
@GetMapping("/{currentPage}/{pageSize}") //分页操作 public Result bookIpage(@PathVariable int currentPage,@PathVariable int pageSize){ IPage<Book> page = bookService2.getPage(currentPage, pageSize); //如果当前页码值大于了总页码值,那么重新执行查询操作,使用最大页码值作为当前页码值 if(page.getCurrent()>page.getPages()){ page = bookService2.getPage((int)page.getPages(), pageSize); } //page里的数据不为null 也不为空--isEmpty() Integer code= (page.getRecords()!=null && !page.getRecords().isEmpty()) ? Code.GET_OK : Code.GET_ERR; return new Result(code,page); }基于业务需求维护删除功能
//如果当前页码值大于了总页码值,那么重新执行查询操作,使用最大页码值作为当前页码值 if(page.getCurrent()>page.getPages()){ page = bookService2.getPage((int)page.getPages(), pageSize); }
# 分页条件查询
IService
//TODO Ctrl+F12 快速打开 文件目录 //使用mybatisPlus //提供了很多基础的 CRUD操作 这些简单的不用自己再实现了 //自己去定义一些比较复杂的,切合项目需求的方法,尽量不要覆盖原有的方法 public interface IBookService extends IService<Book> { //自己定义方法 IPage<Book> getPage(int currentPage, int pageSize,Book book); //分页操作 }IServiceImpl ———— 在业务层完成 条件对象的创建及查询操作
//分页操作 public IPage<Book> getPage(int currentPage, int pageSize, Book book){ //创建查询对象 LambdaQueryWrapper<Book> lqw=new LambdaQueryWrapper<Book>(); lqw.like(book.getType()!=null,Book::getType,book.getType()) .like(book.getName()!=null,Book::getName,book.getName()) .like(book.getDescription()!=null,Book::getDescription,book.getDescription()); IPage<Book> page=new Page<Book>(currentPage,pageSize); mapper.selectPage(page,lqw); return page; }BookController
@GetMapping("/{currentPage}/{pageSize}") //分页条件查询 public Result bookIpage(@PathVariable int currentPage,@PathVariable int pageSize,Book book){//使用Book对象直接获取get方式的请求参数 //分页条件查询 IPage<Book> page = bookService2.getPage(currentPage, pageSize,book);//条件查询的事情交给业务层去做 //如果当前页码值大于了总页码值,那么重新执行查询操作,使用最大页码值作为当前页码值 if(page.getCurrent()>page.getPages()){ page = bookService2.getPage((int)page.getPages(), pageSize,book); } //page里的数据不为null 也不为空--isEmpty() Integer code= (page.getRecords()!=null && !page.getRecords().isEmpty()) ? Code.GET_OK : Code.GET_ERR; return new Result(code,page); }
# 教你一招
# 阿里云建立项目
- 使用阿里云网站
https://start.aliyun.com/创建SpringBoot工程
# 隐藏指定文件

