# SpringBoot **Repository Path**: amespaces/spring-boot ## Basic Information - **Project Name**: SpringBoot - **Description**: study SpringBoot - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-11 - **Last Updated**: 2022-07-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README https://gitee.com/amespaces/spring-boot.git [TOC] # SpringBoot简介 ## 入门案例 - SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来**简化Spring应用的初始化搭建以及开发过程** 选择springweb 直接做开发控制器 运行application - 快速执行,直接package,jar包使用cmd java -jar 包名(有插件的) ## 配置文件 1.application.properties ```xml server.port=80 ``` 2.applicaton.yml ``` server; port:80//有个空格 ``` 3.application.yaml ``` server; port:80//有个空格 ``` - 如果三个文件都有以先1后2再3的顺序 - 后面的yaml和yml需要自己配置,解决提示消失问题 ## yaml语法规则 - 大小写敏感 - 属性层级该安息使用多行描述,每行结尾使用冒号结束 - 使用缩进表示层级关系,同级左侧对齐,只允许使用空格(不允许tab) - /# 表示注释/ - 注意:数据前面要加空格 application.yaml ``` lesson: SpringBoot server: port: 80 enterprise: name: itcast age: 18 tel: 183 subject: - java - 前端 - 后端 ``` - 数组数据再数据书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔 ## yaml数据格式读取方式 ```java package com.example.springboot_01_quickstart.controller; import com.example.springboot_01_quickstart.domain.Enterprise; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/books") public class BookController { //方式一 @Value("${lesson}") private String lesson; @Value("${server.port}") private String port; @Value("${enterprise.subject[0]}") private String subject_0; //方式二使用enviroment @Autowired private Environment environment; //方式三 使用bean @Autowired private Enterprise enterprise; @GetMapping("/{id}") public String getByid(@PathVariable Integer id){ System.out.println(lesson); System.out.println(environment.getProperty("lesson")); System.out.println(environment.getProperty("server.port")); System.out.println(environment.getProperty("enterprise.subject[0]")); System.out.println("---------------"); System.out.println(enterprise.getAge()); System.out.println(enterprise.getName()); System.out.println("id=>"+id); return "hello,springboot"; } } ``` 方式三自定义对象封装数据 ```java package com.example.springboot_01_quickstart.domain; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Arrays; @Component @ConfigurationProperties(prefix = "enterprise") public class Enterprise { private String name; private Integer age; private String tel; private String[] subject; @Override public String toString() { return "Enterprise{" + "name='" + name + '\'' + ", age=" + age + ", tel='" + tel + '\'' + ", subject=" + Arrays.toString(subject) + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String[] getSubject() { return subject; } public void setSubject(String[] subject) { this.subject = subject; } } ``` - 自定义对象分装数据警告解决方案 ```xml org.springframework.boot spring-boot-configuration-processor true ``` ## 多环境开发配置 ### 多环境启动命令格式 ```yaml #测试 spring: profiles: active: test server: port: 80 ``` - 带参数启动SpringBoot ``` java -jar springboot.jar --spring.profiles.active=test java -jar springboot.jar --server.port=88 //整合一起就是 java -jar springboot.jar --server.port=88 --spring.profiles.active=test ``` ### 参数加载优先级 ### 多环境开发控制 maven? boot? pom.xml中 ```xml dev pro true test ``` ```yaml #设置启用环境 spring: profiles: active: dev --- #开发 spring: profiles: dev server: port: 80 --- #生产 spring: profiles: pro server: port: 81 --- # spring: profiles: test server: port: 82 --- ``` 使用java - jar .... 端口为80,说明dev生效,pom里面的pro生效并没有生效 解决 ```xml dev dev pro pro true test test ``` ``` #设置启用环境 spring: profiles: active: ${profile.active} --- #开发 spring: profiles: dev server: port: 80 --- #生产 spring: profiles: pro server: port: 81 --- # spring: profiles: test server: port: 82 --- ``` 现在执行的8080端口,因为现在的pom不能干预配置文件 添加插件 ```xml true ``` ### 配置文件分类 - SpringBoot中4级配置文件 1级: file: config/application.yml [最高] 2级: file: application.yml 3级: classpath: config/application.yml 4级: classpath: application.yml ## 整合第三方技术 ### 整合JUnit @SpringBootTest 如果测试类在SpringBoot启动类的包或子包中,可以省略启动类的设置,也就是省略classes的设定 ### 整合Mybatis 1.导入模块 2.导入所需技术集(mybatis\mysql) 3.设置数据源参数 ```yaml spring: datasource: driver-lass-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost;3306/mybatis username: root password: 1234 type: com.alibaba.druid.pool.DruidDataSource #记得添加druid坐标 #注意SpringBoot版本低于2.4.3mysql驱动大于8.0需要在url连接串中配置时区 ``` @Mapper ### 基于SpringBoot的ssm整合案例 1. pom.xml 配置起步依赖,必要的资源坐标 2. application.yaml 设置数据源参数端口等 3. 配置类 不需要 4. dao 设置@Mapper 5. 测试类 # Mybatis Plus ## 简介 ### 入门案例 - MybatisPlus简称MP是基于Mybatis框架基础上开发的增强型工具,简化开发、提高效率 - 定义数据接口 ```java @Mapper public interface UserDao extends BaseMapper { } ``` ```xml com.baomidou mybatis-plus-boot-starter 3.4.0 com.alibaba druid 1.1.16 ``` application.yml ```yml spring: datasource: driver-lass-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC username: root password: 1234 type: com.alibaba.druid.pool.DruidDataSource #记得添加druid坐标 #注意SpringBoot版本低于2.4.3mysql驱动大于8.0需要在url连接串中配置时区 ``` ## 标准数据层开发 工具lombok ```xml org.projectlombok lombok 1.18.20 ``` ### 条件查询的三种格式 ```java package com.itheima.mybatisplus_02_dql; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.itheima.mybatisplus_02_dql.dao.UserDao; import com.itheima.mybatisplus_02_dql.domain.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.sql.Wrapper; import java.util.List; @SpringBootTest class Mybatisplus02DqlApplicationTests { @Autowired private UserDao userDao; @Test void testGetAll(){ //按条件查询,第一次种方式 QueryWrapper wrapper = new QueryWrapper(); wrapper.lt("age",18); List users = userDao.selectList(wrapper); System.out.println(users ); } @Test void testGetAll2(){ //方式二 ,lambda格式 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().lt(User::getAge,18); List users = userDao.selectList(wrapper); System.out.println(users); } @Test void testGetAll3(){ //方式三lambda格式 LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper(); lambdaQueryWrapper.lt(User::getAge,18); List users = userDao.selectList(lambdaQueryWrapper); System.out.println(users); } } ``` ### 多条件查询 ```java @Test void testGetAll3(){ //方式三lambda格式 LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper(); //10—30岁之间 // lambdaQueryWrapper.lt(User::getAge,10).gt(User::getAge,30); //<10 or >30 lambdaQueryWrapper.lt(User::getAge,10).or().gt(User::getAge,30); List users = userDao.selectList(lambdaQueryWrapper); System.out.println(users); } ``` ### 条件查询null值判定 ```java @Test void testGetUser(){ //模拟页面传递过来的查询数据 UserQuery userQuery = new UserQuery(); userQuery.setAge(10); userQuery.setAge2(30); //null判定 LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); // lambdaQueryWrapper.lt(User::getAge,userQuery.getAge2()); //先判定第一个参数是否为true,如果为true连接当前条件 lambdaQueryWrapper.lt(null!=userQuery.getAge2(),User::getAge,userQuery.getAge2()); lambdaQueryWrapper.gt(null!=userQuery.getAge(),User::getAge,userQuery.getAge()); List users = userDao.selectList(lambdaQueryWrapper); System.out.println(users); } ``` ### 查询投影 1.查询结果包含模型类种的部分属性 只适用于lambda格式 ```java LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.select(User::getId,User::getName,User::getPassword); List users = userDao.selectList(lambdaQueryWrapper); System.out.println(users); } ``` 2.查询结果包含模型类中未定义的属性 ```java QueryWrapper qm = new QueryWrapper(); qm.select("count(*) as count, tel "); qm.groupBy("gender"); List> maps = userDao.selectMaps(qm); System.out.println(users); ``` ### DQL编程控制 ```java void testQuery(){ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper(); //等同于 lambdaQueryWrapper.eq(User::getName,"Jerry").eq(User::getAge,18); User user = userDao.selectOne(lambdaQueryWrapper); System.out.println(user); } @Test void testBetween(){ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.between(User::getAge,10,30); List users = userDao.selectList(lambdaQueryWrapper); System.out.println(users); } /** 以及likeLeft,likeRight */ @Test void testLike(){ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.like(User::getName,"Tom"); } ``` ### DQL 编程控制 #### 字段映射与表名映射 1.使用@TableField(value="pwd ") 2.@TableField(exist = false)//说明该成员变量在数据库字段不存在 3.可以使用@TableValue(select =false)//表明该字段不参与查询如pwd 4.表名与编码开发设计不同步@TableName("tb_user") ```java @Data @TableName("tb_user")//与数据库表名不一致 public class User{ private Long id; private String name; @TableField(value = "pwd",select = false)//与数据库字段不一致 private String password; private Integer age; private String tel; @TableField(exist = false)//字段不存在 private String online; } ``` ## DML控制 ### DML编程控制 - id生成策略控制 - @TableId ``` public class User{ @TableId(type = IdType.AUTO) private Integer id; } ``` - type:设置主键属性的生成策略,值参照IdType枚举值 - AUTO(0):使用数据库id自增策略控制id生成 - NONE(1):不设置id生成策略 - INPUT(2):用户手工输入id - ASSIGN_ID(3):雪花算法生成id - ASSIGN_UUID(4):以UUID生成算法作为id生成策略 可以在配置类设置全局设定 ```yaml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC username: root password: 1234 type: com.alibaba.druid.pool.DruidDataSource mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: banner: false db-config: id-type: assign_id table-prefix: tbl_ ``` ### 多记录操作 1.多记录删除(deleteBatchIds) ``` List list = new ArrayList(); list.add(1); list.add(2); userDao.deleteBatchIds(list); ``` ### 逻辑删除 步骤 - 数据库表中添加逻辑删除标记字段 - 实体类(@TableLogic) ``` public class User{ private Long id; @TableLogic(value ="0", delval="1") private Integer deleted; } ``` - 使用通用逻辑配置 - ```yaml mybatis-plus: global-config: db-config: # 属性名 logic-delete-field: deleted # 值 logic-not-delete-value: 0 logic-delete-value: 1 ``` 相当于执行update tbl_user set deleted= 1 where id =? and deleted=0; ## 乐观锁 - 设置拦截器 ```java @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ //1.定义拦截器 MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); //2.添加具体的拦截器 mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); //3.添加乐观锁拦截器 mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor); return mybatisPlusInterceptor; } ``` - 数据库设置version字段 - ```java @Data @TableName("tb_user")//与数据库表名不一致 public class User{ private Long id; private String name; @TableField(value = "pwd",select = false)//与数据库字段不一致 private String password; private Integer age; private String tel; @TableField(exist = false)//字段不存在 private String online; @Version private I } ``` - 案例 ```java void testUpdate(){ //先查询 User user = userDao.selectById(1L); user.setName("tom"); userDao.updateById(user); } ``` 执行修改时使用version字段作为乐观锁检查依据 update tbl_user set name=?, age=?,tel=?,version=? where id=? and version=?; ## 快速开发 ### 代码生成器 ```xml com.baomidou mybatis-plus-generator 3.4.0 org.apache.velocity velocity-engine-core 2.2 ``` ```java AutoGenerator autoGenerator = new AutoGenerator(); //数据源 DataSourceConfig dataSource = new DataSourceConfig(); dataSource.setDriverName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"); dataSource.setUsername("root"); dataSource.setPassword("1234"); //设置全局配置 GlobalConfig globalConfig = new GlobalConfig(); // 包相关配置 PackageConfig packageConfig = new PackageConfig(); //策略配置 StrategyConfig strategyConfig= new StrategyConfig(); //.....略 //创建生成器对象,执行生成操作 autoGenerator.setDataSource(dataSource); autoGenerator.execute(); } ```