简介
Spring
程序缺点 : 依赖设置繁琐 ,配置繁琐
SpringBoot
程序优点 : 起步依赖(简化依赖配置),自动配置(简化常用工程相关配置),辅助功能(内置服务器,……)
制作springboot工程:
- idea不能联网,可以从spring官网下载Springboot项目.
- spring官网用不了,可以去阿里云下载
- 阿里云用不了就自己做
创建springboot项目
- 创建普通
Maven
工程 - 继承
spring-boot-starter-parent
- 添加依赖
spring-boot-starter-web
- 制作引导类
Application
springboot项目解析
1 . 开发SpringBoot程序要继承spring-boot-starter-parent
.
继承 spring-boot-starter-parent
有以下几个优点:
- 统一的版本管理:Spring Boot
官方维护了一个统一的依赖版本清单,这些版本已经经过充分的测试,保证了兼容性。
- 默认插件配置:它自动为项目配置了一些 Maven
插件(比如 Spring Boot
插件、Jar
打包插件等),简化了配置工作。
- 默认构建生命周期:通过继承,可以使用 Spring Boot 提供的一些默认构建生命周期,避免需要自行配置很多参数。
2. spring-boot-starter-parent中定义了若干个依赖管理 , 保证了项目中所有相同的依赖使用的是相同的版本。
3. 继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突 ,确保了所有使用相同技术的库之间的依赖版本一致,从而避免了这些版本冲突。
4. 继承parent的形式也可以采用引入依赖的形式实现效果
引导类
就是springboot
的启动类
ConfigurableApplicationContext context = SpringApplication.run(SpringBootCoureseLearningApplication.class, args);//初始化spring容器.
目录结构为:
服务器
内嵌tomcat
服务器的原理 : 将tomcat
服务器作为对象运行,并交给spring
容器管理.
变更内嵌服务器 : 修改依赖即可
三款服务器:
- tomcat(默认) : apache出品,粉丝多,应用面广,负载了若干较重的组件
- jetty : 更轻量级,负载性能远不及tomcat
- undertow : 负载性能勉强跑赢tomcat
配置文件配置日志相关信息
logging.level.root=INFO
- INFO:记录常规操作和关键事件,适用于监控和记录系统的正常运行。
- DEBUG:记录详细的调试信息,适用于开发和排查问题时使用。
- ERROR:记录错误和异常信息 ,适用于记录导致程序中断或不可恢复的错误。
配置文件:
三种配置文件 : properties
,yml
,yaml
, yml
是主流格式. 优先级逐渐递减
YAML文件扩展名 : .yml
, .yaml
.
yaml语法 :
- 区分大小写
- 层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格,不能使用
Tab
键 - 冒号和属性值之间用空格隔开
#
表示注释
读取yml文件中的数据
可以使用Environment
对象读取所有配置信息 :
@Autowired private Environment environment;
public void printConfig() {
String myProperty = environment.getProperty("my.property"); System.out.println("my.custom.property: " + myProperty); }
getProperty(String key)
:根据键值获取配置的属性值
自定义对象读取数据:
@ConfigurationProperties
: 将配置文件中的一组属性自动绑定到 Java 对象上
整合junit
@SpringBootTest
: 测试类注解 , 定义在测试类上方. 用于设置JUnit
加载的SpringBoot
启动类
@SpringBootTest(classes = Springboot05JUnitApplication.class)
classes
属性 : 设置SpringBoot
启动类 , 如果测试类在SpringBoot
启动类的包或子包中,可以省略启动类的设置(省略classes
的设定)
RESTful
使用:
- 设定http请求动作(
Get,Delete....
). - 设定请求参数 (路径变量).
几个注解:
@RequestParam
: 接收url
地址传参或表单传参
@RequestBody
: 接收json
数据
@PathVariable
: 接收路径参数,使用 {参数名称}
描述路径参数
应用:
- 发送请求参数超过1个, 使用
@RequestBody
. - 发送非
json
格式数据, 选用@RequestParam
. - 采用
RESTful
进行开发, 当参数数量较少时,采用@PathVariable
接收请求路径变量,通常用于传递id
值.
@RequestMapping:
设置当前控制器方法的访问路径
@RequestMapping(value = "/users", method = RequestMethod.POST)
@ResponseBody
public string save(@RequestBody User user) {
System.out.println("user save..." + user);
return "{'module':'user save'}";
}
value
: 访问路径, method
: http请求动作.
@RequestMapping
写在类上,这个类的所有方法不需要再写该注解 , @RequestBody
同理
@RequestBody
和@Controller
合并成@RestController
注解
派生注解: @GetMapping
、@PostMapping
、@PutMapping
和 @DeleteMapping
, 不需要在使用 @RequestMapping
时指定 method
属性。
MyBatis-Plus
分页查询使用:
配置分页插件:
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
定义 Mapper 接口继承 BaseMapper
:
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
分页查询实现:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public Page<User> getPage(int current, int size) {
// 分页参数
Page<User> page = new Page<>(current, size);
// 查询分页数据
return userMapper.selectPage(page, null); // 第二个参数可以传入查询条件
}
}
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public Page<User> getUserPage(@RequestParam int page, @RequestParam int size) {
return userService.getPage(page, size);
}
}
分页时添加加查询条件, 使用QueryWrapper
:
public Page<User> getPageWithCondition(int current, int size, String name) {
// 分页参数
Page<User> page = new Page<>(current, size);
// 查询条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", name); // 查询 name 包含指定字符串的用户
return userMapper.selectPage(page, queryWrapper);
}
Page
对象的常用方法:
getRecords()
:获取当前页的数据列表。getTotal()
:获取总记录数。getCurrent()
:获取当前页码。getSize()
:获取每页记录数。getPages()
:获取总页数。
条件查询:
使用 QueryWrapper
基本查询条件:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "Tom"); // 等于查询,查询name字段为"Tom"的记录
queryWrapper.lt("age", 30); // 小于查询,查询age字段小于30的记录
queryWrapper.ge("salary", 5000); // 大于等于查询,查询salary字段大于等于5000的记录
常见操作:
eq(String column, Object val)
:等于ne(String column, Object val)
:不等于gt(String column, Object val)
:大于ge(String column, Object val)
:大于等于lt(String column, Object val)
:小于le(String column, Object val)
:小于等于like(String column, Object val)
:模糊匹配(like)notLike(String column, Object val)
:模糊不匹配in(String column, Collection<?> coll)
:在集合中between(String column, Object val1, Object val2)
:区间查询
使用 LambdaQueryWrapper
LambdaQueryWrapper
是 QueryWrapper
的一个增强版,它通过 Lambda 表达式保证了字段名的类型安全,避免了直接写字符串字段名时可能的拼写错误。
基本使用
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getName, "Tom")
.lt(User::getAge, 30)
.ge(User::getSalary, 5000);
// 执行查询
List<User> users = userMapper.selectList(lambdaQueryWrapper);
常见操作
eq(Predicate<T> column, Object val)
:等于ne(Predicate<T> column, Object val)
:不等于gt(Predicate<T> column, Object val)
:大于ge(Predicate<T> column, Object val)
:大于等于lt(Predicate<T> column, Object val)
:小于le(Predicate<T> column, Object val)
:小于等于like(Predicate<T> column, Object val)
:模糊匹配(like)notLike(Predicate<T> column, Object val)
:模糊不匹配in(Predicate<T> column, Collection<?> coll)
:在集合中between(Predicate<T> column, Object val1, Object val2)
:区间查询
- 使用
like
和likeLeft
,likeRight
like(String column, Object val)
:模糊查询likeLeft(String column, Object val)
:左模糊查询(例如:'%value'
)likeRight(String column, Object val)
:右模糊查询(例如:'value%'
)
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "Tom") // name包含"Tom"
.likeLeft("address", "New") // address以"New"开头
.likeRight("email", "@gmail.com"); // email以"@gmail.com"结尾
List<User> users = userMapper.selectList(queryWrapper);
- 组合查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", 1)
.and(wrapper -> wrapper.ge("age", 18).lt("age", 30)); // status = 1 且 (age >= 18 且 age < 30)
List<User> users = userMapper.selectList(queryWrapper);
使用 or
:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", 1)
.or().eq("status", 2); // (status = 1 or status = 2)
List<User> users = userMapper.selectList(queryWrapper);
传大量数据,一般用 : @RequestBody
, 量小就用 @Pathvariable