202519 | Mybatis-Plus

快速入门

MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,它在 MyBatis 的基础上只做增强不做改变,简化了开发,提高了效率。以下是 MyBatis-Plus 的快速入门指南,帮助您快速上手使用。


1. 环境准备

  • JDK:1.8 或以上版本。
  • Maven:用于依赖管理。
  • 数据库:MySQL、PostgreSQL 等(以 MySQL 为例)。

2. 创建 Maven 项目

在 IDE 中创建一个 Maven 项目,并在 pom.xml 中添加 MyBatis-Plus 和相关依赖。

pom.xml 配置
<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><!-- Lombok(可选,简化代码) --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version><scope>provided</scope></dependency><!-- Spring Boot Web(可选,用于测试) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.12</version></dependency>
</dependencies>

3. 配置数据库连接

application.ymlapplication.properties 中配置数据库连接信息。

application.yml 配置
spring:datasource:url: jdbc:mysql://localhost:3306/mybatis_plus_demo?useSSL=false&serverTimezone=UTCusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver

4. 创建实体类

使用 MyBatis-Plus 时,实体类需要与数据库表对应。可以使用 @TableName 注解指定表名,@TableId 注解指定主键。

示例:User 实体类
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;
}

5. 创建 Mapper 接口

MyBatis-Plus 提供了 BaseMapper 接口,直接继承即可获得常用的 CRUD 方法。

示例:UserMapper 接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper extends BaseMapper<User> {// 无需编写方法,BaseMapper 已提供常用方法
}

6. 测试 CRUD 操作

在测试类中测试 MyBatis-Plus 的 CRUD 功能。

示例:测试类
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
public class MyBatisPlusTest {@Autowiredprivate UserMapper userMapper;@Testpublic void testInsert() {User user = new User();user.setName("张三");user.setAge(25);user.setEmail("zhangsan@example.com");int result = userMapper.insert(user);System.out.println("插入结果:" + result);}@Testpublic void testSelect() {User user = userMapper.selectById(1L);System.out.println("查询结果:" + user);}@Testpublic void testUpdate() {User user = new User();user.setId(1L);user.setName("李四");int result = userMapper.updateById(user);System.out.println("更新结果:" + result);}@Testpublic void testDelete() {int result = userMapper.deleteById(1L);System.out.println("删除结果:" + result);}@Testpublic void testSelectList() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.ge("age", 20); // 查询年龄 >= 20 的用户List<User> userList = userMapper.selectList(queryWrapper);userList.forEach(System.out::println);}
}

7. 常用功能

(1)分页查询

MyBatis-Plus 提供了分页插件,只需简单配置即可实现分页查询。

配置分页插件
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}
}
分页查询示例
@Test
public void testSelectPage() {Page<User> page = new Page<>(1, 5); // 第 1 页,每页 5 条QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.ge("age", 20);IPage<User> userPage = userMapper.selectPage(page, queryWrapper);userPage.getRecords().forEach(System.out::println);
}
(2)条件构造器

MyBatis-Plus 提供了 QueryWrapperLambdaQueryWrapper,用于构建复杂的查询条件。

示例:LambdaQueryWrapper
@Test
public void testLambdaQueryWrapper() {LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.ge(User::getAge, 20); // 查询年龄 >= 20 的用户List<User> userList = userMapper.selectList(lambdaQueryWrapper);userList.forEach(System.out::println);
}

8. 总结

MyBatis-Plus 的核心优势在于:

  • 简化开发:通过继承 BaseMapper,无需编写 SQL 即可实现 CRUD 操作。
  • 功能强大:支持分页、条件构造器、代码生成器等高级功能。
  • 易于集成:与 Spring Boot 无缝集成,配置简单。

通过以上步骤,您可以快速入门 MyBatis-Plus,并在实际项目中应用。更多高级功能可参考 MyBatis-Plus 官方文档。

常见注解

以下是 MyBatis-Plus 常见注解 的表格整理,方便快速查阅和使用:


