200字
mybatis plus笔记
2026-02-12
2026-02-12
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());
    }
}
```


评论