【RuoYi-Vue 集成 MyBatis-Plus-Ext 教程】

RuoYi-Vue 集成 MyBatis-Plus-Ext 教程

RuoYi-Vue 是一个开源的企业级快速开发平台,它基于前后端分离的模式,前端采用 Vue、Element UI,后端使用 Spring Boot、Spring Security、MyBatis。MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

MyBatis-Plus-Ext 则是 MyBatis-Plus 的一个扩展库,它提供了更多的便捷功能,比如动态表名、逻辑删除和多租户等。在 RuoYi-Vue 项目中集成 MyBatis-Plus-Ext,可以让我们更加方便地处理一些通用的业务场景。

一、添加 MyBatis-Plus-Ext 依赖

首先,我们需要在 RuoYi-Vue 项目的 pom.xml 文件中添加 MyBatis-Plus-Ext 的依赖。这里可以按照实际情况放到指定模块,我将该依赖放到了ruoyi-common模块中。

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

请替换最新版本号为实际的版本号,你可以在 Maven 仓库 中查找到最新版本。
由于MyBatis-Plus-Ext已经引入了MybatisPlus的包,自己框架中的需要去掉,切记!!!
PS:RuoYi-Vue自带的pagehelper插件依赖的mybatis可能会和mybatis-plus-ext存在版本冲突,这时可以去掉pagehelper对mybatis的依赖,即在ruoyi-common中做如下处理:

<!-- 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

1. 添加MybatisPlusConfig

首先我们先删除掉MybatisConfig,新增一个MybatisPlusConfig,内容如下:

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;
/**
 * Mybatis Plus 配置
 *
 * @author ruoyi
 */
@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;
    }

    /**
     * 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html
     */
    public PaginationInnerInterceptor paginationInnerInterceptor()
    {
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        // 设置数据库类型为mysql
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        paginationInnerInterceptor.setMaxLimit(-1L);
        return paginationInnerInterceptor;
    }

    /**
     * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html
     */
    public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor()
    {
        return new OptimisticLockerInnerInterceptor();
    }

    /**
     * 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html
     */
    public BlockAttackInnerInterceptor blockAttackInnerInterceptor()
    {
        return new BlockAttackInnerInterceptor();
    }
}

这里我们添加了分页插件的配置,MyBatis-Plus-Ext 提供了很多其他的特性,根据需要进行配置即可。

2.修改application.yml

application.yml文件,去掉原有的mybatis配置,添加如下内容:

# MyBatis Plus配置
mybatis-plus:
  # 搜索指定包别名
  typeAliasesPackage: com.ruoyi.**.domain
  # 配置mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # 加载全局的配置文件
  configLocation: classpath:mybatis/mybatis-config.xml

3.新建UsernameAutoFillHandler,处理自动填充操作人信息

新增一个UsernameAutoFillHandler类,内容如下:

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> {

    /**
     * @param object 当前操作的数据对象
     * @param clazz  当前操作的数据对象的class
     * @param field  当前操作的数据对象上的字段
     * @return 当前登录用户id
     */
    @Override
    public String getVal(Object object, Class<?> clazz, Field field) {
        return SecurityUtils.getUsername();
    }
}

三、使用 MyBatis-Plus-Ext 的功能

示例 1:自动生成Mapper和Repository

在实体类中加入@AutoMapper@AutoRepository可自动生成对应的Mapper与Repository类,无需再编写或生成对应的文件,只需在Service层直接调用即可。例如:

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 com.tangzc.mpe.bind.metadata.annotation.BindField;
import com.tangzc.mpe.bind.metadata.annotation.JoinCondition;
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层直接调用(正常情况下应该加一个Service层,只是为了演示效果直接跳过该层):


import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletResponse;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.demo.domain.ArticleRepository;
import com.tangzc.mpe.bind.Binder;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.demo.domain.Article;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;

/**
 * 文章Controller
 *
 * @date 2023-12-04
 */
@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@InsertOptionDate@InsertUpdateOptionUser@InsertUpdateOptionDate等注解即可实现数据的自动填充。

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

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

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

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

