创新点
MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,在 MyBatis 基础上提供了更简化的 CRUD 操作、代码生成器和实用插件。以下是两者的核心区别:
1. 功能定位
MyBatis
-
基础 ORM 框架:提供 SQL 映射和执行功能,需手动编写 SQL 语句
-
灵活性高:支持 XML、注解等多种 SQL 定义方式
-
需编写大量样板代码:如 Mapper 接口、XML 映射文件
MyBatis-Plus
-
MyBatis 增强工具:不改变 MyBatis 原有功能,提供 "无 SQL" 开发体验
-
简化 CRUD 操作:内置通用 Mapper 和 Service,减少重复代码
-
自动代码生成:支持实体类、Mapper、Service 等代码自动生成
2. CRUD 操作方式
MyBatis
需要手动编写 Mapper 接口和 SQL:
// Mapper接口
public interface UserMapper {
MyBatis-Plus
继承BaseMapper
接口即可获得基础 CRUD 方法:
// 无需编写任何方法,直接继承BaseMapper
public interface UserMapper extends BaseMapper<User> {
// 可添加自定义方法
}
// 使用示例
User user = userMapper.selectById(1L);
3. 分页查询
MyBatis
需手动编写分页 SQL 和 RowBounds:
// XML中定义分页查询
<select id="selectUserPage" parameterType="map" resultType="User">
SELECT * FROM user LIMIT #{offset}, #{size}
</select>
MyBatis-Plus
内置分页插件,直接使用Page
对象:
// 配置分页插件
4. 条件构造器
MyBatis
需手动拼接 SQL 条件:
MyBatis-Plus
使用QueryWrapper
链式构造条件:
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", "张")
.ge("age", 18)
.orderByDesc("create_time");
List<User> userList = userMapper.selectList(wrapper);
5. 代码生成器
MyBatis
需手动创建实体类、Mapper 接口、Service 等代码
MyBatis-Plus
内置代码生成器,可自动生成全套代码:
// 代码生成示例
FastAutoGenerator.create("jdbc:mysql://localhost:3306/weblog", "root", "password")
.globalConfig(builder -> {
builder.outputDir("src/main/java")
.author("doubao")
.disableOpenDir();
})
.packageConfig(builder -> {
builder.parent("com.quanxiaoha.weblog")
.moduleName("web")
.entity("entity")
.mapper("mapper")
.service("service")
.controller("controller");
})
.strategyConfig(builder -> {
builder.addInclude("user", "role")
.addTablePrefix("t_", "sys_");
})
.execute();
6. 插件生态
MyBatis
需手动集成分页、乐观锁等插件
MyBatis-Plus
内置常用插件:
-
分页插件(PaginationInterceptor)
-
乐观锁插件(OptimisticLockerInterceptor)
-
自动填充插件(MetaObjectHandler)
-
SQL 性能分析插件(PerformanceInterceptor)
7. 适用场景
MyBatis
-
复杂 SQL 场景(如多表关联、自定义分页)
-
对 SQL 性能有严格要求的项目
-
需要高度定制化的 ORM 需求
MyBatis-Plus
-
快速开发 CRUD 应用
-
中小型项目(减少样板代码)
-
对 SQL 复杂度要求不高的场景
总结
特性 | MyBatis | MyBatis-Plus |
---|---|---|
SQL 编写 | 手动编写全部 SQL | 内置通用方法,支持无 SQL |
分页实现 | 手动编写分页 SQL | 内置分页插件 |
条件查询 | 手动拼接条件 | QueryWrapper 链式调用 |
代码生成 | 需第三方工具 | 内置代码生成器 |
学习成本 | 较高(需掌握 SQL 映射) | 较低(基于 MyBatis) |
适用场景 | 复杂 SQL 项目 | 快速 CRUD 开发 |
建议:如果项目 SQL 逻辑简单且追求开发效率,推荐使用 MyBatis-Plus;如果需要对 SQL 进行精细控制,或项目已有成熟的 MyBatis 架构,可继续使用 MyBatis。两者可以无缝集成,你也可以在 MyBatis 基础上选择性使用 MyBatis-Plus 的部分功能。
项目使用 MinIO 的原因及好处
原因
在博客项目中,可能会涉及到图片、附件等文件的存储和管理,而传统的文件系统存储方式可能存在一些局限性,如扩展性差、难以管理等。因此,需要一个专业的对象存储服务来解决这些问题。MinIO 作为一款轻量级的开源对象存储服务,具有简单易用、高性能、可扩展性强等特点,非常适合用于博客项目中的文件存储。
好处
-
轻量级与易用性:MinIO 是一个轻量级的对象存储系统,部署和配置都相对简单,不需要复杂的基础设施和专业的运维知识。对于小型项目或者开发团队来说,能够快速上手并集成到项目中。
-
高性能:MinIO 设计为高性能的对象存储,能够快速处理大量的文件上传和下载请求。在博客项目中,用户可能会频繁地进行图片、附件等文件的上传和查看操作,MinIO 的高性能可以确保这些操作的快速响应,提升用户体验。
-
兼容性:MinIO 兼容 Amazon S3 API,这意味着在使用 MinIO 时,可以利用现有的基于 S3 API 开发的工具和库,降低了开发成本和学习成本。同时,也方便了项目的迁移和扩展。
-
可扩展性:MinIO 支持分布式部署,可以通过添加节点来扩展存储容量和处理能力。随着博客项目的发展,用户数量和文件数量可能会不断增加,MinIO 的可扩展性可以确保系统能够适应这种增长。
-
数据安全:MinIO 提供了丰富的安全功能,如访问控制、加密等,可以确保存储在其中的数据的安全性。在博客项目中,用户上传的文件可能包含敏感信息,MinIO 的安全功能可以保护这些信息不被泄露。
MinIO 在项目中的用法
1. 配置 MinIO 客户端
在项目中,需要配置 MinIO 客户端来与 MinIO 服务器进行交互。以下是项目中配置 MinIO 客户端的示例代码:
// WebMinioConfig.java
package com.quanxiaoha.weblog.web.config;
import io.minio.MinioClient;
import lombok.Data;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import lombok.extern.slf4j.Slf4j;
import javax.annotation.PostConstruct;
import java.util.concurrent.TimeUnit;
上述代码中,通过 @Configuration
注解将 WebMinioConfig
类标记为配置类,使用 @Value
注解从配置文件中读取 MinIO 的相关配置信息,然后使用 MinioClient.builder()
方法创建 MinIO 客户端实例。
2. 初始化 MinIO 存储桶
在应用启动时,需要确保 MinIO 存储桶已经存在,并且配置了相应的访问策略。以下是项目中初始化 MinIO 存储桶的示例代码:
// MinioInitializer.java
package com.quanxiaoha.weblog.web.config;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.SetBucketPolicyArgs;
import io.minio.errors.ErrorResponseException;
import io.minio.errors.MinioException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;