注解作用示例
@TableName指定实体类对应的数据库表名。@TableName("user")
@TableId指定实体类的主键字段。@TableId(type = IdType.AUTO)
@TableField指定实体类字段与数据库列的映射关系。@TableField("user_name")
@Version标识乐观锁字段。@Version
@EnumValue指定枚举类型字段的值与数据库存储值的映射。@EnumValue
@TableLogic标识逻辑删除字段。@TableLogic
@MapperScan指定 MyBatis Mapper 接口的扫描路径。@MapperScan("com.example.mapper")
@DS指定数据源(多数据源场景)。@DS("slave")
@InterceptorIgnore忽略某些拦截器(如分页拦截器)。@InterceptorIgnore(tenantLine = "true")
@SqlParser指定 SQL 解析器(如多租户场景)。@SqlParser(filter = true)
@KeySequence指定主键生成策略(如序列)。@KeySequence(value = "SEQ_USER", clazz = Long.class)
@OrderBy指定查询结果的排序规则。@OrderBy("age DESC")
@Param指定方法参数的名称(用于 XML 或注解中的 SQL)。@Param("userId") Long userId
@Insert标识插入操作的 SQL 注解。@Insert("INSERT INTO user (name, age) VALUES (#{name}, #{age})")
@Update标识更新操作的 SQL 注解。@Update("UPDATE user SET name = #{name} WHERE id = #{id}")
@Delete标识删除操作的 SQL 注解。@Delete("DELETE FROM user WHERE id = #{id}")
@Select标识查询操作的 SQL 注解。@Select("SELECT * FROM user WHERE id = #{id}")
@Results标识查询结果的映射关系。@Results({ @Result(column = "user_name", property = "name") })
@ResultMap引用已定义的 @Results 映射。@ResultMap("userResultMap")
@Mapper标识 MyBatis Mapper 接口。@Mapper
@Repository标识 DAO 层组件(Spring 注解)。@Repository

常用注解详解

1. @TableName

用于指定实体类对应的数据库表名。如果表名与实体类名不一致,可以使用该注解。

示例

@TableName("user")
public class User {// 字段定义
}
2. @TableId

用于指定实体类的主键字段。支持多种主键生成策略(如自增、UUID 等)。

示例

@TableId(type = IdType.AUTO)
private Long id;
3. @TableField

用于指定实体类字段与数据库列的映射关系。如果字段名与列名不一致,可以使用该注解。

示例

@TableField("user_name")
private String name;
4. @Version

用于标识乐观锁字段。MyBatis-Plus 会自动在更新时检查该字段的值。

示例

@Version
private Integer version;
5. @TableLogic

用于标识逻辑删除字段。MyBatis-Plus 会在删除操作时自动更新该字段的值。

示例

@TableLogic
private Integer deleted;
6. @DS

用于指定数据源(多数据源场景)。可以标注在方法或类上。

示例

@DS("slave")
public List<User> selectAll() {return userMapper.selectList(null);
}
7. @MapperScan

用于指定 MyBatis Mapper 接口的扫描路径。通常标注在 Spring Boot 启动类上。

示例

@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
8. @Param

用于指定方法参数的名称,适用于 XML 或注解中的 SQL。

示例

@Select("SELECT * FROM user WHERE id = #{userId}")
User selectById(@Param("userId") Long userId);

总结

MyBatis-Plus 提供了丰富的注解,用于简化开发、增强功能。通过合理使用这些注解,可以显著提高开发效率。更多注解和详细用法可参考 MyBatis-Plus 官方文档。

MyBatis约定

在 MyBatis 和 MyBatis-Plus 中,“约定大于配置”(Convention Over Configuration)是一种设计理念,旨在通过默认约定减少开发者的配置工作量,同时保持灵活性。以下是这一理念的详细介绍:


1. 什么是约定大于配置?

“约定大于配置” 是一种软件开发原则,强调通过默认约定来减少显式配置的需求。开发者只需遵循框架的默认规则,就可以快速实现功能,而不需要编写大量的配置文件。

