【mybatis Plus】简单介绍

MyBatis-Plus 是 MyBatis 的一个增强工具,它在保持 MyBatis 原有功能的基础上,提供了许多便捷的特性,旨在让开发者更高效地进行 CRUD 操作和复杂 SQL 的编写。它由中国的开源社区维护和发展,是国内较为流行的 ORM(对象关系映射)框架之一。

MyBatis-Plus 简介

MyBatis 简单介绍

在介绍 MyBatis-Plus 之前,我们简单了解一下 MyBatis。

  • MyBatis 是一个持久层框架,主要通过 XML 或注解的方式将 SQL 语句与 Java 对象关联。它对 JDBC 进行了封装,使得我们能够更方便地对数据库进行操作。

MyBatis 主要提供了以下功能:

  • SQL 的映射:通过 XML 或注解将 SQL 语句映射到 Java 对象。
  • 动态 SQL:通过提供动态 SQL 标签,实现 SQL 语句的动态拼接。
  • 高级查询功能:包括分页、缓存、事务管理等。

尽管 MyBatis 提供了强大的功能,但在某些情况下,它需要开发者编写大量的 SQL 语句,尤其是对于简单的 CRUD 操作,这会导致冗余代码的产生。

什么是 MyBatis-Plus?

MyBatis-Plus 是在 MyBatis 的基础上进行的增强和扩展,提供了许多开箱即用的功能,以简化开发过程。MyBatis-Plus 的目标是:

  • 无侵入:在不改变 MyBatis 原有功能和使用习惯的情况下进行增强。
  • 低损耗:通过优化的方式减少性能损耗。
  • 高效率:提供了一系列通用的 CRUD 操作,减少了开发者编写 SQL 的工作量。

MyBatis-Plus 提供了一些特性,如自动分页、代码生成器、通用 CRUD 操作、全局配置等,帮助开发者以更高效的方式进行数据持久化操作。

MyBatis-Plus 的特点

  1. 无侵入:在不改变原有代码的基础上扩展 MyBatis 的功能。

  2. CRUD 操作:提供了大量的通用 CRUD 方法,开发者无需再编写单一目的的 SQL 语句。

  3. 条件构造器:通过链式调用构建复杂 SQL 查询。

  4. 自动分页:内置分页插件,轻松实现分页功能。

  5. 代码生成器:通过配置生成实体类、Mapper 接口、XML 文件等,提升开发效率。

  6. 逻辑删除:轻松实现逻辑删除功能,不需要手动编写逻辑删除 SQL。

  7. 多租户:支持多租户系统的构建,简单易用。

  8. SQL 性能分析:提供 SQL 性能分析插件,方便开发者进行性能优化。

MyBatis-Plus 的架构

MyBatis-Plus 的架构设计比较简洁,其主要由以下几个模块组成:

  • 核心模块:提供基础功能,如通用 Mapper、Service 接口等。
  • 插件模块:提供扩展功能,如分页、乐观锁、多租户等。
  • 代码生成器:通过模板生成代码,简化开发工作。
  • 扩展模块:提供 MyBatis 无法实现或不易实现的功能。

MyBatis-Plus 的核心功能

下面详细介绍 MyBatis-Plus 的一些核心功能和特性。

1. 通用 CRUD 操作

MyBatis-Plus 提供了一套通用的 CRUD 操作,通过继承 BaseMapper 接口,开发者可以轻松实现增删改查功能。

  • BaseMapper<T> 接口

    BaseMapper 是 MyBatis-Plus 提供的一个基础接口,包含了常用的 CRUD 方法,如:

    public interface BaseMapper<T> {
          
          
    
        // 插入数据
        int insert(T entity);
    
        // 根据 ID 删除数据
        int deleteById(Serializable id);
    
        // 更新数据
        int updateById(T entity);
    
        // 根据 ID 查询数据
        T selectById(Serializable id);
    
        // 查询所有数据
        List<T> selectList(Wrapper<T> wrapper);
    }
    

    通过继承 BaseMapper,开发者可以直接使用这些方法,无需再手动编写单一目的的 SQL 语句。

  • 示例代码

    package com.example.demo.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.example.demo.model.User;
    
    public interface UserMapper extends BaseMapper<User> {
          
          
    }
    
    package com.example.demo.service;
    
    import com.baomidou.mybatisplus.extension.service.IService;
    import com.example.demo.model.User;
    
    public interface UserService extends IService<User> {
          
          
    }
    
    package com.example.demo.service.impl;
    
    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import com.example.demo.mapper.UserMapper;
    import com.example.demo.model.User;
    import com.example.demo.service.UserService;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
          
          
    }
    
    package com.example.demo.controller;
    
    import com.example.demo.model.User;
    import com.example.demo.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    
    @RestController
    @RequestMapping("/user")
    public class UserController {
          
          
    
        @Autowired
        private UserService userService;
    
        @PostMapping("/add")
        public boolean addUser(@RequestBody User user) {
          
          
            return userService.save(user);
        }
    
        @DeleteMapping("/delete/{id}")
        public boolean deleteUser(@PathVariable Long id) {
          
          
            return userService.removeById(id);
        }
    
        @PutMapping("/update")
        public boolean updateUser(@RequestBody User user) {
          
          
            return userService.updateById(user);
        }
    
        @GetMapping("/get/{id}")
        public User getUser(@PathVariable Long id) {
          
          
            return userService.getById(id);
        }
    
        @GetMapping("/list")
        public List<User> listUsers() {
          
          
            return userService.list();
        }
    }
    
