springboot mybatis-plus(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在现代 Java 开发中,Spring Boot 和 MyBatis-Plus 的组合已成为快速构建企业级应用的热门选择。Spring Boot 通过简化配置和依赖管理,让开发者更专注于业务逻辑;而 MyBatis-Plus 则通过增强 MyBatis 的功能,提供了更高效的数据操作能力。本文将从基础概念到实战案例,逐步讲解如何利用 Spring Boot MyBatis-Plus 快速搭建高可用的数据库交互层。


一、环境搭建与快速入门

1.1 项目初始化

首先需要创建一个 Spring Boot 项目。通过 Spring Initializr 选择以下依赖:

  • Spring Web:提供 RESTful API 支持
  • Spring Data JPA(可选,用于对比 MyBatis-Plus)
  • MySQL Driver:数据库驱动

pom.xml 中添加 MyBatis-Plus 依赖:

<dependency>  
  <groupId>com.baomidou</groupId>  
  <artifactId>mybatis-plus-boot-starter</artifactId>  
  <version>3.5.3</version>  
</dependency>  

1.2 数据库配置

application.properties 中配置数据库连接:

spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false  
spring.datasource.username=root  
spring.datasource.password=123456  
mybatis-plus.mapper-locations=classpath:mapper/*.xml  

1.3 快速验证

创建一个简单的 UserController

@RestController  
public class UserController {  
    @Autowired  
    private UserMapper userMapper;  

    @GetMapping("/users")  
    public List<User> list() {  
        return userMapper.selectList(null);  
    }  
}  

通过访问 /users 接口即可验证 MyBatis-Plus 是否正常工作。


二、核心功能详解

2.1 自动化配置

MyBatis-Plus 通过 @MapperScan 注解自动扫描 Mapper 接口,无需手动编写 XML 配置。例如:

@Configuration  
@MapperScan("com.example.mapper")  
public class MyBatisPlusConfig {  
}  

这类似于 Spring 的自动装配机制,减少了开发者的手动配置工作量。

2.2 魔法方法(Magic Methods)

MyBatis-Plus 提供了 20+ 通用方法,覆盖常见的 CRUD 操作:
| 方法名 | 作用 |
|-----------------------|--------------------------------|
| selectById(id) | 根据主键查询单条记录 |
| insert(entity) | 插入单条记录 |
| updateById(entity) | 根据主键更新记录 |
| deleteById(id) | 根据主键删除记录 |

示例

// 插入一条用户数据  
User user = new User();  
user.setName("John Doe");  
userMapper.insert(user);  

2.3 条件构造器(QueryWrapper)

通过 QueryWrapper 可以灵活构建动态查询条件:

QueryWrapper<User> wrapper = new QueryWrapper<>();  
wrapper.eq("age", 18).ge("score", 90);  
List<User> list = userMapper.selectList(wrapper);  

这里 eq 表示等于,ge 表示大于等于,类似乐高积木,可自由拼接条件。


三、代码生成器:解放生产力

3.1 一键生成代码

MyBatis-Plus 提供了代码生成器 AutoGenerator,可自动生成实体类、Mapper、Service 等代码。例如:

AutoGenerator generator = new AutoGenerator();  
generator.setDataSource(new DataSourceConfig()  
    .setUrl("jdbc:mysql://localhost:3306/test"));  
generator.setGlobalConfig(new GlobalConfig().setOutputDir("src/main/java"));  
generator.execute();  

运行后,系统会根据数据库表结构自动生成代码,极大提升开发效率。

3.2 生成代码的结构优化

通过配置 FileOverride 可以覆盖已有文件,避免重复生成:

GlobalConfig gc = new GlobalConfig();  
gc.setFileOverride(true);  
generator.setGlobalConfig(gc);  

四、分页与性能优化

4.1 分页插件(PageHelper)

MyBatis-Plus 支持分页插件 PageHelper,只需简单配置即可实现分页查询:

Page<User> page = new Page<>(1, 10);  
userMapper.selectPage(page, new QueryWrapper<User>().gt("age", 20));  

返回的 Page 对象包含总记录数、当前页数据等信息,方便前端分页展示。

4.2 逻辑删除

通过 @TableLogic 注解实现软删除,避免直接删除数据:

@Data  
public class User {  
    @TableId  
    private Long id;  
    @TableLogic  
    private Integer deleted; // 0=未删除,1=已删除  
}  

使用 selectList() 时,会自动过滤 deleted=1 的记录。


五、实战案例:用户权限系统

5.1 需求分析

设计一个简单的用户权限系统,包含以下功能:

  • 用户注册与登录
  • 角色管理(管理员、普通用户)
  • 权限控制(基于角色的接口访问限制)

5.2 数据库设计

创建 userrole 表:

CREATE TABLE `user` (  
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,  
  `username` VARCHAR(50) NOT NULL UNIQUE,  
  `password` VARCHAR(100) NOT NULL,  
  `role_id` BIGINT NOT NULL,  
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP  
);  

CREATE TABLE `role` (  
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,  
  `name` VARCHAR(50) NOT NULL UNIQUE  
);  

5.3 实现角色关联

通过 @TableField 注解关联 role 表:

@Data  
public class User {  
    private Long id;  
    private String username;  
    private String password;  
    @TableField(exist = false)  
    private Role role; // 非数据库字段,用于存储关联对象  
}  

5.4 权限控制拦截器

通过 HandlerInterceptor 实现角色校验:

@Component  
public class AuthInterceptor implements HandlerInterceptor {  
    @Override  
    public boolean preHandle(HttpServletRequest request,  
                            HttpServletResponse response,  
                            Object handler) {  
        String role = ((User) request.getSession().getAttribute("user")).getRole().getName();  
        if (!role.equals("admin") && request.getRequestURI().contains("/admin")) {  
            response.sendRedirect("/login");  
            return false;  
        }  
        return true;  
    }  
}  

六、进阶特性与最佳实践

6.1 动态数据源

通过 DynamicDataSource 实现读写分离:

@Configuration  
public class DataSourceConfig {  
    @Bean  
    public DynamicDataSource dynamicDataSource() {  
        DynamicDataSource dataSource = new DynamicDataSource();  
        dataSource.setTargetDataSources(  
            Map.of(  
                "master", masterDataSource(),  
                "slave", slaveDataSource()  
            )  
        );  
        return dataSource;  
    }  
}  

6.2 缓存优化

结合 Redis 缓存高频查询数据:

@Cacheable(value = "user", key = "#id")  
public User getUserById(Long id) {  
    return userMapper.selectById(id);  
}  

6.3 异常处理统一化

通过 @ControllerAdvice 捕获全局异常:

@ControllerAdvice  
public class GlobalExceptionHandler {  
    @ExceptionHandler(EntityNotFoundException.class)  
    public ResponseEntity<String> handleEntityNotFound() {  
        return ResponseEntity.status(404).body("Resource not found");  
    }  
}  

结论

通过本文的讲解,开发者可以掌握 Spring Boot MyBatis-Plus 的核心功能与实战技巧。无论是快速搭建基础项目,还是实现复杂业务场景,MyBatis-Plus 的自动化特性与扩展性都能显著提升开发效率。建议读者通过实际项目不断实践,并参考官方文档探索更多高级功能。记住,技术的掌握需要结合实践,不断优化代码结构,才能真正发挥框架的优势。

如果对本文中的案例或代码有疑问,欢迎在评论区留言讨论!

最新发布