在 MyBatis-Plus 中,这一理念得到了充分体现。例如:

  • 默认情况下,实体类的类名与数据库表名一致,字段名与列名一致。
  • 默认的主键生成策略是自增(IdType.AUTO)。
  • 默认的逻辑删除字段是 deleted,默认值为 0(未删除)。

2. MyBatis-Plus 中的约定大于配置

(1)表名与类名的映射
  • 默认约定:实体类的类名与数据库表名一致(驼峰转下划线)。
    • 例如:User 类默认映射到 user 表。
  • 自定义配置:如果需要自定义表名,可以使用 @TableName 注解。

示例

@TableName("t_user") // 自定义表名
public class User {// 字段定义
}

(2)字段名与列名的映射
  • 默认约定:实体类的字段名与数据库列名一致(驼峰转下划线)。
    • 例如:userName 字段默认映射到 user_name 列。
  • 自定义配置:如果需要自定义列名,可以使用 @TableField 注解。

示例

@TableField("user_name") // 自定义列名
private String userName;

(3)主键生成策略
  • 默认约定:主键生成策略为自增(IdType.AUTO)。
  • 自定义配置:如果需要自定义主键生成策略,可以使用 @TableId 注解。

示例

@TableId(type = IdType.ASSIGN_ID) // 使用雪花算法生成主键
private Long id;

(4)逻辑删除
  • 默认约定:逻辑删除字段为 deleted,默认值为 0(未删除),删除时更新为 1
  • 自定义配置:如果需要自定义逻辑删除字段,可以使用 @TableLogic 注解。

示例

@TableLogic
private Integer isDeleted; // 自定义逻辑删除字段

(5)自动填充字段
  • 默认约定:支持自动填充创建时间和更新时间字段。
  • 自定义配置:可以使用 @TableField 注解的 fill 属性指定填充策略。

示例

@TableField(fill = FieldFill.INSERT) // 插入时自动填充
private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE) // 插入和更新时自动填充
private LocalDateTime updateTime;

(6)分页查询
  • 默认约定:MyBatis-Plus 提供了分页插件,默认支持分页查询。
  • 自定义配置:可以通过配置 PaginationInterceptor 自定义分页行为。

示例

@Bean
public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();
}

3. 约定大于配置的优势

  • 减少配置:通过默认约定,开发者无需编写大量配置文件,减少了开发工作量。
  • 提高效率:遵循约定可以快速实现功能,提升开发效率。
  • 保持灵活:在需要时,可以通过注解或配置覆盖默认约定,满足个性化需求。

4. 示例:完整实体类

以下是一个遵循 “约定大于配置” 的实体类示例:

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;@Data
@TableName("user") // 自定义表名
public class User {@TableId(type = IdType.AUTO) // 主键自增private Long id;private String name; // 默认映射到 name 列@TableField("user_age") // 自定义列名private Integer age;@TableLogic // 逻辑删除字段private Integer deleted;@TableField(fill = FieldFill.INSERT) // 自动填充创建时间private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE) // 自动填充更新时间private LocalDateTime updateTime;
}

总结

MyBatis-Plus 通过 “约定大于配置” 的理念,提供了默认的规则和约定,减少了开发者的配置工作量。同时,通过注解和配置,开发者可以灵活地覆盖默认约定,满足个性化需求。这种设计既提高了开发效率,又保持了灵活性,是 MyBatis-Plus 的核心优势之一。

核心功能

条件构造器

image-20250320075510375

MyBatis-Plus 提供了强大的 条件构造器QueryWrapperLambdaQueryWrapper),用于动态构建复杂的 SQL 查询条件。以下是条件构造器的详细介绍和使用示例。


以下是 MyBatis-Plus 中四种条件构造器 的详细介绍,包括 常用方法使用示例,帮助您全面掌握它们的使用。


1. QueryWrapper

QueryWrapper 是用于 查询操作 的条件构造器,支持字符串形式的字段名。

