在 RuoYi-Vue
项目中集成 MyBatis-Plus-Ext
,以简化开发流程,提高处理通用业务场景的效率。
MyBatis-Plus-Ext:MyBatis-Plus-Ext (MPE)
是 MyBatis-Plus
的一个扩展库,在保留 MyBatis-Plus
原有功能的基础上,添加了更多便捷的功能,如免手写 Mapper
、自动建表、数据自动填充、关联查询等,进一步简化开发工作。
pom.xml
中添加MyBatis-Plus-Ext的依赖,并去掉冲突的依赖。application.yml
中配置MyBatis-Plus-Ext相关参数,并创建配置类。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-Vue
框架版本兼容。MyBatis-Plus-Ext
与 PageHelper
的版本冲突,可以去掉 PageHelper
对 MyBatis
的依赖。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>
第一步:添加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();
}
}
示例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
后,可以看到以下效果:
Mapper
和 Repository
类,可以直接在 Service
层调用。通过将 MyBatis-Plus-Ext
集成到 RuoYi-Vue
项目中,可以利用其提供的丰富功能来简化开发流程,提高效率。无论是处理动态表名、逻辑删除还是多租户等复杂业务场景,MyBatis-Plus-Ext
都能够提供强大支持。然而,需要注意的是,这些功能的引入可能会对系统的架构和设计产生影响。因此,在使用之前,应该充分考虑并进行合理规划。
本文提及的代码示例仅供参考,实际实现方式可能会因RuoYi-Vue项目版本或MyBatis-Plus-Ext版本的不同而略有差异。在实际应用中,请根据具体需求和环境进行适当调整和优化。
powered by kaifamiao