2. 条件构造器

MyBatis-Plus 提供了条件构造器,允许开发者以链式调用的方式构建复杂 SQL 查询。条件构造器分为 QueryWrapperUpdateWrapper 两种,分别用于查询和更新操作。

  • QueryWrapper 示例

    package com.example.demo.service;
    
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.example.demo.model.User;
    import com.example.demo.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class UserQueryService {
          
          
    
        @Autowired
        private UserService userService;
    
        public List<User> queryUsers() {
          
          
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("age", 18).like("name", "Tom").orderByDesc("id");
    
            return userService.list(queryWrapper);
        }
    }
    
  • UpdateWrapper 示例

    package com.example.demo.service;
    
    import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
    import com.example.demo.model.User;
    import com.example.demo.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserUpdateService {
          
          
    
        @Autowired
        private UserService userService;
    
        public boolean updateUsers() {
          
          
            UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
            updateWrapper.eq("name", "Tom").set("age", 20);
    
            return userService.update(updateWrapper);
        }
    }
    
3. 分页插件

MyBatis-Plus 内置了分页插件,开发者只需进行简单的配置,即可实现分页功能。分页插件会自动拦截查询语句,并在执行时添加分页语句。

  • 分页插件配置

    package com.example.demo.config;
    
    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());
            return interceptor;
        }
    }
    
  • 分页查询示例

    package com.example.demo.service;
    
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.baomidou.mybatisplus.core.metadata.IPage;
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    import com.example.demo.model.User;
    import com.example.demo.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserPaginationService {
          
          
    
        @Autowired
        private UserService userService;
    
        public IPage<User> getUserPage(int page, int size) {
          
          
            Page<User> userPage = new Page<>(page, size);
            Query
    
    

Wrapper queryWrapper = new QueryWrapper<>();
queryWrapper.like(“name”, “Tom”);

      return userService.page(userPage, queryWrapper);
  }

}


#### 4. 代码生成器

MyBatis-Plus 提供了代码生成器,可以根据数据库表自动生成实体类、Mapper 接口、XML 文件等。代码生成器极大地减少了开发者手动编写代码的工作量。

- **代码生成器示例**