常用方法
方法说明
eq等于 =
ne不等于 <>
gt大于 >
ge大于等于 >=
lt小于 <
le小于等于 <=
between介于 BETWEEN
notBetween不介于 NOT BETWEEN
like模糊查询 LIKE
notLike不模糊查询 NOT LIKE
in包含 IN
notIn不包含 NOT IN
isNull为空 IS NULL
isNotNull不为空 IS NOT NULL
orderByAsc按字段升序排序 ORDER BY ASC
orderByDesc按字段降序排序 ORDER BY DESC
groupBy按字段分组 GROUP BY
select指定查询字段
last在 SQL 语句末尾追加内容
示例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三").ge("age", 20).like("email", "example.com").orderByDesc("create_time");List<User> userList = userMapper.selectList(queryWrapper);

2. LambdaQueryWrapper

LambdaQueryWrapper 是用于 查询操作 的条件构造器,基于 Lambda 表达式,支持类型安全的字段引用。

常用方法

QueryWrapper 相同,但使用 Lambda 表达式指定字段名。

示例
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getName, "张三").ge(User::getAge, 20).like(User::getEmail, "example.com").orderByDesc(User::getCreateTime);List<User> userList = userMapper.selectList(lambdaQueryWrapper);

3. UpdateWrapper

UpdateWrapper 是用于 更新操作 的条件构造器,支持字符串形式的字段名。

常用方法
方法说明
eq等于 =
ne不等于 <>
gt大于 >
ge大于等于 >=
lt小于 <
le小于等于 <=
between介于 BETWEEN
notBetween不介于 NOT BETWEEN
like模糊查询 LIKE
notLike不模糊查询 NOT LIKE
in包含 IN
notIn不包含 NOT IN
isNull为空 IS NULL
isNotNull不为空 IS NOT NULL
set设置更新字段的值
setSql设置更新字段的 SQL 表达式
示例
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name", "张三").set("age", 30).set("email", "zhangsan@example.com");int result = userMapper.update(null, updateWrapper);

4. LambdaUpdateWrapper

LambdaUpdateWrapper 是用于 更新操作 的条件构造器,基于 Lambda 表达式,支持类型安全的字段引用。

常用方法

UpdateWrapper 相同,但使用 Lambda 表达式指定字段名。

示例
LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(User::getName, "张三").set(User::getAge, 30).set(User::getEmail, "zhangsan@example.com");int result = userMapper.update(null, lambdaUpdateWrapper);

5. 四种条件构造器的对比

条件构造器用途字段名形式类型安全适用场景
QueryWrapper查询字符串不支持简单的查询场景
LambdaQueryWrapper查询Lambda 表达式支持需要类型安全的查询场景
UpdateWrapper更新字符串不支持简单的更新场景
LambdaUpdateWrapper更新Lambda 表达式支持需要类型安全的更新场景

6. 使用建议

  • 查询操作
    • 如果字段名固定且简单,可以使用 QueryWrapper
    • 如果需要类型安全或字段名可能变化,推荐使用 LambdaQueryWrapper
  • 更新操作
    • 如果字段名固定且简单,可以使用 UpdateWrapper
    • 如果需要类型安全或字段名可能变化,推荐使用 LambdaUpdateWrapper

7. 示例:完整对比

查询操作
// 使用 QueryWrapper
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三").ge("age", 20).like("email", "example.com");// 使用 LambdaQueryWrapper
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getName, "张三").ge(User::getAge, 20).like(User::getEmail, "example.com");
更新操作
// 使用 UpdateWrapper
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name", "张三").set("age", 30).set("email", "zhangsan@example.com");// 使用 LambdaUpdateWrapper
LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(User::getName, "张三").set(User::getAge, 30).set(User::getEmail, "zhangsan@example.com");

总结

MyBatis-Plus 提供了四种条件构造器,分别用于查询和更新操作,并支持字符串字段名和 Lambda 表达式两种形式。通过合理选择条件构造器,可以显著提高代码的可读性、安全性和开发效率。以下是它们的核心优势:

  • 类型安全LambdaQueryWrapperLambdaUpdateWrapper 支持类型安全的字段引用。
  • 链式调用:支持链式调用,方便组合多个条件。
  • 灵活嵌套:支持嵌套条件,满足复杂查询和更新需求。

