SpringBootDay
什么是SpringBoot?
Spring的一站式解决方案
Spring项目的开关,Spring全家桶的入口++
也是未来学习其他的框架的基础,所有框架的整合,都要基于SpringBoot
- 优点
简化了Spring项目的创建,运行,调试,部署,配置等等步骤
更专注于业务的开发,不去过多的关注配置
只需要按照约定(约定大于配置),集成配置好的框架,就可以使用
在SpringBoot项目创建的那一刻,它已经和许多框架整合完了
并且解决了大部分的依赖问题,解决了大部分的jar包冲突问题(仅限于特定版本之间)
- 缺点
过于优秀
创建项目
https://start.aliyun.com
//SpringBoot项目的启动类
//Component-scan 默认会扫描,当前启动类所在的包
//创建Controller的时候,需要注意,要按照约定,把包创建到com.javasm.bootdemo路径下
//如果不想按照约定来,需要手动添加 @ComponentScan("com.javasm")
//启动默认的端口号是8080,是没有项目路径的
@SpringBootApplication
public class Bootdemo1Application {//整个程序的入口public static void main(String[] args) {//Spring容器对象//创建Spring容器ApplicationContext applicationContext = SpringApplication.run(Bootdemo1Application.class, args);}}
查看代码
自动配置
SpringBoot ,默认使用的是Tomcat服务器
启动注解
打包
在创建springboot项目时自带了这个依赖,但是<skip>true</skip>没有注释
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><!--打包:打包jar包 运行jar包必须有一个main方法,作为程序入口--><!--仅仅影响打包,不影响日常开发--><mainClass>com.javasm.bootdemo.Bootdemo1Application</mainClass><!--<skip>true</skip>--></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin>
运行jar包之前,要确保idea中的程序是停止的
java -jar 包名
包名太长,使用tab键补齐
如果不停止,提示8080端口被占用
Banner
https://www.bootschool.net/
背景颜色${AnsiBackground.BRIGHT_GREEN}
字体颜色${AnsiColor.BRIGHT_RED}
版本信息${spring-boot.formatted-version}
在resources路径下,创建文件
- banner.txt
- banner.jpg
- banner.gif
配置文件
默认情况下
- application.properties
-
- 优先级更高
- application.yml
- application.yaml
yaml/yml
使用空格,作为层级,[不能使用tab]
相同的缩进表示相同的层级,只看空格的数量
通常情况下,默认的贵则:2个空格算1层
阅读性,要比.properties的配置文件好
属性和值之间,不能挨着,要有1个空格
YAML语法规则:
1、大小写敏感
2、使用缩进表示层级关系
3、禁止使用tab缩进,只能使用空格键
4、缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级。
5、使用#表示注释
6、字符串可以不用引号标注
javasm:name: xiaomingage: 12company:name: shangmaaddress: 863nameList:- xiaoming- xiaoqiang- lileitmap:{1001:abc,1002:aaa}arr1:[aaa,bbb,ccc]ctime:2024/12/30 11:11:11
使用自己的类,读取配置文件中的值
日常开发的时候,很少用到读取配置文件中的自定义属性
当你要配置一个新的框架(SpringBoot官方没有自动配置,框架本身也没有对SpringBoot自动配置)
配置好了框架之后,需要给框架源码的配置赋值的时候
- 引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>
- 实体类读取
@Component
@Data
@ConfigurationProperties(prefix = "javasm")
public class TestModel {private String name;private String password;private Integer age;private List<String> nameList;private Map<Integer,String> tmap;private String[] arr1;private Date ctime;private Company company;}@Data
public class Company {private String name;private String address;
}
@ResourceTestModel testModel;@GetMapping("/f2")public TestModel f2(){return testModel;}
静态资源文件
默认情况下,resources文件夹里的static文件夹,是用来存放静态资源文件的
异常处理
- 应付面试
@Component
public class TestErrorAttributes extends DefaultErrorAttributes {@Overridepublic Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {//如果是浏览器访问,返回的是错误页面//如果是访问接口,返回的是json数据Map<String, Object> map = super.getErrorAttributes(webRequest, options);System.out.println(map);map.put("code",3000);map.put("msg","异常信息");return map;}
}
实际使用
定义异常返回值
@AllArgsConstructor
@Getter
//默认情况下,json把enum转成json字符串的时候,是"ParameterNull",需要加上注解
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum JavasmExceptionEnum {ParameterNull(1001,"参数为空");private Integer code;private String msg;
}
自定义异常类
@Getter
public class JavasmException extends RuntimeException{JavasmExceptionEnum exceptionEnum;public JavasmException(JavasmExceptionEnum exceptionEnum) {super(exceptionEnum.getMsg());this.exceptionEnum = exceptionEnum;}
}
@RestControllerAdvice
public class JavasmExceptionAdvice {//处理自定义异常@ExceptionHandler(JavasmException.class)public ResponseEntity<JavasmExceptionEnum> f1(JavasmException e){JavasmExceptionEnum exceptionEnum = e.getExceptionEnum();return ResponseEntity.status(HttpStatus.OK).body(exceptionEnum);}//这样写也可以public JavasmExceptionEnum f2(JavasmException e){return e.getExceptionEnum();}
}
测试
@GetMapping("/f1")public R f1(Integer id){if (id == null){//自定义异常//只有在 抛出异常的代码,才知道这个是什么异常//throw new JavasmException("1000","参数不合法");throw new JavasmException(JavasmExceptionEnum.ParameterNull);}return R.ok("Hello Boooooook");}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class R {private Integer code;private String msg;private Object data;public R(Integer code, String msg) {this.code = code;this.msg = msg;}public static R ok(){return new R(200,"success");}public static R ok(Object data){return new R(200,"success",data);}}
MyBatis整合
- 导入依赖
<!--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.2.8</version></dependency><!--mybatis,去掉默认的连接池HikariCP--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version><exclusions><exclusion><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></exclusion></exclusions></dependency>
- 修改配置文件application.yml
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/qingqing?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: rootdruid:initial-size: 5max-active: 100min-idle: 10
mybatis:mapper-locations: classpath:mapper/*.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 修改启动类
@SpringBootApplication
//扫描的是dao的路径,mybatis中,把dao称为mapper
@MapperScan("com.javasm.bootdemo.*.dao")
public class Bootdemo1Application {public static void main(String[] args) {SpringApplication.run(Bootdemo1Application.class, args);}
}
- 添加了依赖,但是没有配置数据库信息
分页
<!--分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.3.0</version></dependency>
在不改变原有sql语句编码的情况下,在执行之前,先查询了总条数,然后在sql语句之后,追加了limit
拦截了数据库的请求,做了修改
@Overridepublic PageInfo<WebUserInfo> listPage(Integer pageSize, Integer pageNum) {//开启分页PageHelper.startPage(pageNum,pageSize);//查询全部List<WebUserInfo> list = webUserInfoDao.selectList();PageInfo<WebUserInfo> pageInfo = new PageInfo<>(list);return pageInfo;}