Appearance
简介
MyBatis作为一款优秀的ORM(对象关系映射)框架,被广泛使用。
然而,随着项目规模的扩大和复杂度的提升,传统的MyBatis在代码量和开发效率上可能无法满足需求。为了解决这些问题,诞生了MyBatis-Plus。
MyBatis-Plus(以下简称MP)是对MyBatis的增强工具,旨在以最少的代码,实现对数据库的CRUD(增删改查)操作,提升开发效率。 本篇博客将全面详解MyBatis-Plus的使用,包括其特点、安装配置、基本使用、高级功能以及最佳实践。
什么是 MyBatis-Plus
MyBatis-Plus 是 MyBatis 的增强版,它在不改变 MyBatis 原有功能的基础上,为其提供了一系列的增强功能,如:
- CRUD 接口封装:提供了常用的 CRUD 接口,无需手写 SQL 即可实现单表的常规操作。
- 条件构造器:通过Lambda表达式封装查询条件,防止字段名写错,增强代码可读性。
- 分页插件:内置高效的分页插件,支持多种数据库分页。
MyBatis-Plus 的特点
- 开箱即用:只需少量配置,即可整合到项目中使用。
- 无侵入性:不影响已有的 MyBatis 配置和方法。
- 扩展性强:提供了丰富的插件,如分页、代码生成器、性能分析等。
- 支持主流数据库:如MySQL、Oracle、PostgreSQL、SQL Server等。
整合MybatisPlus
springboot + mybatisplus
环境准备
- JDK 版本:1.8 及以上
- Maven:项目管理工具
- 数据库:MySQL 5.7 及以上(以 MySQL 为例)
- IDE:IntelliJ IDEA 或其他
创建 Maven 项目
使用 IDE 新建一个 Maven 项目,选择合适的 GroupId 和 ArtifactId。
添加依赖
在 pom.xml 中添加 MyBatis-Plus 相关的依赖:
<dependencies>
<!-- MyBatis-Plus 核心依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- Druid 数据源(可选) -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.15</version>
</dependency>
<!-- Spring Boot Starter(如果是 Spring Boot 项目) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>修改配置
数据库配置
在 application.yml 或 application.properties 中配置数据库连接信息:
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: your_username
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver配置 MyBatis-Plus
MyBatis-Plus 的基本配置包括 mapper 的扫描路径,具体配置如下:
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
type-aliases-package: com.example.demo.entity基本使用
创建实体类
创建与数据库表对应的实体类,例如,一个 User 实体:
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("user") // 指定对应的数据库表名
public class User {
@TableId // 标识主键
private Long id;
private String name;
private Integer age;
private String email;
}创建 Mapper 接口
创建 Mapper 接口,继承自 BaseMapper<T>:
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> {
// 这里可以自定义方法或使用默认提供的 CRUD 方法
}编写 Service 层(可选)
为了更好的分层,可以创建 Service 接口和实现类:
package com.example.demo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.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.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 {
// 实现自定义业务方法
}测试 CRUD 操作
在 Controller 或测试类中使用:
package com.example.demo.controller;
import com.example.demo.entity.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
public String addUser(@RequestBody User user) {
boolean save = userService.save(user);
return save ? "success" : "fail";
}
// 查询所有用户
@GetMapping
public List<User> getUsers() {
return userService.list();
}
// 根据ID查询用户
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getById(id);
}
// 更新用户信息
@PutMapping
public String updateUser(@RequestBody User user) {
boolean update = userService.updateById(user);
return update ? "success" : "fail";
}
// 删除用户
@DeleteMapping("/{id}")
public String deleteUser(@PathVariable Long id) {
boolean remove = userService.removeById(id);
return remove ? "success" : "fail";
}
}条件构造器
MyBatis-Plus 提供了强大的条件构造器,支持链式调用,构建复杂的查询条件。
QueryWrapper
QueryWrapper 用于构建查询条件,例如:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
// 查询年龄大于20岁的用户
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 20);
List<User> users = userService.list(queryWrapper);LambdaQueryWrapper
LambdaQueryWrapper 使用 Lambda 表达式,更安全可靠:
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
// 查询名字为 "张三" 的用户
LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.eq(User::getName, "张三");
List<User> users = userService.list(lambdaQuery);常用条件方法
- eq:等于
- ne:不等于
- gt:大于
- ge:大于等于
- lt:小于
- le:小于等于
- between:在...之间
- like:模糊匹配
- in:包含于
- or:或者
- orderBy:排序
使用示例
复杂插件
实际使用的时候可以问一下大模型,这里的复杂程度算低的
LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>();
query.eq(User::getAge, 25)
.like(User::getName, "张")
.orderByDesc(User::getId);
List<User> users = userService.list(query);分页插件
MyBatis-Plus 自带分页插件,支持多种数据库。
引入分页插件
在配置类中注入分页插件:
package com.example.demo.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
// 旧版本使用 PaginationInterceptor,新版本改为 MybatisPlusInterceptor
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}使用分页查询
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
Page<User> page = new Page<>(1, 5); // 当前页,页大小
Page<User> userPage = userService.page(page);
List<User> records = userPage.getRecords();
long total = userPage.getTotal();与条件构造器结合
LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>();
query.gt(User::getAge, 20);
Page<User> page = new Page<>(1, 5);
Page<User> userPage = userService.page(page, query);代码生成器
MyBatis-Plus 提供了代码生成器,可快速生成实体类、Mapper、Service、Controller 等代码。
引入依赖
在 pom.xml 中添加:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- 代码生成器需要的模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>编写生成器代码
创建一个 Java 类,用于执行代码生成:
package com.example.demo;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.baomidou.mybatisplus.generator.config.*;
public class CodeGenerator {
public static void main(String[] args) {
// 1. 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setAuthor("YourName")
.setOutputDir(System.getProperty("user.dir") + "/src/main/java")
.setOpen(false)
.setServiceName("%sService")
.setSwagger2(true); // 实体属性 Swagger2 注解
// 2. 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&useSSL=false&characterEncoding=utf8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("your_username");
dsc.setPassword("your_password");
dsc.setDbType(DbType.MYSQL);
// 3. 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("demo")
.setParent("com.example");
// 4. 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel) // 表名生成策略
.setColumnNaming(NamingStrategy.underline_to_camel)
.setEntityLombokModel(true) // 自动生成 Lombok 注解
.setRestControllerStyle(true) // 生成 @RestController 控制器
.setInclude("user"); // 生成的表
// 5. 整合配置
AutoGenerator mpg = new AutoGenerator();
mpg.setGlobalConfig(gc)
.setDataSource(dsc)
.setPackageInfo(pc)
.setStrategy(strategy)
.setTemplateEngine(new VelocityTemplateEngine());
// 6. 执行生成
mpg.execute();
}
}执行该类的 main 方法,即可自动生成代码。
乐观锁与逻辑删除
乐观锁
MyBatis-Plus 支持乐观锁,需在实体类中加入 @Version 注解。
配置乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}在实体类中添加版本字段
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
@Version
private Integer version;
}乐观锁更新示例
User user = userService.getById(1L);
user.setEmail("new_email@example.com");
userService.updateById(user); // 更新时,会根据 version 乐观锁版本号进行控制逻辑删除
MyBatis-Plus 支持逻辑删除,无需真的删除数据库记录,而是在删除时更新标识。
配置逻辑删除
在 application.yml 中配置逻辑删除字段:
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0实体类中添加逻辑删除字段
import com.baomidou.mybatisplus.annotation.TableLogic;
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
@TableLogic
private Integer deleted; // 逻辑删除字段
}逻辑删除操作
userService.removeById(1L); // 实际上是更新 deleted 字段为 1多数据源支持
MyBatis-Plus 支持多数据源配置,可根据业务需求配置多个数据源。
配置多数据源
spring:
datasource:
primary:
url: jdbc:mysql://localhost:3306/primary_db
username: xxx
password: xxx
secondary:
url: jdbc:mysql://localhost:3306/secondary_db
username: xxx
password: xxx定义数据源配置类
编写配置类,指定不同的数据源。
性能分析插件
MyBatis-Plus 提供性能分析插件,可输出 SQL 语句及执行时间,便于调优。
配置性能分析插件
@Bean
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor interceptor = new PerformanceInterceptor();
interceptor.setMaxTime(1000); // 设置 SQL 执行的最大时间,超过则抛出异常
interceptor.setFormat(true); // 是否格式化 SQL
return interceptor;
}参考资料