Spring Boot 2.x中怎么整合Mybatis-Plus

发布时间:2021-07-30 14:10:59 作者:Leah
来源:亿速云 阅读:216
# 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>

3.2 可选依赖

根据项目需要,可以添加以下可选依赖:

<!-- 代码生成器 -->
<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>

3.3 排除Mybatis原生依赖

由于我们使用了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>

四、基础配置

4.1 数据库配置

application.ymlapplication.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

4.2 Mybatis-Plus基础配置

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

五、代码实现

5.1 创建实体类

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:逻辑删除注解

5.2 创建Mapper接口

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;

public interface UserMapper extends BaseMapper<User> {
    // 可以自定义方法
    User selectUserByName(String name);
}

5.3 创建Service层

接口

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();
    }
}

5.4 自动填充配置

实现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());
    }
}

六、高级功能

6.1 分页插件配置

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();

6.2 乐观锁插件配置

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);

6.3 动态表名插件

@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等代码。

7.1 配置代码生成器

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();
    }
}

7.2 生成代码说明

执行上述代码后,会在指定目录生成以下文件: - 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文件

八、常见问题解决

8.1 启动时报错”Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required”

解决方案: 1. 确保主类上有@MapperScan注解扫描Mapper接口 2. 检查Mybatis-Plus版本与Spring Boot版本是否兼容 3. 确认数据库配置正确

8.2 分页插件不生效

解决方案: 1. 确保正确配置了分页插件 2. 检查是否创建了MybatisPlusInterceptor的Bean 3. 确认Page参数正确传递

8.3 自动填充不生效

解决方案: 1. 确保实体类字段上有@TableField(fill = FieldFill.INSERT)等注解 2. 检查是否实现了MetaObjectHandler接口并注册为Bean 3. 确认字段名称与实体类属性一致

九、最佳实践

9.1 项目结构建议

src/main/java
├── com.example.demo
│   ├── config       // 配置类
│   ├── controller   // 控制器
│   ├── entity       // 实体类
│   ├── mapper       // Mapper接口
│   ├── service      // 服务接口
│   │   └── impl    // 服务实现
│   └── util        // 工具类
src/main/resources
├── mapper          // XML文件
├── application.yml // 配置文件

9.2 性能优化建议

  1. 合理使用缓存
  2. 避免N+1查询问题
  3. 使用@Transactional注解管理事务
  4. 批量操作使用insertBatch等方法
  5. 合理设计索引

十、总结

本文详细介绍了在Spring Boot 2.x项目中整合Mybatis-Plus的完整过程,包括:

  1. Mybatis-Plus的基本介绍和优势
  2. 环境准备和依赖配置
  3. 基础配置和代码实现
  4. 高级功能如分页、乐观锁等
  5. 代码生成器的使用
  6. 常见问题解决方案
  7. 项目最佳实践

通过Mybatis-Plus,我们可以极大地提高开发效率,减少样板代码,同时保持Mybatis的灵活性。希望本文能帮助你顺利在项目中集成Mybatis-Plus,享受更高效的开发体验。 “`

推荐阅读:
  1. 基于Spring Boot+Spring Security+JWT+Vue前后端分离的开源项目
  2. 五、spring boot整合mybatis-plus

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring boot mybatis-plus

上一篇:Java操作文件输出为字符串以及字符串输出为文件的示例分析

下一篇:Python如何实现给定一个句子倒序输出单词以及字母

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》