更多高级用法可参考 MyBatis-Plus 官方文档。

扩展功能

静态工具

在 MyBatis-Plus 中,静态工具类 提供了一些便捷的方法,可以在不依赖 Spring 容器的情况下使用 MyBatis-Plus 的功能。以下是常用的静态工具类及其应用场景的详细介绍。


1. Db 工具类

Db 是 MyBatis-Plus 提供的数据库操作工具类,支持直接执行 SQL 语句。

常用方法
方法说明
list查询列表
query查询单条记录
update更新操作
delete删除操作
execute执行任意 SQL 语句
应用场景
  • 在不依赖 Mapper 接口的情况下执行 SQL 语句。
  • 快速执行简单的查询、更新、删除操作。
示例
// 查询列表
List<User> userList = Db.list("SELECT * FROM user WHERE age > ?", 20);// 更新操作
int result = Db.update("UPDATE user SET age = ? WHERE id = ?", 30, 1);// 删除操作
int result = Db.delete("DELETE FROM user WHERE id = ?", 1);

2. SqlHelper 工具类

SqlHelper 是 MyBatis-Plus 提供的 SQL 辅助工具类,用于生成 SQL 语句或处理 SQL 相关逻辑。

常用方法
方法说明
getTableInfo获取表信息
getSqlStatement获取 SQL 语句
getSqlWhere获取 SQL WHERE 条件
应用场景
  • 动态生成 SQL 语句。
  • 获取表信息或 SQL 相关元数据。
示例
// 获取表信息
TableInfo tableInfo = SqlHelper.table(User.class);// 获取 SQL 语句
String sql = SqlHelper.getSqlStatement(UserMapper.class, "selectById");

3. StringUtils 工具类

StringUtils 是 MyBatis-Plus 提供的字符串工具类,用于处理字符串相关操作。

常用方法
方法说明
isBlank判断字符串是否为空
isNotBlank判断字符串是否非空
join拼接字符串
toCamelCase将字符串转换为驼峰命名
应用场景
  • 处理字符串相关逻辑。
  • 动态生成 SQL 语句或条件。
示例
// 判断字符串是否为空
boolean isBlank = StringUtils.isBlank("");// 拼接字符串
String result = StringUtils.join("a", "b", "c"); // 输出 "abc"

4. ReflectionKit 工具类

ReflectionKit 是 MyBatis-Plus 提供的反射工具类,用于处理 Java 反射相关操作。

常用方法
方法说明
getFieldValue获取字段值
setFieldValue设置字段值
getMethod获取方法
invokeMethod调用方法
应用场景
  • 动态获取或设置对象的字段值。
  • 动态调用对象的方法。
示例
User user = new User();
ReflectionKit.setFieldValue(user, "name", "张三");String name = ReflectionKit.getFieldValue(user, "name");

5. LambdaUtils 工具类

LambdaUtils 是 MyBatis-Plus 提供的 Lambda 表达式工具类,用于处理 Lambda 表达式相关操作。

常用方法
方法说明
getFieldName获取 Lambda 表达式对应的字段名
getMethodName获取 Lambda 表达式对应的方法名
应用场景
  • 动态获取 Lambda 表达式对应的字段名或方法名。
  • LambdaQueryWrapperLambdaUpdateWrapper 中使用。
示例
String fieldName = LambdaUtils.getFieldName(User::getName); // 输出 "name"

6. IdWorker 工具类

IdWorker 是 MyBatis-Plus 提供的 ID 生成工具类,用于生成分布式唯一 ID。

常用方法
方法说明
getId生成唯一 ID
get32UUID生成 32 位 UUID
应用场景
  • 生成分布式唯一 ID。
  • 生成 UUID。
示例
long id = IdWorker.getId(); // 生成唯一 ID
String uuid = IdWorker.get32UUID(); // 生成 32 位 UUID

7. 应用场景总结

