开发喵星球

若依分离版集成 MyBatis-Plus-Ext 教程(371)

MyBatis-Plus-ExtMyBatis-Plus 的扩展库,它在保留 MyBatis-Plus 基础功能的前提下,提供了更加便捷和丰富的功能,从而进一步提升开发效率。对于熟悉 MyBatis-Plus 的开发者来说,MyBatis-Plus-Ext(简称 MPE)不仅保留了 MyBatis-Plus 的特性,还增加了自动建表、关联查询、数据自动填充等功能,为日常开发带来了与 JPA 类似的流畅体验。

RuoYi-Vue 项目中引入 MyBatis-Plus-Ext 后,我们能够更轻松地处理多种业务场景,并充分利用其强大的功能特性。

集成效果

一、添加 MyBatis-Plus-Ext 依赖

首先,需要将 MyBatis-Plus-Ext 依赖添加到项目中。打开 ruoyi-common 模块的 pom.xml 文件,添加如下依赖:

<dependency>
    <groupId>com.tangzc</groupId>
    <artifactId>mybatis-plus-ext-boot-starter</artifactId>
    <version>最新版本号</version>
</dependency>

注意MyBatis-Plus-Ext 包含了 MyBatis-Plus 的依赖,因此需要移除项目中原有的 MyBatis-Plus 依赖。此外,RuoYi-Vue 项目自带的 pagehelper 插件中也包含了 mybatis 依赖,为避免版本冲突,可在 ruoyi-common 中通过 exclusion 去除 pagehelpermybatis 的依赖:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </exclusion>
    </exclusions>
</dependency>

二、配置 MyBatis-Plus-Ext

1. 添加 MybatisPlusConfig 配置类

ruoyi-framework 模块的 config 包中,删除原有的 MybatisConfig.java 文件,新建 MybatisPlusConfig.java,如下所示:

package com.ruoyi.framework.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(paginationInnerInterceptor());
        interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
        interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
        return interceptor;
    }

    public PaginationInnerInterceptor paginationInnerInterceptor() {
        PaginationInnerInterceptor interceptor = new PaginationInnerInterceptor();
        interceptor.setDbType(DbType.MYSQL);
        interceptor.setMaxLimit(-1L);
        return interceptor;
    }

    public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
        return new OptimisticLockerInnerInterceptor();
    }

    public BlockAttackInnerInterceptor blockAttackInnerInterceptor() {
        return new BlockAttackInnerInterceptor();
    }
}

2. 修改 application.yml 配置文件

ruoyi-admin 模块的 application.yml 文件中,将 mybatis 配置更改为 mybatis-plus,如下所示:

# MyBatis Plus配置
mybatis-plus:
  typeAliasesPackage: com.ruoyi.**.domain
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  configLocation: classpath:mybatis/mybatis-config.xml

3. 新增 UsernameAutoFillHandler

为了实现操作人信息的自动填充功能,在 ruoyi-common 模块中添加 UsernameAutoFillHandler.java 文件:

import com.ruoyi.common.utils.SecurityUtils;
import com.tangzc.mpe.annotation.handler.AutoFillHandler;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;

@Component
public class UsernameAutoFillHandler implements AutoFillHandler<String> {

    @Override
    public String getVal(Object object, Class<?> clazz, Field field) {
        return SecurityUtils.getUsername();
    }
}

三、使用 MyBatis-Plus-Ext 功能

示例 1:自动生成 MapperRepository

在实体类中通过注解 @AutoMapper@AutoRepository,可以省去手动编写 MapperRepository 类的步骤。以下为示例代码:

import com.baomidou.mybatisplus.annotation.IdType;
import com.ruoyi.common.handler.UsernameAutoFillHandler;
import com.tangzc.mpe.annotation.InsertOptionDate;
import com.tangzc.mpe.annotation.InsertOptionUser;
import com.tangzc.mpe.annotation.InsertUpdateOptionDate;
import com.tangzc.mpe.annotation.InsertUpdateOptionUser;
import com.tangzc.mpe.automapper.AutoMapper;
import com.tangzc.mpe.automapper.AutoRepository;
import lombok.Data;

@Data
@AutoMapper
@AutoRepository
public class Article {

    public Long id;
    public String title;
    public String content;

    @InsertOptionUser(UsernameAutoFillHandler.class)
    public String createBy;

    @InsertOptionDate
    public String createTime;

    @InsertUpdateOptionUser(UsernameAutoFillHandler.class)
    public String updateBy;

    @InsertUpdateOptionDate
    public String updateTime;
}

Controller 层可以直接调用 Repository 中的方法:

@RestController
@RequestMapping("/demo/article")
public class ArticleController extends BaseController {

    @Autowired
    private ArticleRepository articleRepository;

    @GetMapping("/list")
    public TableDataInfo list(Article article) {
        startPage();
        List<Article> list = articleRepository.list(new LambdaQueryWrapper<Article>()
                .like(StringUtils.isNotEmpty(article.getTitle()), Article::getTitle, article.getTitle()));
        Binder.bind(list);
        return getDataTable(list);
    }
}

示例 2:自动填充数据

在实体类中通过 @InsertOptionUser@InsertUpdateOptionUser 等注解来实现数据的自动填充。

@ColumnComment("创建人")
@InsertOptionUser(UsernameAutoFillHandler.class)
public String createBy;

@ColumnComment("创建时间")
@InsertOptionDate
public String createTime;

@ColumnComment("修改人")
@InsertUpdateOptionUser(UsernameAutoFillHandler.class)
public String updateBy;

@ColumnComment("修改时间")
@InsertUpdateOptionDate
public String updateTime;

示例 3:关联查询

在主从表查询中,可以通过 @BindEntity 实现关联数据的加载。

import com.tangzc.mpe.bind.metadata.annotation.BindEntity;
import com.tangzc.mpe.bind.metadata.annotation.JoinCondition;
import com.tangzc.mpe.bind.metadata.annotation.JoinOrderBy;
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@AutoMapper
@AutoRepository
@Accessors(chain = true)
public class Author {

    public Long id;
    public String code;
    public String name;
    public String address;

    @BindEntity(entity = Article.class, conditions = @JoinCondition(selfField = "id", joinField = "createBy"), orderBy = @JoinOrderBy(field = "createTime", isAsc = false))
    public List<Article> articleList;
}

Controller 中通过 Binder.bind() 方法将关联数据加载到对象中:

@GetMapping("/{id}")
public AjaxResult getInfo(@PathVariable Long id) {
    Author author = authorRepository.getById(id);
    Binder.bind(author);
    return AjaxResult.success(author);
}

四、总结

MyBatis-Plus-Ext 集成到 RuoYi-Vue 中后,我们不仅能够享受到 MyBatis-Plus 的基础功能,还能利用自动生成、数据填充、关联查询等功能简化开发工作。建议根据实际需求,合理应用这些功能,以实现更高效的开发流程。

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-10-25 14:56:04 阅读量:47
<<   >>


powered by kaifamiao