```java
package com.example.demo;

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/demo", "root", "password")
                .globalConfig(builder -> {
                    builder.author("YourName") // 设置作者
                           .outputDir(System.getProperty("user.dir") + "/src/main/java"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.example.demo") // 设置父包名
                           .moduleName("module") // 设置模块名
                           .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") + "/src/main/resources/mapper")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude("user") // 设置需要生成的表名
                           .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                })
                .execute();
    }
}
5. 逻辑删除

MyBatis-Plus 提供了逻辑删除功能,通过注解和配置,可以在不改变 SQL 语句的情况下实现逻辑删除。

  • 逻辑删除配置

    在实体类中使用 @TableLogic 注解标识逻辑删除字段:

    package com.example.demo.model;
    
    import com.baomidou.mybatisplus.annotation.TableLogic;
    import com.baomidou.mybatisplus.annotation.TableName;
    
    @TableName("user")
    public class User {
          
          
    
        private Long id;
        private String name;
        private Integer age;
    
        @TableLogic
        private Integer deleted; // 逻辑删除字段
    
        // getters and setters
    }
    

    在配置文件中启用逻辑删除:

    mybatis-plus:
      global-config:
        db-config:
          logic-delete-value: 1  # 逻辑删除值
          logic-not-delete-value: 0  # 逻辑未删除值
    
  • 逻辑删除示例

    package com.example.demo.service;
    
    import com.example.demo.model.User;
    import com.example.demo.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserDeleteService {
          
          
    
        @Autowired
        private UserService userService;
    
        public boolean deleteUser(Long id) {
          
          
            return userService.removeById(id); // 执行逻辑删除
        }
    }
    
6. 多租户

MyBatis-Plus 支持多租户系统,通过插件可以在不改变代码的情况下实现多租户功能。

  • 多租户插件配置

    package com.example.demo.config;
    
    import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
    import net.sf.jsqlparser.expression.StringValue;
    import net.sf.jsqlparser.expression.Expression;
    import net.sf.jsqlparser.expression.NullValue;
    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 TenantLineInnerInterceptor() {
          
          
                @Override
                public Expression getTenantId() {
          
          
                    // 实现获取租户 ID 的逻辑
                    return new StringValue("tenant_id");
                }
    
                @Override
                public boolean ignoreTable(String tableName) {
          
          
                    // 忽略多租户的表
                    return "tenant_ignored_table".equalsIgnoreCase(tableName);
                }
            });
            return interceptor;
        }
    }
    
7. SQL 性能分析

MyBatis-Plus 提供了 SQL 性能分析插件,开发者可以通过该插件分析 SQL 语句的执行性能。

  • SQL 性能分析插件配置

    package com.example.demo.config;
    
    import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.PerformanceInnerInterceptor;
    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 PerformanceInnerInterceptor());
            return interceptor;
        }
    }
    

MyBatis-Plus 的优缺点

MyBatis-Plus 在提高开发效率方面提供了许多功能,但它也有一些优缺点需要注意。

优点
  • 简化 CRUD 操作:提供了大量的通用 CRUD 方法,减少了开发者编写重复代码的工作量。
  • 强大的插件系统:提供了分页、逻辑删除、多租户等插件,满足各种复杂业务场景。
  • 代码生成器:通过代码生成器,可以快速生成实体类、Mapper 接口、XML 文件等,大大提高了开发效率。
  • 无侵入设计:在不改变 MyBatis 原有功能和使用习惯的情况下进行增强。
  • 高性能:通过优化的方式减少性能损耗,保持较高的执行效率。
缺点
  • 抽象层较高:MyBatis-Plus 提供了许多便捷功能,但某些情况下可能导致 SQL 语句的灵活性下降。
  • 学习曲线:MyBatis-Plus 提供了大量的功能和配置项,需要一定的学习成本来掌握。
  • 依赖性强:MyBatis-Plus 基于 MyBatis 进行开发,某些高级功能需要依赖 MyBatis 的特性。

MyBatis-Plus 的应用场景

MyBatis-Plus 适用于以下应用场景:

  • 企业级应用:MyBatis-Plus 提供了丰富的功能和插件,适用于各种复杂业务场景。
  • 数据驱动的应用:通过 MyBatis-Plus 的条件构造器和分页插件,可以轻松实现复杂查询和数据分页。
  • 高效开发:MyBatis-Plus 的代码生成器和通用 CRUD 方法可以大幅提高开发效率,适用于快速迭代和开发。

MyBatis-Plus 与其他 ORM 框架的对比

功能/框架 MyBatis MyBatis-Plus Hibernate Spring Data JPA
ORM 映射 手动配置 自动生成 自动生成 自动生成
动态 SQL 支持 支持 不支持 不支持
CRUD 操作 手动编写 通用方法 自动生成 自动生成
分页功能 手动编写 插件支持 内置支持 内置支持
代码生成 不支持 支持 不支持 不支持
多租户 手动实现 插件支持 插件支持 插件支持
逻辑删除 手动实现 插件支持 插件支持 插件支持
性能分析 不支持 插件支持 不支持 不支持

总结

MyBatis-Plus 是 MyBatis 的一个增强工具,提供了一系列强大的功能和插件,使得开发者可以更加高效地进行 CRUD 操作和复杂 SQL 的编写。通过 MyBatis-Plus 的通用 CRUD 操作、条件构造器、分页插件、代码生成器等功能,开发者可以在不改变原有代码的情况下,轻松实现各种复杂业务需求。尽管 MyBatis-Plus 有一些学习成本和抽象层次,但其在提高开发效率和降低代码冗余方面的优势是显而易见的,是企业级应用和数据驱动应用的理想选择。

更多内容请访问官方介绍:https://baomidou.com/introduce/

猜你喜欢

转载自blog.csdn.net/u013675821/article/details/140835673