探索 MyBatis - Plus:从入门到精通

一、引言

MyBatis - Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上简化了开发流程,提供了更加强大的功能。它可以帮助开发者更高效地进行数据库持久层的开发,减少大量的重复代码。本文将详细介绍 MyBatis - Plus 的创建、使用方法以及相关知识点。

二、MyBatis - Plus 的创建步骤

1. 环境准备

  • 确保你的项目是基于 Java 的,并且已经安装好合适的 JDK。对于项目的构建工具,如果使用 Maven,在 pom.xml 文件中添加以下依赖:
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis - plus - boot - starter</artifactId>
    <version>最新版本号</version>
</dependency>

如果是 Gradle 项目,则在 build.gradle 文件中添加相应依赖:

implementation 'com.baomidou:mybatis - plus - boot - starter:最新版本号'

2. 配置数据源

  • 在 Spring Boot 项目中(MyBatis - Plus 常与 Spring Boot 结合使用),在 application.properties 或 application.yml 文件中配置数据源相关信息。以 MySQL 为例,application.yml 配置如下:
spring:
  datasource:
    driver - class - name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
    username: root
    password: your_password

3. 配置 MyBatis - Plus

  • 在 Spring Boot 项目中,无需额外的 MyBatis - Plus 核心配置文件(当然也可以自定义配置)。如果需要自定义配置,可以创建 MybatisPlusConfig 类。例如:
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 可以在这里添加拦截器等自定义配置
        return interceptor;
    }
}

4. 创建实体类

  • 创建与数据库表对应的实体类。假设我们有一个 User 表,实体类 User 如下:
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("user")
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

这里使用了 Lombok 的 @Data 注解来简化 getter、setter 等方法的编写,@TableName 注解指定了实体类对应的表名。

5. 创建 Mapper 接口

  • 创建继承自 BaseMapper 的 Mapper 接口。对于 User 实体类,UserMapper 接口如下:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper extends BaseMapper<User> {
}

三、MyBatis - Plus 的使用

1. 基本的 CRUD 操作

  • 插入数据:在服务层,可以通过注入 UserMapper 来插入数据。
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public void insertUser(User user) {
        userMapper.insert(user);
    }
}

  • 查询数据
// 根据 ID 查询
User user = userMapper.selectById(1L);

// 查询所有
List<User> userList = userMapper.selectList(null);

// 条件查询,使用 QueryWrapper
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三");
List<User> usersByName = userMapper.selectList(queryWrapper);

  • 更新数据
User user = new User();
user.setId(1L);
user.setName("李四");
userMapper.updateById(user);

  • 删除数据
// 根据 ID 删除
userMapper.deleteById(2L);

// 根据条件删除
QueryWrapper<User> deleteWrapper = new QueryWrapper<>();
deleteWrapper.lt("age", 18);
userMapper.delete(deleteWrapper);

2. 分页查询

  • 首先配置分页插件,在 MybatisPlusConfig 类中添加:
@Bean
public PaginationInterceptor paginationInterceptor() {
    return new PaginationInterceptor();
}

  • 然后在代码中进行分页查询:
Page<User> page = new Page<>(1, 10);
userMapper.selectPage(page, null);
System.out.println("当前页:" + page.getCurrent());
System.out.println("每页数量:" + page.getSize());
System.out.println("总记录数:" + page.getTotal());
System.out.println("数据列表:" + page.getRecords());

四、MyBatis - Plus 的知识点

1. 条件构造器(Wrapper)

  • 功能强大QueryWrapperUpdateWrapper 等条件构造器可以灵活地构建 SQL 语句中的 WHERE 子句和 SET 子句。除了简单的等于(eq)、大于(gt)、小于(lt)等条件,还有模糊查询(likenotLike)、范围查询(betweennotBetween)、分组(groupBy)、排序(orderByorderByDesc)等丰富的方法。
  • 示例
QueryWrapper<User> complexWrapper = new QueryWrapper<>();
complexWrapper.like("name", "张")
      .gt("age", 20)
      .orderByDesc("age")
      .groupBy("department");
List<User> complexResult = userMapper.selectList(complexWrapper);

2. 自动填充功能

  • 场景与实现:在某些情况下,我们希望在插入或更新数据时自动填充一些字段,比如创建时间、更新时间等。可以通过实现 MetaObjectHandler 接口来实现。
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
    }
}

3. 逻辑删除

  • 概念与配置:逻辑删除是指在数据库中不是真正地删除数据,而是通过一个字段(如 deleted)来标记数据是否被删除。在实体类中使用 @TableLogic 注解来配置逻辑删除。
@Data
@TableName("user")
@TableLogic
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    // 数据库中 deleted 字段类型为 Integer(0 表示未删除,1 表示已删除)
    private Integer deleted; 
}

当执行删除操作时,MyBatis - Plus 会自动将 deleted 字段更新为表示删除的值,查询时也会自动过滤掉已删除的数据。

4. 代码生成器

  • 快速生成代码:MyBatis - Plus 提供了代码生成器,可以根据数据库表结构快速生成实体类、Mapper 接口、Service 层、Controller 层等代码。示例代码如下:
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;

public class CodeGenerator {

    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("你的名字");
        gc.setOpen(false);
        gc.setFileOverride(false);
        gc.setServiceName("%sService");
        gc.setIdType(IdType.AUTO);
        gc.setDateType(DateType.ONLY_DATE);
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUrl("jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC");
        dsc.setUsername("root");
        dsc.setPassword("your_password");
        mpg.setDataSourceConfig(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("demo");
        pc.setParent("com.example");
        mpg.setPackageConfig(pc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        strategy.setLogicDeleteFieldName("deleted");

        // 自动填充配置
        TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
        TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(createTime);
        tableFills.add(updateTime);
        strategy.setTableFillList(tableFills);

        strategy.setRestControllerStyle(true);
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setInclude("user"); // 这里填写要生成代码的表名,可以多个
        mpg.setStrategyConfig(strategy);

        // 执行生成
        mpg.execute();
    }
}

五、总结

MyBatis - Plus 为数据库持久层开发带来了极大的便利,通过简单的配置和丰富的功能,可以快速实现各种复杂的数据库操作。从基本的 CRUD 到高级的条件查询、分页、自动填充、逻辑删除以及代码生成等功能,让开发者可以更专注于业务逻辑的实现,提高开发效率。希望本文能帮助你更好地理解和使用 MyBatis - Plus。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值