手记

MyBatis-Plus入门教程:快速搭建与基础操作

概述

MyBatis-Plus 是一个强大的 MyBatis 增强工具,旨在简化数据库操作并提高开发效率。它提供了一系列简化数据库操作的 API,支持 CRUD 操作、分页、逻辑删除等功能。该工具适用于各种需要频繁数据库操作的项目,并能显著提高开发效率。

MyBatis-Plus简介
MyBatis-Plus是什么

MyBatis-Plus 是一个 MyBatis 的增强工具,旨在简化 MyBatis 的操作,提高开发效率。它通过扩展 MyBatis 的原生功能,提供了一系列简化数据库操作的 API,使开发人员可以更加专注于业务逻辑的实现。

MyBatis-Plus的优势

MyBatis-Plus 相较于 MyBatis 有以下优势:

  1. 简化CRUD操作:MyBatis-Plus 提供了一套完整的 CRUD 操作方法,开发人员无需手动编写 SQL 语句,只需要调用相应的方法即可完成数据库的增删改查操作。
  2. 内置CRUD和分页功能:MyBatis-Plus 内置了多种数据库的 CRUD 功能以及分页操作,极大地简化了开发流程。
  3. 强类型查询:提供了基于 Lambda 表达式的条件构造器,可以方便地构建复杂的查询条件。
  4. 逻辑删除:支持逻辑删除而不是物理删除,即通过设置标记字段来实现删除操作,从而不直接删除数据库中的记录。
  5. 自动填充和填充策略:支持创建和更新时自动填充字段的功能,如时间戳、UUID等。
  6. 性能优化:提供了连接池的配置支持,可以优化数据库的连接性能。
  7. 更多功能:除了以上功能外,MyBatis-Plus 还提供了条件构造器、分页、乐观锁、数据字典、代码生成器等功能,极大提高了开发效率。
MyBatis-Plus的适用场景

MyBatis-Plus 可以应用于各种需要进行数据库操作的场景,尤其适合以下情况:

  1. 简化数据操作:适用于需要频繁进行数据库操作的项目,如在线商城、论坛、博客等。
  2. 提高开发效率:在快速开发或者敏捷开发场景下,使用 MyBatis-Plus 可以大幅提高开发效率。
  3. 复杂的业务逻辑:对于业务逻辑较为复杂的项目,MyBatis-Plus 提供的强类型查询功能可以更好地处理复杂的查询条件。
  4. 团队协作:在团队协作开发中,MyBatis-Plus 提供的代码生成器和内置功能可以减少重复性工作,提高代码的一致性和规范性。
环境搭建
添加依赖

在项目中引入 MyBatis-Plus 的依赖。这里以 Maven 为例,在 pom.xml 文件中添加如下依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.26</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置数据库连接

在项目的 application.ymlapplication.properties 文件中配置数据库连接信息:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
快速开始
创建实体类

定义实体类,MyBatis-Plus 依赖于 JPA 规范,因此实体类需要遵循 JPA 规范,如使用 @Table 注解指定表名, @Id 注解指定主键等:

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

@TableName("user")
public class User {

    @TableId(value = "id", type = TableId.Type.AUTO)
    private Long id;

    private String name;

    private Integer age;

    private String email;

    // 构造方法、getter、setter省略
}
创建Mapper接口

在 MyBatis-Plus 中,Mapper 接口继承自 BaseMapper 接口,通过这个接口可以快速继承相应的 CRUD 方法:

package com.example.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
}
配置MyBatis-Plus的核心配置

在 Spring Boot 项目中,MyBatis-Plus 的配置可以通过 mybatis-plus 相关的配置项完成。在 application.yml 或者 application.properties 文件中添加如下配置:

