MyBatis-Plus-Ext
是MyBatis-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
去除pagehelper
对mybatis
的依赖:
<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 interceptor = new PaginationInnerInterceptor();
interceptor.setDbType(DbType.MYSQL);
interceptor.setMaxLimit(-1L);
return interceptor;
}
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
文件:
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
功能Mapper
和 Repository
在实体类中通过注解 @AutoMapper
和 @AutoRepository
,可以省去手动编写 Mapper
和 Repository
类的步骤。以下为示例代码:
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);
}
}
在实体类中通过 @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;
在主从表查询中,可以通过 @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
的基础功能,还能利用自动生成、数据填充、关联查询等功能简化开发工作。建议根据实际需求,合理应用这些功能,以实现更高效的开发流程。
powered by kaifamiao