SpringBoot学习日记——DAY06(整合MyBatisPlus的其他功能)

zhe今天针对SpringBoot整合MyBatisPlus的其他功能展开了学习:

1.自动填充功能:

实现步骤:

1.1完成实体类中对应属性配置:

我这里以createTime和updateTime为例,给大家演示:

java 复制代码
package com.djw.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.djw.enums.Status;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.time.LocalDateTime;

/**
 * @author djw
 */
@Data
@TableName("user")
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class User extends Model<User> {
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    @TableField(select = false)
    private String password;
    @EnumValue
    private Status status;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}

我在这里指明了自动填充的类型

fill = FieldFill.INSERT --->输入操作时完成填充;

fill = FieldFill.INSERT_UPDATE--->输入操作和更新操作时完成填充;

1.2完成对应配置类的编写:

java 复制代码
package com.djw.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

// java example
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("开始插入填充...");
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("开始更新填充...");
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
}

来实现MetaObjectHandlerjie接口重写insertFill和updateFill方法以我写的形式为例,指明对应的属性名,属性类型,填充规则;

到这里我们自动填充相关的内容就配置完毕了;

2.通用枚举类

我们想对表中的某些属性如性别,激活未激活等属性进行关联的时候必然会想到使用枚举类,那怎么在SpringBoot中使用枚举类完成相应的业务需求呢:

2.1编写枚举类:

java 复制代码
package com.djw.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Data;

/**
 * @author djw
 */
public enum Status {
    active(1,"yes"),
    inactive(0,"no");
    Status(int code,String desc){
        this.code = code;
        this.desc = desc;
    }
    @EnumValue
    Integer code;
    String desc;
    public int getCode() {
        return code;
    }
    public String getDesc() {
        return desc;
    }
}

2.2在对应值的位置表名@EnumValue

2.3加上全局配置,给出枚举类的位置

java 复制代码
mybatis-plus:
  type-enums-package: com.djw.enums

2.4在属性上直接使用枚举类型就好了

3.通用Service的接口与实现类

首先直接编写对应实体类的Mapper并继承BaseMapper:

java 复制代码
package com.djw.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.djw.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

@Repository
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

接着编写对应的Service和ServiceImpl:

java 复制代码
package com.djw.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.djw.entity.User;

public interface UserService extends IService<User> {
}
java 复制代码
package com.djw.service.impl;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.djw.entity.User;
import com.djw.mapper.UserMapper;
import com.djw.service.UserService;
import org.springframework.stereotype.Service;

@Service
@DS("master")
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
}

这里可以看到我的Service继承了IService<实体类>,ServiceImpl继承了ServiceImpl<实体类的mapper,实体类>,这一系列操作下来我们就可以实现绝大多数的Service操作了;

这里注意在多个数据源的业务场景可以自己编写新的方法同时调用IService提供的方法同时使用@DS来指明不同的数据源;

4.多数据源处理:

首先添加配置文件pom

java 复制代码
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>

我们只需要在全文配置文件中配置好不同的数据源的相关配置然后使用@DS进行选择就好了:

java 复制代码
spring:  
    datasource:
        dynamic:
          primary: master
          strict: false
          datasource:
            master:
              url: jdbc:mysql://localhost:3306/db1?serverTimezone=GMT%2B8
              username: root
              password: MIMA
              driver-class-name: com.mysql.jdbc.Driver
            slave_1:
              url: jdbc:mysql://localhost:3306/db2?serverTimezone=GMT%2B8
              username: root
              password: MIMA
              driver-class-name: com.mysql.jdbc.Driver

5.乐观锁插件

乐观锁的流程:

  1. 不加锁读取:在读取数据时,不加任何锁,直接获取数据。
  2. 提交时校验:在更新数据时,检查在此期间是否有其他线程或用户修改过该数据。
  3. 冲突处理
    • 如果数据未被修改,则更新成功。
    • 如果数据已被修改,则放弃本次更新,或者让程序自动重试。

5.1先写一下乐观锁的配置类

java 复制代码
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加乐观锁拦截器
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

5.2实体类需要使用@Version来指明

java 复制代码
package com.djw.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data
@TableName("user")
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class User1 {
    @TableId(type = IdType.ASSIGN_ID)
    Long id;
    String name;
    Integer balance;
    @Version
    Integer version;
}

6.ActiveRecord操作

Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的
CRUD 操作

只需要让实体类继承Model类就好了

java 复制代码
package com.djw.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.djw.enums.Status;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.time.LocalDateTime;

/**
 * @author djw
 */
@Data
@TableName("user")
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class User extends Model<User> {
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    @TableField(select = false)
    private String password;
    @EnumValue
    private Status status;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}

就可以直接通过实体类来实现CRUD操作了;

相关推荐
日月云棠4 小时前
5 StringBuffer —— 线程安全的可变字符串
java·后端
Refrain_zc5 小时前
Android 播放器进度条改造实践:句级音频列表映射秒级时间轴
java
星夜夏空995 小时前
FreeRTOS学习(3)——FreeRTOS的移植与剪裁
学习
我命由我123455 小时前
Bugly - Bugly 基本使用( App 质量追踪平台)
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
宋哥转AI5 小时前
Spring AI Graph:从0到Supervisor(一)RAG子图+Supervisor路由踩坑全记录
java·agent
嵌入式×边缘AI:打怪升级日志5 小时前
硬件清单与学习进度存档
学习
Mahir085 小时前
MyBatis 深度解密:从执行流程到底层原理全解
java·后端·面试·mybatis
菜菜的顾清寒5 小时前
力扣hot100(37)栈-有效的括号
java·开发语言
罗超驿5 小时前
9.LeetCode 209. 长度最小的子数组 | 滑动窗口专题详解
java·算法·leetcode·面试