mybatis-plus:
  mapper-locations: classpath*:mapper/*Mapper.xml
  type-aliases-package: com.example.demo.entity
  global-config:
    db-config:
      id-type: auto
      logic-delete-value: 1
      logic-not-delete-value: 0
基本CRUD操作
增加数据

插入一条用户数据至数据库:

package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    public void insertUser() {
        User user = new User();
        user.setName("张三");
        user.setAge(25);
        user.setEmail("zhangsan@example.com");

        this.save(user);
    }
}
查询数据

查询用户数据,例如根据用户ID查询用户信息:

package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    public User getUserById(Long id) {
        return this.getById(id);
    }
}
更新数据

更新用户信息,例如更新名字:

package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    public void updateUser(Long id, String newName) {
        User user = new User();
        user.setId(id);
        user.setName(newName);
        this.updateById(user);
    }
}
删除数据

删除用户信息,例如逻辑删除用户:

package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    public void deleteUser(Long id) {
        this.removeById(id);
    }
}
标准查询操作
条件构造器使用

条件构造器 QueryWrapper 提供了一种方便的方法来构建复杂的查询条件,例如查询年龄大于20岁的用户:

package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    public List<User> getUsersByAgeGreaterThan(int age) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.gt("age", age);

        return this.list(wrapper);
    }
}
分页查询

MyBatis-Plus 提供了分页查询功能,通过 Page 对象传递页码和每页显示的条数来实现分页查询:

package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    public IPage<User> getUsersByPage(int currentPage, int pageSize) {
        Page<User> page = new Page<>(currentPage, pageSize);

        return this.page(page, new QueryWrapper<>());
    }
}
代码生成器使用
代码生成器配置

MyBatis-Plus 提供了代码生成器功能,用于自动生成实体类、Mapper 接口和 XML 文件等。配置代码生成器需要在 application.ymlapplication.properties 文件中添加如下配置:

mybatis-plus:
  code-gen:
    enable: true
    package-info:
      base-package: com.example.demo
      mapper-package: com.example.demo.mapper
      entity-package: com.example.demo.entity
    auto-remove-output: true
    auto-remove-old-mapper-xml: true
    auto-remove-old-entity: true
    auto-remove-old-pojo: true
    auto-remove-old-vo: true
    auto-remove-old-dto: true
    auto-remove-old-service: true
    auto-remove-old-service-impl: true
    auto-remove-old-controller: true
    auto-remove-old-vo-impl: true
    auto-remove-old-dto-impl: true
自动生成代码

使用代码生成器自动生成代码,可以通过命令行或者 Spring Boot 应用程序中调用代码生成器接口来实现。

通过命令行生成代码

在项目中添加如下方法,用于生成代码:

package com.example.demo;

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.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

public class CodeGenerator {

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

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
        gc.setAuthor("yourname");
        gc.setFileOverride(true);
        gc.setActiveRecord(false);
        gc.setEnableCache(false);
        gc.setBaseResultMap(true);
        gc.setBaseColumnList(true);
        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/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.example.demo");
        pc.setMapper("mapper");
        pc.setEntity("entity");
        mpg.setPackageInfo(pc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        strategy.setInclude("user");
        strategy.setController("UserController");
        mpg.setStrategy(strategy);

        mpg.execute();
    }
}

通过Spring Boot应用程序生成代码

在 Spring Boot 应用程序中,可以通过调用代码生成器接口来生成代码:

package com.example.demo;

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.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Autowired
    private CodeGenerator codeGenerator;

    public void run(String... args) throws Exception {
        codeGenerator.generate();
    }
}

package com.example.demo;

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.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

public class CodeGenerator {

    public void generate() {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
        gc.setAuthor("yourname");
        gc.setFileOverride(true);
        gc.setActiveRecord(false);
        gc.setEnableCache(false);
        gc.setBaseResultMap(true);
        gc.setBaseColumnList(true);
        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/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.example.demo");
        pc.setMapper("mapper");
        pc.setEntity("entity");
        mpg.setPackageInfo(pc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        strategy.setInclude("user");
        strategy.setController("UserController");
        mpg.setStrategy(strategy);

        mpg.execute();
    }
}

以上是关于 MyBatis-Plus 入门教程的详细步骤,从环境搭建到快速开始,再到基础操作与高级功能的使用,希望这些内容能帮助你快速掌握 MyBatis-Plus,提高开发效率。

0人推荐
随时随地看视频
慕课网APP