工具类应用场景
Db直接执行 SQL 语句,无需依赖 Mapper 接口。避免循环依赖
SqlHelper动态生成 SQL 语句或处理 SQL 相关逻辑。
StringUtils处理字符串相关逻辑,动态生成 SQL 语句或条件。
ReflectionKit动态获取或设置对象的字段值,动态调用对象的方法。
LambdaUtils动态获取 Lambda 表达式对应的字段名或方法名。
IdWorker生成分布式唯一 ID 或 UUID。

总结

MyBatis-Plus 提供的静态工具类可以显著简化开发,尤其是在不依赖 Spring 容器的情况下执行数据库操作、处理字符串、反射或生成唯一 ID 等场景。通过合理使用这些工具类,可以提高代码的简洁性和开发效率。更多高级用法可参考 MyBatis-Plus 官方文档。

插件功能

MyBatis-Plus 提供了丰富的 插件 功能,用于扩展和增强 MyBatis 的核心功能。以下是 MyBatis-Plus 中常用插件的介绍及其使用实例。


1. 分页插件

分页插件用于实现数据库查询的分页功能。

配置分页插件
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}
}
使用示例
Page<User> page = new Page<>(1, 10); // 第 1 页,每页 10 条
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.ge("age", 20);IPage<User> userPage = userMapper.selectPage(page, queryWrapper);
userPage.getRecords().forEach(System.out::println);

2. 乐观锁插件

乐观锁插件用于实现乐观锁机制,防止并发更新冲突。

配置乐观锁插件
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}
}
使用示例
// 实体类中添加乐观锁字段
public class User {@Versionprivate Integer version;// 其他字段
}// 更新操作
User user = userMapper.selectById(1L);
user.setName("李四");
int result = userMapper.updateById(user);

3. SQL 性能分析插件

SQL 性能分析插件用于监控 SQL 执行时间,帮助优化 SQL 性能。

