Spring-boot
### 一、基础
1. @RestController
1. 注解下面的类有方法映射到 web 请求
2. 返回 json
3. 注册到 Ioc 容器
2. RequestMapping("/")
1. 将"/"映射到此方法
2. 能够处理所有 HTTP 请求
3. GetMapping("/")
1. 将"/"映射到此方法
2. 能够处理HTTP:GET请求
4. 一个 pom 模板
```xml
<?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.2</version> <relativePath/> </parent>
<groupId>com.example</groupId>
<artifactId>demo-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo-project</name>
<description>这是我的 Spring Boot Web 项目</description>
<properties>
<java.version>17</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.5</version>
</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>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<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>
```
5. spring-boot-maven-plugin会将java和resources都打包进fat-jar
6. jar tvf可以在不解压 jar 包的情况下查看jar包里的目录结构
7. 一个典型的 java 目录下的项目结构
com
+- example
+- myapplication
+- MyApplication.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
8. @SpringBootApplication注释的类是启动类,它默认会扫描当前类下的所有子包。@Entity 类只有定义在启动类的子包下才能被扫描加载到。
9. MyApplication.java 文件声明了 main 方法,以及标识了基本的 @SpringBootApplication 注解
### 二、Configuration 类
1. @Configuration注解的类
1. 告诉 Spring 这是一个配置类。请在启动的时候扫描它,读取里面的方法,把这些方法返回的对象(Bean)全部注册到 Spring 容器里去。
2. @Configuration 配置的bean是单例模式,互相之间不可以调用
3. @Bean告诉Spring 把这个方法返回的对象注册到Ioc容器中,可以使用@AutoWired直接从容器中取出
2. @SpringBootApplication(scanBasePackages = "com.lxxx")自定义扫描的包
3. @ConditionalOnClass(name = "全类名") 表示如果有全类名表示的类就把@Bean返回的类注册到Ioc
4. @ConditionalOnMissingClass(name = "全类名") 表示如果没有有全类名表示的类就把@Bean返回的类注册到Ioc
5. 如果判断注解放到类上就表示判断生效,类的所有Bean都生效
### 三、属性绑定
1. 给容器中注册组件 @Component
2. 使用@ConfigurationProperties声明组件和配置文件的哪些配置项绑定
3. 在配置类中初始化的对象可以作为默认值,而配置文件中的属性绑定优先级高于配置类
4. 一定要有 getter 和 setter
```java
@ConfigurationProperties(prefix = "cat")
public class cat {
public String name;
public String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "cat{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
```
```properties
spring.application.name=boot-3
cat.name = 杰瑞
cat.age = 18
```
```java
@Configuration
class AppConfigConfiguration {
@Bean
public cat cat(){
var cat = new cat();
cat.name = "咪咪";
cat.age = "2";
return cat;
}
}
```
5. EnableConfigurationProperties(cat.class)可以在配置类注解上加这个自动属性绑定
1. 在被注入的类必须有 ConfigurationProperties(prefix)
6. Spring boot mybatis plus 配置
mybatis-plus:
configuration:
# MyBatis 配置
map-underscore-to-camel-case: true 把数据库字段名blog_name赋值给blogName 会将下划线风格转换为小驼峰风格
global-config:
# 全局配置
db-config:
# 数据库配置
id-type: auto 全局主键策略设置为数据库自增,增加记录时mybatis不会自行赋值给主键,但是会把数据库赋值后的主键值回填到java对象
7. jdbc 连接数据库配置
1. spring.datasource.driver-class-name
2. spring.datasource.url
示例:jdbc:mysql://localhost:3306/myblog?serverTimeZone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&connectionCollation=utf8mb4_0900_ai_ci&useSSL=false&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
url中
1. jdbc:mysql代表使用jdbc:mysql协议连接mysql服务器
2. myblog 代表连接myblog数据库
3. serverTimeZone=Asia/Shanghai 数据库服务的时区时Asia/Shanghai
4. useUnicode=true 使用Unicode编码来传输
5. characterEncoding=utf-8使用utf-8来编码字符
6. connectionCollation=utf8mb4_0900_ai_ci 使用utf8mb4_0900_ai_ci排序规则
7. useSSL=true 使用SSL套接字
8. rewriteBatchedStatement=true 开启CRUD批量操作
9. allowPublicKeyRetrieval=true 关闭SSL后允许服务器发送公钥
8. mybatis plus
1. 创建实体(UserModel)
```java
@Data // Lombok: 生成getter, setter, toString
@Builder // Lombok: 提供链式构建对象的能力
@NoArgsConstructor
@AllArgsConstructor
@TableName("user") // 1. 指定数据库表名
public class UserModel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* uid
* 对应 SQL: id BIGINT NOT NULL AUTO_INCREMENT
*/
@TableId(value = "id", type = IdType.AUTO) // 2. 指定主键自增
private Long id;
/**
* 用户名
*/
private String username;
/**
* 绑定邮箱
*/
private String email;
/**
* 密码
*/
private String password;
/**
* 头像连接
* SQL中是 avtar (拼写错误),Java中用 avatar,通过注解映射
*/
private String avatar;
/**
* 昵称
*/
private String nickname;
/**
* 0-游客,1-用户,2-管理员
* 对应 SQL: TINYINT
*/
private Integer role;
/**
* 用户等级
*/
private Integer level;
/**
* 用户积分
*/
private Long coin;
/**
* 用户邀请码
* Mybatis-Plus 会自动将驼峰(invitationCode)映射为下划线(invitation_code)
*/
private String invitationCode;
/**
* 上级ID
*/
private Long leaderId;
/**
* 六位的salt
*/
private String salt;
/**
* 0-正常;1-禁用;2-注销;3-在线;4-离线
*/
private UserEnum status;
/**
* 最后登录时间
*/
private LocalDateTime lastLoginTime;
private int isDeactivate;
/**
* 注册时间
* fill = FieldFill.INSERT: 插入时自动填充
*/
@TableField(value = "created_at", fill = FieldFill.INSERT)
private LocalDateTime createdAt;
/**
* 更新时间
* fill = FieldFill.INSERT_UPDATE: 插入和更新时都自动填充
*/
@TableField(value = "updated_at", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedAt;
}
```
2. 创建Mapper(UserMapper)
```java
@Mapper // 3. 标记这是一个 Mapper,或者在启动类用 @MapperScan
public interface UserMapper extends BaseMapper<UserModel> {
}
```
3. 自动枚举映射(@EnumValue申明的值会存到数据库,服务器返回枚举实例)
```java
@Getter
@AllArgsConstructor
public enum UserEnum {
NORMAL(0,"正常"),DISABLED(1,"禁用"),DEACTIVATED(2,"注销"),ONLINE(3,"在线"),OFFLINE(4,"离线");
@EnumValue
private final int code;
private final String comment;
}
```
4. 自动填充handler
```java
@Component // 3. 【核心】交给 Spring 管理,否则不生效!
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
// 对应 Entity 中 @TableField(fill = FieldFill.INSERT) 的字段
// 注意:这里的 "createdAt" 是 Java 类里的属性名,不是数据库字段名!
this.strictInsertFill(metaObject, "createdAt", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updatedAt", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
// 对应 Entity 中 @TableField(fill = FieldFill.INSERT_UPDATE) 的字段
this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime.class, LocalDateTime.now());
}
}
```
© 2026 Yesus
200字
mybatis plus笔记