Bean:在Spring Boot中,Bean是一个被Spring容器管理的Java对象。 当Spring容器启动时,它会读取应用程序的配置文件(如application.properties或application.yml)并创建所有的Bean。 开发者可以在配置文件中定义Bean,也可以使用注解的方式定义Bean。
ioc容器:ioc容器是指由spring来负责控制对象的生命周期和对象间的关系。 ioc容器全称Inversion of Control
视频教程1
视频教程2
特点:
软件 | 版本 |
---|---|
JDK | 17.0.2 2022-01-18 LTS |
Maven | 3.9.6 |
IDEA | 2023.3 |
SpringBoot | 3.2.0 |
druid-spring-boot-3-starter | 1.2.20 |
MySQL Community Server | 8.0.35 |
mvn install:install-file -Dfile=D:\test.jar -DgroupId=com.kk -DartifactId=my-test -Dversion=1.0 -Dpackaging=jar
# 新建系统变量
JAVA_HOME #变量值:D:\Tools\SpringBoot\jdk17
#编辑系统变量
Path #添加变量值: %JAVA_HOME%\bin
# 新建系统变量
MAVEN_HOME #变量值:D:\Tools\SpringBoot\apache-maven-3.9.6
#编辑系统变量
Path #添加变量值: %MAVEN_HOME%\bin
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class MyApplication {
@RequestMapping("/")
String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
logging.level.root = "info"
logging.level.web = "warn"
logging.level.com.example = "trace"
# Log to File
logging.file.name= ./app.log
# Log Patterns
#logging.pattern.console=%d{yyyy-MMM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n
#logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%
#logging.pattern.console="[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level [%thread] [%logger - %line]: %m%n"
logging.pattern.console="%clr(%d{{LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr({LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n"
logging.pattern.file="[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level [%thread] [%logger - %line]: %m%n"
logging.pattern.console="%clr(%d{{LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr({LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n"
tools:
- C/C++
- Java
- SpringBoot
- MySQL
@SpringBootApplication是SpringBoot应用程序的核心注解,通常用于主类上。它包含了以下三个注解:
@RestController是一个组合注解,用于定义RESTful风格的Web服务。它包含了以下两个注解:
在控制器类上添加@RestController注解,然后在方法上添加相应的HTTP请求映射注解,例如:@GetMapping、@PostMapping等。
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, SpringBoot!";
}
}
@Autowired是Spring的核心注解之一,用于实现依赖注入。它可以自动装配Bean,无需手动创建和管理对象。
- 在需要注入的字段、构造方法或者Setter方法上添加@Autowired注解。
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public List<User> getUsers() {
return userService.getUsers();
}
}
@Component是Spring的核心注解之一,用于定义组件。它表示该类是一个Spring管理的Bean,可以被自动扫描和装配。
在类上添加@Component注解,然后在需要注入的地方使用@Autowired注解。
@Component
public class UserService {
public List<User> getUsers() {
// ...
}
}
@Configuration是Spring的核心注解之一,用于定义配置类。它表示该类是一个Java配置类,可以用来替代XML配置文件。
在类上添加@Configuration注解,然后在方法上添加@Bean注解定义Bean。
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
@Bean是Spring的核心注解之一,用于定义Bean。它表示该方法返回一个Bean,可以被Spring容器管理。
在配置类的方法上添加@Bean注解,然后在需要注入的地方使用@Autowired注解。
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
@RequestMapping是Spring MVC的核心注解之一,用于定义HTTP请求映射。它可以将HTTP请求映射到控制器类或方法上。
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable("id") Long id) {
// ...
}
}
@PathVariable是Spring MVC的核心注解之一,用于获取URL路径中的变量。它可以将URL路径中的变量绑定到方法参数上。
在方法参数上添加@PathVariable注解,然后设置相应的属性,例如:value、required等。
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable("id") Long id) {
// ...
}
}
@RequestParam是Spring MVC的核心注解之一,用于获取HTTP请求参数。它可以将HTTP请求参数绑定到方法参数上。
在方法参数上添加@RequestParam注解,然后设置相应的属性,例如:value、required、defaultValue等。
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/search")
public List<User> searchUsers(@RequestParam("keyword") String keyword) {
// ...
}
}
@Value是Spring的核心注解之一,用于获取配置文件中的属性值。它可以将配置文件中的属性值绑定到字段或方法参数上。
在字段或方法参数上添加@Value注解,然后设置相应的属性,例如:${property.name}。
@Component
public class AppConfig {
@Value("${app.name}")
private String appName;
public String getAppName() {
return appName;
}
}
@RequestBody是Spring MVC框架中的一个注解,用于将HTTP请求体中的数据绑定到控制器方法的参数上。
@RestController
@RequestMapping("/api")
public class UserController {
@PostMapping("/users")
public User createUser(@RequestBody User user) {
// 创建用户
}
}
@ResponseBody是Spring MVC框架中的一个注解,用于将控制器方法的返回值转换为HTTP响应体中的数据。
@RestController
public class UserController {
@GetMapping("/users/{id}")
@ResponseBody
public User getUser(@PathVariable int id) {
// 从数据库或其他地方获取用户数据
User user = userService.getUserById(id);
return user;
}
}
swagger2 | swagger3 | 注解位置 |
---|---|---|
@Api(tags = “接口类描述”) | @Tag(tags = “接口类描述”) | Controller 类上 |
@ApiOperation(“接口方法描述”) | @Operation(summary =“接口方法描述”) | Controller 方法上 |
@ApiImplicitParams | @Parameters | Controller 方法上 |
@ApiImplicitParam | @Parameter(description=“参数描述”) | Controller 方法上 @Parameters 里 |
@ApiParam(“参数描述”) | @Parameter(description=“参数描述”) | Controller 方法的参数上 |
@ApiIgnore | @Parameter(hidden = true) 或 @Operation(hidden = true) 或 @Hidden | |
@ApiModel(description = “dto类描述”) | @Schema(description = “dto类描述”) | DTO类上 |
@ApiModelProperty(“属性描述”) | @Schema(description = “属性描述”) | DTO属性上 |
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>
<!-- 搭配校验使用,使用与SpringBoot相同的版本号 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>3.2.0</version>
</dependency>
############################
# 生成接口文档配置
############################
# 开启OpenApi接口
springdoc.api-docs.enabled=true
# 自定义路径,默认为:/v3/api-docs
springdoc.api-docs.path=/v3/api-docs
# 开启swagger界面,依赖OpenApi, 需要OpenApi同时开启
springdoc.swagger-ui.enabled=true
# 自定义路径,默认为:swagger-ui/index.html
# 通过url访问:http://localhost:8080/swagger-ui/index.html
springdoc.swagger-ui.path=/swagger-ui/index.html
主要就是下面 4 个注解:
@RestController
// 响应的 MediaType 都是 application/json
@RequestMapping(path = "/process-definition", produces = "application/json")
// Tag 注解, 给整个接口起了个名字 "流程定义", 描述是 "流程定义 API"
@Tag(name = "流程定义", description = "流程定义 API")
// ApiResponses 给每个接口提供一个默认的响应, 状态码是 200, 描述是 "接口请求成功"
@ApiResponses(@ApiResponse(responseCode = "200", description = "接口请求成功"))
public class ProcessDefinitionController {
// Operation 注解设置了接口名称, 接口描述
@Operation(summary = "上传 BPMN xml 字符串 并部署", description = "此接口处理的是 xml 字符串")
@PostMapping("/upload-and-deploy/bpmn-xml-str")
public JsonResult<?> uploadAndDeployBpmnXmlStr(@RequestBody BpmnXmlReq req) {
return JsonResult.of(CommonCodeEnum.OK);
}
@Operation(summary = "查询单个 bpmn xml 数据")
@GetMapping("/bpmn-xml")
public JsonResult<BpmnXmlResp> findBpmnXml(
// Parameter 注解设置了请求参数的描述, 是否必填 以及示例
@Parameter(description = "流程部署ID", required = true, example = "1234") String deployId,
@Parameter(description = "流程资源名称", required = true, example = "xxx.bpmn") String resourceName) {
return JsonResult.of(CommonCodeEnum.OK, new BpmnXmlResp());
}
}
@Data
@ToString
@Schema(title = "用户模型")
public class User {
@Schema(title = "用户ID,由系统分配")
private Integer id;
@Schema(title = "用户名", example = "罗杰", minLength = 1, maxLength = 32)
@NotBlank(message = "用户名不能为空")
private String userName;
@Schema(title = "地址", example = "深圳市南山区关口二路", minLength = 1, maxLength = 128)
@NotBlank(message = "姓名不能为空")
private String address;
@Schema(title = "年龄", example = "18", minimum = "0", maximum = "150")
@NotNull(message = "年龄不能为空")
@Range(min = 0, max = 150, message = "年龄在0~150之间")
private Integer age;
@Schema(title = "电话号码(可选)", example = "13866668888")
private String phone;
public User(Integer id, String userName, String address) {
this.id = id;
this.userName = userName;
this.address = address;
}
}
#启动
net start mysql80
# 停止
net stop mysql80
# 客户端连接
mysql [-h 127.0.0.1] [-P 3306] -u root -p
# 创建数据库
create database health default charset utf8mb4;
# 查看所有数据库
show databases;
#使用数据库
use health;
# 查看当当使用的数据库
select database();
# 查发前数据库所有表
show tables;
# 查询表结构
desc 表名
# 查询指定表的建表语句
show create table 表名
# 创建表
create table 表名(
字段1 字段1类型 [comment 字段1注释],
字段2 字段2类型 [comment 字段2注释],
字段3 字段3类型 [comment 字段3注释],
...
字段n 字段n类型 [comment 字段4注释]
) [comment 注释];
# 示例
create table user(
id int comment '用户ID',
name varchar(32) comment '姓名',
age int comment '年龄',
gender varchar(1) comment '性别'
) comment '用户表';
create table user_basic (
id int comment '用户唯一ID',
name varchar(20) comment '姓名',
gender char(1) comment '性别',
birthday date comment '出生日期',
id_card char(32) comment '身份证号',
face_file varchar(64) comment '人脸图片文件名'
) comment '用户基本信息';
insert into user_basic values (1, '张三', '男', '2000-12-18', '440301200012181233', '1.jpg');
insert into user_basic values (1, '李四', '女', '2001-12-18', '440301200112181223', '2.jpg');
# 表增加字段
alter table 表名 add 字段名 字段类型 [comment 字段3注释];
# 修改数据类型
alter table 表名 modify 字段名 新数据类型;
# 修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型 commnet '';
# 删除字段
alter table 表名 drop 字段名;
# 修改表名
alter table 表名 rename to 新表名;
# 删除表
drop table if exists 表名;
# 删除指定表,并重新创建此表
truncate table 表名;
# 插入数据时,字符串和日期型数据应该包含在引号中。
# 给部分字段添加数据
insert into 表名(字段名1, 字段名m, ...) values (值1, 值m, ...);
# 给所有字段添加数据
insert into 表名 values (值1, 值2, ...);
# 批量添加数据
insert into 表名(字段名1, 字段名m, ...) values (值1, 值m, ...), (值1, 值m, ...);
insert into 表名 values (值1, 值2, ...), (值1, 值2, ...);
# 修改数据
update 表名 set 字段名1=值1, 字段名2=值2,... [where 条件]
# 删除数据
delete from 表名 [where 条件]
# 查询
select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段列表 limit 分页参数
# 查询多 个字段
select * from 表名;
select 字段1, 字段2, ... from 表名;
# 去除重复记录
select distinct 字段列表 from 表名;
# 条件查询 (where)
# 聚合函数 (count, max, min, avg, sum)
# 分组查询 (group by)
# 排序查询 (order by)
# 分页查询 (limit)
# 配置数据源 (数据库health)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/health?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 连接池配置
# 初始化时建立物理连接的个数
spring.datasource.druid.initial-size=5
# 连接池最大连接数量
spring.datasource.druid.max-active=20
# 连接池的最小空闲数量
spring.datasource.druid.min-idle=5
# 获取连接时最大等待时间,单位毫秒
spring.datasource.druid.max-wait=60000
# 是否缓存preparedStatement, 也就是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭
spring.datasource.druid.pool-prepared-statements=false
# 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。
# 在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=-1
#spring.datasource.druid.max-open-prepared-statements= #和上面的等价
# 用来检测数据库连接是否有效的sql 必须是一个查询语句(oracle中为 select 1 from dual)
spring.datasource.druid.validation-query=select 'x'
#spring.datasource.druid.validation-query-timeout=
# 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
spring.datasource.druid.test-on-borrow=false
# 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
spring.datasource.druid.test-on-return=false
# 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效
spring.datasource.druid.test-while-idle=true
# 既作为检测的间隔时间又作为testWhileIdel执行的依据
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接(配置连接在池中的最小生存时间)
spring.datasource.druid.min-evictable-idle-time-millis=30000
spring.datasource.druid.max-evictable-idle-time-millis=80000
# 置监控统计拦截的filters,去掉后监控界面sql无法统计,stat: 监控统计、Slf4j:日志记录、waLL: 防御sqL注入
spring.datasource.druid.filters= stat, wall, slf4j
## 监控配置
# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
# 是否启用StatFilter默认值true
spring.datasource.druid.web-stat-filter.enabled=true
# 添加过滤规则
spring.datasource.druid.web-stat-filter.url-pattern=/*
# 忽略过滤的格式
spring.datasource.druid.web-stat-filter.exclusions=/druid/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico
#spring.datasource.druid.web-stat-filter.session-stat-enable=
#spring.datasource.druid.web-stat-filter.session-stat-max-count=
#spring.datasource.druid.web-stat-filter.principal-session-name=
#spring.datasource.druid.web-stat-filter.principal-cookie-name=
#spring.datasource.druid.web-stat-filter.profile-enable=
# StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
# 是否启用StatViewServlet默认值true
spring.datasource.druid.stat-view-servlet.enabled=true
# 访问路径为/druid时,跳转到StatViewServlet
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 是否能够重置数据
spring.datasource.druid.stat-view-servlet.reset-enable=false
# 需要账号密码才能访问控制台,默认为root
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=123456
# IP白名单
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
# IP黑名单(共同存在时,deny优先于allow)
spring.datasource.druid.stat-view-servlet.deny=
# Spring监控配置,说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
#spring.datasource.druid.aop-patterns= # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.kscx</groupId>
<artifactId>MyDB</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>MyDB</name>
<description>MyDB</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--<dependency>-->
<!-- <groupId>org.mybatis.spring.boot</groupId>-->
<!-- <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!-- <version>3.0.3</version>-->
<!--</dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.20</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.20</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.4.1</version>
</dependency>
@SpringBootApplication
@MapperScan(basePackages = "com.kk.test.mapper") // 启动类中添加 @MapperScan 注解,以扫描 mapper 文件夹
public class SpringBootMybatisplusDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMybatisplusDemoApplication.class, args);
}
}
@Data
//表名与实体类名称不一致需要手动指定表名
@TableName("tb_user")
public class User implements Serializable {
private Integer id;
private String name;
private Integer sex;
private Integer age;
private String grade;
}
public interface UserMapper extends BaseMapper<User> {
}
@SpringBootTest
class SpringBootMybatisplusDemoApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testSelectList() {
System.out.println(("----- selectAll method test ------"));
List<User> userList = userMapper.selectList(null);
userList.forEach(System.out::println);
}
}
npm install -g create-vue
create-vue