这里的UsernameAutoFillHandler便是我们在上述二.3章节中讲到UsernameAutoFillHandler类。按照上述配置,在新增和修改操作时即可看到数据会自动写入到数据库中。

示例 3:数据关联查询

实际开发过程中经常需要我们处理一些主子表关联的数据,例如查询出某个作者信息时要求带出作者所有的文章,使用Mybatis-Plus-Ext后我们可以基于@BindEntity或者@BindField实现这种需求。

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层可以通过Binder.bind(obj);来处理关联关系,代码如下:

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

前端接口返回的信息如下:

{
	"msg": "操作成功",
	"code": 200,
	"data": {
		"id": 1,
		"code": "11",
		"name": "11",
		"address": "11",
		"articleList": [{
			"id": 2,
			"title": "测试2",
			"content": "<p>测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2</p>",
			"authorName": null,
			"createBy": "1",
			"createTime": "2023-12-05 17:13:34",
			"updateBy": "admin",
			"updateTime": "2023-12-05 17:13:34"
		}, {
			"id": 1,
			"title": "测试1",
			"content": "<p>测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1测试1</p>",
			"authorName": null,
			"createBy": "1",
			"createTime": "2023-12-05 17:13:21",
			"updateBy": "admin",
			"updateTime": "2023-12-05 17:19:33"
		}]
	}
}

四、总结

通过集成 MyBatis-Plus-Ext 到 RuoYi-Vue 项目,我们可以利用其提供的强大功能来简化开发流程,提高开发效率。无论是动态表名、逻辑删除还是多租户等功能,MyBatis-Plus-Ext 都能帮助我们更好地处理复杂的业务场景。不过,需要注意的是,这些功能的使用可能会对系统的架构和设计产生影响,因此在使用之前应该仔细考虑和规划。

请注意,本文中提到的代码示例仅供参考,具体的实现方式可能会因 RuoYi-Vue 项目版本或 MyBatis-Plus-Ext 版本的不同而有所差异。在实际应用中,请根据自身项目的具体需求和环境进行适当的调整和优化。
参考文献(排名不分先后):
RuoYi-Vue 集成mybatisplus实现mybatis增强
MyBatis-Plus-Ext教程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ruoyi-vue集成积木报表的操作步骤如下: 1. 下载ruoyi-vue源代码:首先,需要在GitHub上下载ruoyi-vue的源代码,可以通过直接下载zip文件或者使用git clone命令来获取代码。 2. 配置环境:下载完成后,需要将代码部署到本地开发环境中,并配置好相关的运行环境,例如安装Java、Node.js和Maven等。 3. 导入项目:使用IDE(如IntelliJ IDEA)打开ruoyi-vue源代码所在的文件夹,并将项目导入到IDE中。 4. 配置数据库:在ruoyi-vue项目中,需要配置数据库连接信息,包括数据库类型、地址、用户名和密码等。可以在项目的配置文件(如application.yml)中进行相应的修改。 5. 运行项目:在IDE中运行ruoyi-vue项目,可以选择运行前端或后端代码。前端代码使用npm命令进行运行,后端代码使用maven命令进行运行。 6. 登录系统:在浏览器中输入对应的URL地址,打开ruoyi-vue系统的登录页面。输入正确的用户名和密码,点击登录按钮进行登录。 7. 集成积木报表:在ruoyi-vue系统的菜单中找到“积木报表”模块,点击进入。在该模块中,用户可以创建、编辑和删除报表,以及进行数据导入等操作。 8. 创建报表:在积木报表模块中,用户可以点击“创建报表”按钮,在弹出的对话框中填写报表的基本信息,如报表名称、描述等。还可以在报表设计器中进行表格或图表的设计和布局。 9. 编辑报表:已创建的报表可以通过点击报表列表中的“编辑”按钮进行修改。用户可以编辑报表的名称、描述和设计布局,并且可以添加、删除和调整报表中的数据字段。 10. 导出报表:在报表编辑完成后,用户可以点击“导出报表”按钮将报表导出为各种格式,例如Excel、PDF或图片等。 总结:通过以上步骤,可以实现在ruoyi-vue系统中集成和操作积木报表,方便用户进行报表的设计、编辑和导出等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值