配置 SQL 性能分析插件
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {@Beanpublic PerformanceInterceptor performanceInterceptor() {PerformanceInterceptor interceptor = new PerformanceInterceptor();interceptor.setMaxTime(1000); // 设置 SQL 执行的最大时间(单位:ms)interceptor.setFormat(true);  // 格式化 SQL 语句return interceptor;}
}
使用示例

启用插件后,SQL 执行时间超过 maxTime 时会输出警告日志。


4. 动态表名插件

动态表名插件用于动态切换表名,适用于分表场景。

配置动态表名插件
import com.baomidou.mybatisplus.extension.plugins.DynamicTableNameInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {@Beanpublic DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() {DynamicTableNameInnerInterceptor interceptor = new DynamicTableNameInnerInterceptor();interceptor.setTableNameHandler((sql, tableName) -> {// 根据业务逻辑动态返回表名return "user_" + LocalDate.now().getYear();});return interceptor;}
}
使用示例

启用插件后,执行 SQL 时会根据配置动态切换表名。


5. 防止全表更新与删除插件

防止全表更新与删除插件用于拦截没有 WHERE 条件的更新和删除操作,避免误操作。

配置防止全表更新与删除插件
import com.baomidou.mybatisplus.extension.plugins.BlockAttackInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {@Beanpublic BlockAttackInnerInterceptor blockAttackInnerInterceptor() {return new BlockAttackInnerInterceptor();}
}
使用示例

启用插件后,执行没有 WHERE 条件的更新或删除操作时会抛出异常。


6. 自定义插件

如果需要自定义插件,可以实现 MyBatis 的 Interceptor 接口。

自定义插件示例
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;import java.sql.Connection;
import java.util.Properties;@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class MyPlugin implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {System.out.println("自定义插件:拦截 SQL 执行");return invocation.proceed();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}
}
配置自定义插件
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {@Beanpublic MyPlugin myPlugin() {return new MyPlugin();}
}

7. 插件配置总结

插件作用
分页插件实现数据库查询的分页功能。
乐观锁插件实现乐观锁机制,防止并发更新冲突。
SQL 性能分析插件监控 SQL 执行时间,帮助优化 SQL 性能。
动态表名插件动态切换表名,适用于分表场景。
防止全表更新与删除插件拦截没有 WHERE 条件的更新和删除操作,避免误操作。
自定义插件自定义拦截器,扩展 MyBatis 功能。

总结

MyBatis-Plus 提供了丰富的插件功能,可以显著增强 MyBatis 的核心功能。通过合理配置和使用这些插件,可以提高开发效率、优化性能并避免误操作。更多插件和高级用法可参考 MyBatis-Plus 官方文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux C语言调用第三方库,第三方库如何编译安装

在 Linux 环境下使用 C 语言调用第三方库时&#xff0c;通常需要先对第三方库进行编译和安装。以下为你详细介绍一般的编译安装步骤&#xff0c;并给出不同类型第三方库&#xff08;如使用 Makefile、CMake 构建系统&#xff09;的具体示例。 一般步骤 1. 获取第三方库源码 …

linux基本命令(1)--linux下的打包命令 -- tar 和gzip

tar 解压 &#xff0c;打包 语法&#xff1a;tar [主选项辅选项] 文件或者目录 使用该命令时&#xff0c;主选项是必须要有的&#xff0c;它告诉tar要做什么事情&#xff0c;辅选项是辅助使用的&#xff0c;可以选用。 主选项&#xff1a; c 创建新的档案文件。如果用户想备…

Python 序列构成的数组(对序列使用+和_)

对序列使用和* Python 程序员会默认序列是支持 和 * 操作的。通常 号两侧的序列由 相同类型的数据所构成&#xff0c;在拼接的过程中&#xff0c;两个被操作的序列都不会被 修改&#xff0c;Python 会新建一个包含同样类型数据的序列来作为拼接的结果。 如果想要把一个序列…

[ C语言 ] | 从0到1?

目录 认识计算机语言 C语言 工欲善其事必先利其器 第一个C语言代码 这一些列 [ C语言 ] &#xff0c;就来分享一下 C语言 相关的知识点~ 认识计算机语言 我们说到计算机语言&#xff0c;语言&#xff0c;就是用来沟通的工具&#xff0c;计算机语言呢&#xff1f;就是我们…

【通道注意力机制】【SENet】Squeeze-and-Excitation Networks

0.论文摘要 卷积神经网络建立在卷积操作的基础上&#xff0c;通过融合局部感受野内的空间和通道信息来提取有意义的特征。为了增强网络的表示能力&#xff0c;最近的一些方法展示了增强空间编码的好处。在本研究中&#xff0c;我们专注于通道关系&#xff0c;并提出了一种新颖…

kubernetes Calico(CNI) NetworkPolicy 流量管理 设置networkpolicy 策略 下集

1、kubernetes 网络策略&#xff08;网络隔离策略&#xff09; Network Policy 是 Kubernetes 中用于控制 Pod 之间网络通信的一种机制。它通过定义规则&#xff0c;限制哪些 Pod 或外部实体可以与目标 Pod 通信&#xff08;基于标签、命名空间、端口等&#xff09;。Network …

sqlmap基础命令总结

​注意事项:仅用于授权测试&#xff0c;避免非法使用。 目录 ​一、基础命令 ​二、数据库信息获取 ​三、绕过 WAF/IDS ​四、文件系统与系统命令 ​五、高级功能与优化 ​六、实战示例 ​一、基础命令 ​检测注入点 sqlmap -u "http://target.com/index.php?id1&…

Unity光线传播体积(LPV)技术实现详解

一、LPV技术概述 光线传播体积(Light Propagation Volumes)是一种实时全局光照技术&#xff0c;通过将场景中的间接光信息存储在3D网格中&#xff0c;实现动态物体的间接光照效果。 核心优势&#xff1a; 实时性能&#xff1a;相比传统光照贴图&#xff0c;支持动态场景 硬件…

SpringBoot (一) 自动配置原理

目录 一 自动配置 1:数据源的手动配置 1:SpringBoot的自动配置 二 自动配置的完整流程&#xff1a;&#xff08;底层&#xff09; 1. 场景化依赖与Starter机制 2. 主程序入口与注解驱动 3. 自动配置类的加载与筛选 4. 自动配置类的实现逻辑 5. 自动配置的触发与执行流…

OJ题:移动零

双指针法 c 语言实现 void moveZeroes(int* nums, int numsSize) {int dest,cur; //创建临时指针和目标指针destcur0;//出初始化while(cur<numsSize)//遍历{if(nums[cur]!0){swap(&nums[cur],&nums[dest]);cur;dest;}else{cur;}}} 思路是建立两个指针&#xff0…

pycharm终端操作远程服务器

pycharm项目已经连接了远程服务器&#xff0c;但是打开终端&#xff0c;却依旧显示的是本地的那个环境&#xff0c;也就是说没有操作远程的那个环境。只能再使用Xshell去操作远程环境&#xff0c;很麻烦&#xff0c;找了下教程。 来源&#xff1a;https://blog.csdn.net/maolim…

(头歌作业—python)3.2 个人所得税计算器(project)

第1关&#xff1a;个人所得税计算器 任务描述 本关任务&#xff1a;编写一个个人所得税计算器的小程序。 相关知识 个人所得税缴纳标准 2018 年 10 月 1 日以前&#xff0c;个税免征额为 3500 元/月&#xff0c;调整后&#xff0c;个税免征额为 5000 元/月&#xff0c; 7 级超…

Redis场景问题1:缓存穿透

Redis 缓存穿透是指在缓存系统&#xff08;如 Redis&#xff09;中&#xff0c;当客户端请求的数据既不在缓存中&#xff0c;也不在数据库中时&#xff0c;每次请求都会直接穿透缓存访问数据库&#xff0c;从而给数据库带来巨大压力&#xff0c;甚至可能导致数据库崩溃。下面为…

CUDA Memory Fence 函数的功能与硬件实现细节

CUDA Memory Fence 函数的功能与硬件实现细节 Memory Fence 的基本功能 CUDA中的memory fence函数用于控制内存操作的可见性顺序&#xff0c;确保在fence之前的内存操作对特定范围内的线程可见。主要功能包括&#xff1a; 排序内存操作&#xff1a;确保fence之前的内存操作在…

实战篇Redis

黑马程序员的Redis的笔记&#xff08;后面补一下图片&#xff09; 【黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…

Reactive编程:什么是Reactive编程?Reactive编程思想

文章目录 **1. Reactive编程概述****1.1 什么是Reactive编程&#xff1f;****1.1.1 Reactive编程的定义****1.1.2 Reactive编程的历史****1.1.3 Reactive编程的应用场景****1.1.4 Reactive编程的优势** **1.2 Reactive编程的核心思想****1.2.1 响应式&#xff08;Reactive&…

异步转同步,实现一个消息队列

有一个场景&#xff0c;需要实现一个消息队列&#xff0c;要求 1&#xff0c;3&#xff0c;4 秒后&#xff0c;依次打印 1&#xff0c;2&#xff0c;3&#xff0c;如下&#xff1a; 其实考察的是怎么用同步的方式实现异步。 本文总结了四种方式实现&#xff1a;常规嵌套、prom…

【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望

【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望 #微服务实战 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事务 #Seata #ServiceMesh #总结 #SpringCloud #SpringBoot 系列终章&#xff1a;经过前九篇 [【深度 Mape 系列】] 的系统学习…

求职笔试题

PDD 最长公共子序列 1143-最长公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:"""二维动态规划"""m, n len(text1), len(text2)# dp [[0]* (n1)] * (m1) 这种写法错误&#xff0c;m1行…

【MySQL基础-16】MySQL DELETE语句:深入理解与应用实践

1. DELETE语句基础&#xff1a;数据删除的艺术 在数据库管理中&#xff0c;DELETE语句是维护数据完整性和清理过期信息的关键工具。与日常生活中的"删除"不同&#xff0c;数据库中的删除操作需要更加谨慎和精确&#xff0c;因为数据一旦删除&#xff0c;恢复可能非常…