开发喵星球

若依分离版集成 MyBatis-Plus-Ext (252)

需求提出

RuoYi-Vue 项目中集成 MyBatis-Plus-Ext ,以简化开发流程,提高处理通用业务场景的效率。

相关介绍

MyBatis-Plus-ExtMyBatis-Plus-Ext (MPE)MyBatis-Plus 的一个扩展库,在保留 MyBatis-Plus 原有功能的基础上,添加了更多便捷的功能,如免手写 Mapper、自动建表、数据自动填充、关联查询等,进一步简化开发工作。

解决思路

  1. 添加MyBatis-Plus-Ext依赖:在pom.xml中添加MyBatis-Plus-Ext的依赖,并去掉冲突的依赖。
  2. 配置MyBatis-Plus-Ext:在application.yml中配置MyBatis-Plus-Ext相关参数,并创建配置类。
  3. 自动填充操作人信息:创建自动填充处理类,实现数据自动填充。
  4. 使用MyBatis-Plus-Ext功能:在实体类中使用注解实现自动生成Mapper和Repository、数据自动填充、关联查询等功能。

所需技术

项目结构树

ruoyi-admin
├── src\main\java
│   │   └── com\ruoyi\web
│   │       └── controller\demo
│   │           └── ArticleController.java
│   ├── resources
│   │   └── application.yml
ruoyi-common
├── src\main\java
│   │   └── com\ruoyi\common
│   │       └── handler
│   │           └── UsernameAutoFillHandler.java
ruoyi-framework
├── src\main\java
│   │   └── com\ruoyi\framework
│   │       └── config
│   │           └── MybatisPlusConfig.java
ruoyi-system
├── src\main\java
│   │   └── com\ruoyi\system
│   │       └── domain
│   │           └── Article.java
│   │           └── Author.java
│   │           └── repository
│   │               └── ArticleRepository.java
│   │               └── AuthorRepository.java

注意事项

完整代码

一、添加MyBatis-Plus-Ext依赖

ruoyi-common模块中的pom.xml文件中添加 MyBatis-Plus-Ext 依赖,并去掉冲突的依赖:

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

<!-- pagehelper 分页插件 -->
<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

第一步:添加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 paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        paginationInnerInterceptor.setMaxLimit(-1L);
        return paginationInnerInterceptor;
    }

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

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

第二步:修改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

第三步:新建UsernameAutoFillHandler类

ruoyi-common模块中新建UsernameAutoFillHandler.java,处理自动填充操作人信息:

package com.ruoyi.common.handler;

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:自动生成Mapper和Repository

在实体类中加入@AutoMapper@AutoRepository注解:

package com.ruoyi.system.domain;

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 com.tangzc.mpe.autotable.annotation.ColumnComment;
import com.tangzc.mpe.autotable.annotation.ColumnId;
import com.tangzc.mpe.autotable.annotation.Table;
import lombok.Data;

@Data
@Table(comment = "文章表")
@AutoMapper
@AutoRepository
public class Article {

    @ColumnId(mode = IdType.AUTO, comment = "主键ID")
    public Long id;

    @ColumnComment("标题")
    public String title;

    @ColumnComment("内容")
    public String content;

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

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

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

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

在Controller层直接调用:

package com.ruoyi.web.controller.demo;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.demo.domain.Article;
import com.ruoyi.demo.domain.ArticleRepository;
import com.tangzc.mpe.bind.Binder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@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:自动数据填充

在实体类中使用自动填充注解:

@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:数据关联查询

在实体类中使用关联查询注解:

package com.ruoyi.system.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.tangzc.mpe.automapper.AutoMapper;
import com.tangzc.mpe.automapper.AutoRepository;
import com.tangzc.mpe.autotable.annotation.ColumnComment;
import com.tangzc.mpe.autotable.annotation.ColumnId;
import com.tangzc.mpe.autotable.annotation.Table;
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 io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.List;

@Data
@Table(comment = "作者表")
@AutoMapper
@AutoRepository
@Accessors(chain = true)
@ApiModel(value = "Author", description = "作者")
public class Author {

    @ColumnId(mode = IdType.AUTO, comment = "主键ID")
    public Long id;

    @ApiModelProperty("编号")
    @ColumnComment("编号")
    public String code;

    @ApiModelProperty("姓名")
    @ColumnComment("姓名")
    public String name;

    @ApiModelProperty("地址")
    @ColumnComment("地址")
    public String address;

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

在Controller层处理关联关系:

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

运行结果

通过上述配置和代码修改,在 RuoYi-Vue 项目中集成 MyBatis-Plus-Ext 后,可以看到以下效果:

  1. 自动生成的 MapperRepository 类,可以直接在 Service 层调用。
  2. 在新增和修改操作时,创建人、创建时间、修改人、修改时间等信息会自动填充到数据库中。
  3. 查询作者信息时,可以一并获取作者所有的文章列表,无需手动处理关联关系。

总结

通过将 MyBatis-Plus-Ext 集成到 RuoYi-Vue 项目中,可以利用其提供的丰富功能来简化开发流程,提高效率。无论是处理动态表名、逻辑删除还是多租户等复杂业务场景,MyBatis-Plus-Ext 都能够提供强大支持。然而,需要注意的是,这些功能的引入可能会对系统的架构和设计产生影响。因此,在使用之前,应该充分考虑并进行合理规划。

本文提及的代码示例仅供参考,实际实现方式可能会因RuoYi-Vue项目版本或MyBatis-Plus-Ext版本的不同而略有差异。在实际应用中,请根据具体需求和环境进行适当调整和优化。

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-06-24 18:01:06 阅读量:135
<<   >>


powered by kaifamiao