MyBatis和MyBatis Plus的区别,分条列举,五条以上
时间: 2023-05-12 20:06:02 浏览: 104
1. MyBatis是一个基于Java的持久层框架,而MyBatis Plus是MyBatis的增强工具包。
2. MyBatis Plus提供了更加便捷的CRUD操作,包括自动生成代码、分页查询、条件构造器等。
3. MyBatis Plus支持Lambda表达式,可以更加方便地进行条件查询。
4. MyBatis Plus提供了更加丰富的注解,可以更加灵活地进行SQL操作。
5. MyBatis Plus支持多种数据库,包括MySQL、Oracle、SQL Server等。
相关问题
mybatis plus 常见bug
### MyBatis Plus 常见 Bug 及解决方案
#### 一、分页插件无法正常工作
当使用 Spring Boot 集成多数据源并结合 MyBatis-Plus 时,可能会遇到分页功能失效的情况。这是因为默认情况下 `MybatisSqlSessionFactoryBean` 的配置可能未正确加载 MyBatis-Plus 的 Mapper 接口。通过显式声明 `MybatisSqlSessionFactoryBean` 并设置其属性可以有效解决问题[^1]。
```java
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage("com.example.entity");
return sessionFactory.getObject();
}
```
---
#### 二、逻辑删除字段冲突
如果项目中启用了全局逻辑删除配置,但在某些实体类上也定义了 `@TableLogic` 注解,则会出现优先级问题。具体表现为:MyBatis-Plus 会优先读取实体类上的注解配置,而忽略全局配置中的逻辑删除字段设定[^3]。
**解决方法**
确保实体类的 `@TableLogic` 注解与全局配置保持一致;或者移除实体类上的注解以统一采用全局配置。
```yaml
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
logic-delete-field: deleted
```
---
#### 三、自动填充功能异常
在实现自动填充功能时,开发者通常会在实体类中加入 `@TableField(fill = FieldFill.INSERT)` 或其他类似的注解来标记需要自动生成的时间戳或其他字段。然而,在实际运行过程中可能出现字段未能成功赋值的现象[^4]。
**原因分析**
1. 缺少对应的 MetaObjectHandler 实现类。
2. 自动注入机制未生效。
**修复方案**
编写一个继承自 `MetaObjectHandler` 的处理器,并注册到 Spring 容器中:
```java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
```
同时确认已开启自动填充支持:
```yaml
mybatis-plus:
global-config:
db-config:
field-strategy: NOT_EMPTY
```
---
#### 四、关联查询性能低下
对于复杂的业务场景,尤其是涉及多表联查的情况下,单纯依赖 SQL 映射可能导致效率下降甚至内存溢出等问题。此时可考虑引入第三方扩展工具如 **mybatis-plus-join** 来优化查询逻辑[^2]。
安装方式如下:
```xml
<dependency>
<groupId>cn.iocoder</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>最新版本号</version>
</dependency>
```
随后按照官方文档完成初始化操作即可显著提升执行速度。
---
#### 五、权限校验失败 (RuoYi 框架特有)
部分基于 RuoYi 开发的应用程序由于安全策略限制,默认关闭外部网络访问接口的功能。一旦尝试非法调用 API 就会产生类似于 “401 Unauthorized” 这样的错误提示信息[^5]。
**应对措施**
调整应用服务器防火墙规则允许特定 IP 地址范围内的连接请求;另外还需验证 Token 是否合法以及是否携带必要的 Header 参数头文件。
---
### 总结
以上列举了几种较为典型的 MyBatis-Plus 使用过程中的障碍及其对应处理办法。希望这些经验能够帮助广大开发者快速定位并排除故障!
MyBatis-Plus的插件
### MyBatis-Plus 插件列表及其功能扩展
MyBatis-Plus 是一款强大的持久层框架,它不仅简化了开发流程,还提供了多种插件支持来增强其核心功能。以下是常见的 MyBatis-Plus 插件及其功能描述:
#### 1. 性能分析拦截器 (Performance Analysis Interceptor)
性能分析拦截器用于监控 SQL 执行时间并设置阈值,在超过指定的时间时会抛出异常或记录日志。这有助于优化查询效率和发现潜在的性能瓶颈[^1]。
```java
// 配置性能分析拦截器
@Bean
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor interceptor = new PerformanceInterceptor();
// 设置最大执行时间(单位:毫秒)
interceptor.setMaxTime(100);
return interceptor;
}
```
#### 2. 分页插件 (Pagination Plugin)
分页插件能够自动处理复杂查询中的分页逻辑,减少手动编写分页代码的工作量。该插件兼容多种数据库,并提供灵活的配置选项[^2]。
```java
// 使用分页插件进行查询
Page<User> page = new Page<>(current, size);
IPage<User> userPage = userService.page(page, queryWrapper);
```
#### 3. 条件构造器 (Query Wrapper)
虽然条件构造器本身不是传统意义上的插件,但它作为 MyBatis-Plus 的重要组成部分,增强了动态 SQL 构建的能力。开发者可以通过链式调用来构建复杂的查询条件[^3]。
```java
// 动态查询示例
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", "Tom").ge("age", 18);
List<User> users = userMapper.selectList(wrapper);
```
#### 4. 日志插件 (Logger Plugin)
日志插件可以帮助开发者调试 SQL 查询语句,输出详细的执行信息到控制台或其他日志系统中。这对于排查问题非常有用。
```xml
<!-- 在 mybatis-plus-config.xml 中启用日志 -->
<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
</configuration>
```
#### 5. 数据权限插件 (Tenant Line Plugin / Field Filter Plugin)
这些插件主要用于多租户场景下的数据隔离或者字段级别的过滤。通过定义特定规则,可以在不修改原有业务逻辑的情况下实现更细粒度的数据访问控制。
```java
// 多租户插件配置
@Bean
public TenantLineHandler tenantLineHandler() {
return (sqlParserHelper, metaObject, tableName) -> {
sqlParserHelper.addTableFilter(tableName, "tenant_id = #{userId}");
};
}
```
#### 6. 自动填充插件 (Meta Object Handler)
此插件能够在实体对象插入或更新时自动填充某些字段值,比如创建时间和最后修改时间等通用属性。
```java
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
```
以上列举了几种常用的 MyBatis-Plus 插件及其实现方式,每一种都针对不同的应用场景进行了设计,极大地方便了实际项目的开发工作。
---
阅读全文
相关推荐















