【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 框架的对比

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

总结

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值