您好,登录后才能下订单哦!
# Spring Boot 2.x中怎么整合Mybatis-Plus
## 一、Mybatis-Plus简介
### 1.1 什么是Mybatis-Plus
Mybatis-Plus(简称MP)是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发、提高效率而生。它具有以下特性:
- **无侵入**:只做增强不做改变,引入它不会对现有工程产生影响
- **损耗小**:启动即会自动注入基本CRUD,性能基本无损耗
- **强大的CRUD操作**:内置通用Mapper、通用Service,仅需少量配置即可实现大部分CRUD操作
- **支持Lambda形式调用**:通过Lambda表达式,方便的编写各类查询条件
- **支持主键自动生成**:支持多达4种主键策略
- **支持ActiveRecord模式**:支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作
- **内置分页插件**:基于Mybatis物理分页,开发者无需关心具体操作
- **内置性能分析插件**:可输出SQL语句以及其执行时间
- **内置全局拦截插件**:提供全表delete、update操作智能分析阻断
### 1.2 Mybatis-Plus与Mybatis的关系
Mybatis-Plus是Mybatis的增强工具,它与Mybatis的关系可以总结为:
1. **完全兼容**:所有Mybatis的功能和特性在Mybatis-Plus中都得到保留
2. **简化开发**:通过内置通用Mapper和Service减少了大量模板代码
3. **功能扩展**:提供了Mybatis本身不具备的许多实用功能
4. **无缝集成**:可以与现有Mybatis项目完美融合,逐步迁移
## 二、环境准备
### 2.1 开发环境要求
在开始整合之前,请确保你的开发环境满足以下要求:
- JDK 1.8+
- Maven 3.0+
- Spring Boot 2.x
- MySQL 5.7+(或其他支持的数据库)
### 2.2 创建Spring Boot项目
可以通过以下两种方式创建Spring Boot项目:
#### 方式一:使用Spring Initializr创建
1. 访问 https://start.spring.io/
2. 选择项目配置:
   - Project: Maven Project
   - Language: Java
   - Spring Boot: 2.x.x
3. 添加依赖:Web、MySQL Driver、MyBatis Framework
4. 生成并下载项目
#### 方式二:使用IDEA创建
1. 打开IDEA,选择File -> New -> Project
2. 选择Spring Initializr
3. 填写项目信息
4. 添加依赖:Web、MySQL、MyBatis
5. 完成创建
## 三、添加Mybatis-Plus依赖
### 3.1 引入核心依赖
在项目的`pom.xml`中添加Mybatis-Plus的starter依赖:
```xml
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
根据项目需要,可以添加以下可选依赖:
<!-- 代码生成器 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.1</version>
</dependency>
<!-- 分页插件 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.1</version>
</dependency>
<!-- 性能分析插件 -->
<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.9.1</version>
</dependency>
由于我们使用了Mybatis-Plus的starter,可以移除之前引入的Mybatis原生依赖:
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>${mybatis-spring-boot.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
        </exclusion>
    </exclusions>
</dependency>
在application.yml或application.properties中配置数据库连接信息:
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis_plus_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
mybatis-plus:
  configuration:
    # 开启驼峰命名转换
    map-underscore-to-camel-case: true
    # 日志实现
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      # 主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
      id-type: auto
      # 逻辑删除配置
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
  # mapper.xml文件位置
  mapper-locations: classpath*:/mapper/**/*.xml
  # 实体扫描,多个package用逗号或者分号分隔
  type-aliases-package: com.example.demo.entity
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.util.Date;
@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    
    private String name;
    
    private Integer age;
    
    private String email;
    
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    
    @Version
    private Integer version;
    
    @TableLogic
    private Integer deleted;
}
注解说明:
- @TableName:指定数据库表名
- @TableId:指定主键,可配置主键生成策略
- @TableField:指定字段属性,如自动填充
- @Version:乐观锁注解
- @TableLogic:逻辑删除注解
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
    // 可以自定义方法
    User selectUserByName(String name);
}
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;
public interface UserService extends IService<User> {
    // 自定义业务方法
    User getByName(String name);
}
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    
    @Override
    public User getByName(String name) {
        return lambdaQuery().eq(User::getName, name).one();
    }
}
实现MetaObjectHandler接口来处理自动填充字段:
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
    }
    
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }
}
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 {
    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}
使用示例:
// 分页查询
Page<User> page = new Page<>(1, 10); // 当前页,每页大小
userMapper.selectPage(page, null);
List<User> users = page.getRecords();
long total = page.getTotal();
在MybatisPlusConfig中添加:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    // 乐观锁插件
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
    return interceptor;
}
使用示例:
// 先查询
User user = userMapper.selectById(1L);
// 修改
user.setName("new name");
// 更新,version会自动+1
userMapper.updateById(user);
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    // 动态表名插件
    DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
    dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {
        // 根据业务动态返回表名
        return "user_" + LocalDate.now().getYear();
    });
    interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
    return interceptor;
}
Mybatis-Plus提供了强大的代码生成器,可以快速生成Entity、Mapper、Service、Controller等代码。
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.Collections;
public class CodeGenerator {
    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis_plus_demo?serverTimezone=Asia/Shanghai", "root", "123456")
                .globalConfig(builder -> {
                    builder.author("author") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir("D://code"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.example.demo") // 设置父包名
                            .moduleName("system") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.xml, "D://code")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude("user") // 设置需要生成的表名
                            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
    }
}
执行上述代码后,会在指定目录生成以下文件:
- entity/User.java:实体类
- mapper/UserMapper.java:Mapper接口
- service/UserService.java:Service接口
- service/impl/UserServiceImpl.java:Service实现类
- controller/UserController.java:Controller类
- mapper/xml/UserMapper.xml:Mapper XML文件
解决方案:
1. 确保主类上有@MapperScan注解扫描Mapper接口
2. 检查Mybatis-Plus版本与Spring Boot版本是否兼容
3. 确认数据库配置正确
解决方案:
1. 确保正确配置了分页插件
2. 检查是否创建了MybatisPlusInterceptor的Bean
3. 确认Page参数正确传递
解决方案:
1. 确保实体类字段上有@TableField(fill = FieldFill.INSERT)等注解
2. 检查是否实现了MetaObjectHandler接口并注册为Bean
3. 确认字段名称与实体类属性一致
src/main/java
├── com.example.demo
│   ├── config       // 配置类
│   ├── controller   // 控制器
│   ├── entity       // 实体类
│   ├── mapper       // Mapper接口
│   ├── service      // 服务接口
│   │   └── impl    // 服务实现
│   └── util        // 工具类
src/main/resources
├── mapper          // XML文件
├── application.yml // 配置文件
@Transactional注解管理事务insertBatch等方法本文详细介绍了在Spring Boot 2.x项目中整合Mybatis-Plus的完整过程,包括:
通过Mybatis-Plus,我们可以极大地提高开发效率,减少样板代码,同时保持Mybatis的灵活性。希望本文能帮助你顺利在项目中集成Mybatis-Plus,享受更高效的开发体验。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。