MyBatis-Plus框架全面解析:从入门到精通实战

2024-06-21 李腾 182 次阅读 0 次点赞
MyBatis-Plus作为MyBatis的强大增强工具,在保持MyBatis所有特性的基础上,提供了丰富的便捷功能。本文全面介绍了MyBatis-Plus的核心使用方法,包括详细的依赖配置步骤、完整的yml配置示例、实体类注解使用技巧、Service层封装实践、自定义拦截器实现以及代码生成器的高效应用。通过具体的Controller层示例和复杂查询场景演示,帮助开发者快速上手并应用于实际项目中,显著提升开发效率和数据操作便捷性。

MyBatis-Plus 是一个强大的 MyBatis 增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率。

常用网站

参考文档:https://mp.baomidou.com/

代码生成器:https://mp.baomidou.com/guide/generator.html

依赖配置

Maven 依赖配置

<!-- pom.xml -->
<properties>
    <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
</properties>

<dependencies>
    <!-- MyBatis-Plus 核心依赖 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>${mybatis-plus.version}</version>
    </dependency>
    
    <!-- 代码生成器(可选) -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>${mybatis-plus.version}</version>
    </dependency>
    
    <!-- 数据库驱动(以MySQL为例) -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    
    <!-- Spring Boot Web(如果使用Spring Boot) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

Gradle 依赖配置

// build.gradle
dependencies {
    implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.3.1'
    implementation 'com.baomidou:mybatis-plus-generator:3.5.3.1'
    implementation 'mysql:mysql-connector-java:8.0.33'
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

配置文件

application.yml 配置

# application.yml
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis_plus_demo?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: 123456

mybatis-plus:
  configuration:
    # 日志实现
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 驼峰命名转换
    map-underscore-to-camel-case: true
  global-config:
    db-config:
      # 主键类型
      id-type: auto
      # 逻辑删除字段名
      logic-delete-field: deleted
      # 逻辑删除值
      logic-delete-value: 1
      # 逻辑未删除值
      logic-not-delete-value: 0
  mapper-locations: classpath*:/mapper/**/*.xml

实体类示例

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;

@Data
@TableName("user")
public class User {
    
    @TableId(type = IdType.AUTO)
    private Long id;
    
    private String username;
    
    private String email;
    
    private Integer age;
    
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    
    @TableLogic
    private Integer deleted;
}

Mapper 接口

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 可以在此处添加自定义方法
    User selectByUsername(String username);
}

Service 层

Service 接口

import com.baomidou.mybatisplus.extension.service.IService;

public interface UserService extends IService<User> {
    // 自定义业务方法
    User getByUsername(String username);
}

Service 实现

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    
    @Override
    public User getByUsername(String username) {
        return baseMapper.selectByUsername(username);
    }
}

代理配置示例

自定义拦截器(AOP代理)

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class DataPermissionAspect {
    
    /**
     * 数据权限拦截器
     */
    @Around("execution(* com.example.mapper.*.*(..))")
    public Object dataPermissionInterceptor(ProceedingJoinPoint point) throws Throwable {
        try {
            // 前置处理:设置数据权限条件
            setDataPermission();
            
            // 执行原方法
            return point.proceed();
            
        } finally {
            // 后置处理:清理数据权限条件
            clearDataPermission();
        }
    }
    
    private void setDataPermission() {
        // 实现数据权限逻辑
        // 例如:自动添加部门过滤条件
    }
    
    private void clearDataPermission() {
        // 清理数据权限条件
    }
}

MyBatis-Plus 拦截器

import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;

@Component
public class CustomInterceptor implements InnerInterceptor {
    
    @Override
    public void beforeQuery(Executor executor, MappedStatement ms, 
                          Object parameter, RowBounds rowBounds, 
                          ResultHandler resultHandler) {
        // 查询前置处理
        System.out.println("执行查询操作: " + ms.getId());
    }
    
    @Override
    public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) {
        // 更新前置处理
        System.out.println("执行更新操作: " + ms.getId());
    }
}

配置类

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {
    
    /**
     * 添加MyBatis-Plus插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        
        // 分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        
        // 添加自定义拦截器
        interceptor.addInnerInterceptor(new CustomInterceptor());
        
        return interceptor;
    }
    
    /**
     * 自动填充处理器
     */
    @Bean
    public MetaObjectHandler metaObjectHandler() {
        return new 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());
            }
        };
    }
}

使用示例

Controller 层

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    /**
     * 分页查询
     */
    @GetMapping("/page")
    public Page<User> page(@RequestParam(defaultValue = "1") Integer current,
                          @RequestParam(defaultValue = "10") Integer size) {
        return userService.page(new Page<>(current, size));
    }
    
    /**
     * 条件查询
     */
    @GetMapping("/list")
    public List<User> list(@RequestParam String username) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.like("username", username);
        return userService.list(wrapper);
    }
    
    /**
     * 根据ID查询
     */
    @GetMapping("/{id}")
    public User getById(@PathVariable Long id) {
        return userService.getById(id);
    }
    
    /**
     * 新增用户
     */
    @PostMapping
    public Boolean save(@RequestBody User user) {
        return userService.save(user);
    }
    
    /**
     * 更新用户
     */
    @PutMapping
    public Boolean update(@RequestBody User user) {
        return userService.updateById(user);
    }
    
    /**
     * 删除用户(逻辑删除)
     */
    @DeleteMapping("/{id}")
    public Boolean delete(@PathVariable Long id) {
        return userService.removeById(id);
    }
}

复杂查询示例

@Service
public class ComplexQueryService {
    
    @Autowired
    private UserMapper userMapper;
    
    /**
     * 复杂条件查询
     */
    public List<User> complexQuery(String username, Integer minAge, Integer maxAge) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        
        wrapper.like(StringUtils.isNotBlank(username), "username", username)
               .ge(minAge != null, "age", minAge)
               .le(maxAge != null, "age", maxAge)
               .orderByDesc("create_time");
               
        return userMapper.selectList(wrapper);
    }
    
    /**
     * Lambda表达式查询
     */
    public List<User> lambdaQuery(String email) {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getEmail, email)
               .gt(User::getAge, 18);
               
        return userMapper.selectList(wrapper);
    }
}

代码生成器

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;

import java.util.Collections;

public class CodeGenerator {
    
    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis_plus_demo", "root", "123456")
            .globalConfig(builder -> {
                builder.author("developer")        // 设置作者
                    .enableSwagger()              // 开启 swagger 模式
                    .fileOverride()               // 覆盖已生成文件
                    .outputDir("D://mybatis-plus"); // 指定输出目录
            })
            .packageConfig(builder -> {
                builder.parent("com.example")     // 设置父包名
                    .moduleName("system")         // 设置父包模块名
                    .pathInfo(Collections.singletonMap(OutputFile.xml, "D://mybatis-plus"));
            })
            .strategyConfig(builder -> {
                builder.addInclude("user")        // 设置需要生成的表名
                    .addTablePrefix("t_", "c_"); // 设置过滤表前缀
            })
            .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
            .execute();
    }
}

总结

MyBatis-Plus 提供了丰富的功能和便捷的API,大大简化了MyBatis的使用。通过合理的配置和代理机制,可以实现数据权限控制、自动填充、逻辑删除等高级功能。建议在实际项目中根据具体需求选择合适的配置和扩展方式。

本文由人工编写,AI优化,转载请注明原文地址: MyBatis-Plus完整使用指南:依赖配置与实战教程

评论 (2)

登录后发表评论
赵大侠2025-12-02 16:04:48
评论审核中,请耐心等待
逆光飞翔2025-12-02 13:54:01
评论审核中,请耐心等待