编辑
2024-11-14
实用工具
00
请注意,本文编写于 140 天前,最后修改于 136 天前,其中某些信息可能已经过时。

目录

Service Interface
保存
删除
更新
查询
Mapper Interface
插入
删除
更新
查询
Mapper 层选装件
Chain链式编程
查询
更新
ActiveRecord-实体类
实体类继承
调用 CRUD 方法
SimpleQuery工具类
引入 SimpleQuery 工具类
使用 SimpleQuery 进行查询
功能介绍
keyMap --- 将属性做为key,实体作为值
map --- 将一个属性做为key,另一个属性作为值
group ---按照某个属性分组返回map
list --- 将某个属性封装成list
Db Kit

Service Interface

IService 是 MyBatis-Plus 提供的一个通用 Service 层接口,它封装了常见的 CRUD 操作,包括插入、删除、查询和分页等。通过继承 IService 接口,可以快速实现对数据库的基本操作,同时保持代码的简洁性和可维护性。

IService 接口中的方法命名遵循了一定的规范,如 get 用于查询单行,remove 用于删除,list 用于查询集合,page 用于分页查询,这样可以避免与 Mapper 层的方法混淆。

保存

  • save
  • saveBatch
  • saveOrUpdate
  • saveOrUpdateBatch

删除

  • remove
  • removeById
  • removeByIds
  • removeByMap

更新

  • update
  • updateById
  • updateBatchById

查询

  • get
  • getOne
  • getById
  • getObj
  • list
  • listByIds
  • listByMap
  • listMaps
  • page
  • count

Mapper Interface

BaseMapper 是 Mybatis-Plus 提供的一个通用 Mapper 接口,它封装了一系列常用的数据库操作方法,包括增、删、改、查等。通过继承 BaseMapper,开发者可以快速地对数据库进行操作,而无需编写繁琐的 SQL 语句。

插入

  • insert

删除

  • delete
  • deleteById
  • deleteByMap
  • deleteBatchIds
  • updateById

更新

  • update
  • updateById

查询

  • selectById
  • selectBatchIds
  • selectByMap
  • selectOne
  • selectCount
  • selectList
  • selectMaps
  • selectObjs
  • selectPage
  • selectMapsPage

Mapper 层选装件

选装件是 Mybatis-Plus 提供的一些扩展方法,它们位于 com.baomidou.mybatisplus.extension.injector.methods 包下。这些方法需要配合Sql 注入器使用,以扩展 Mapper 接口的功能。

使用这些选装件前,需要确保已经正确配置了 Sql 注入器。更多使用案例和详细信息,可以参考官方案例和源码注释。

选装件说明 alwaysUpdateSomeColumnById

int alwaysUpdateSomeColumnById(T entity);

源码:alwaysUpdateSomeColumnById

功能:这个方法用于在更新操作时,无论实体对象的某些字段是否有变化,都会强制更新这些字段。这在某些业务场景下非常有用,比如更新时间戳字段,确保每次更新操作都会更新该字段。

使用场景:当你需要在每次更新记录时,都更新某些特定的字段(如更新时间、版本号等),即使这些字段在实体对象中没有变化。

insertBatchSomeColumn

int insertBatchSomeColumn(List<T> entityList);

源码:insertBatchSomeColumn

功能:这个方法用于批量插入实体对象,但只插入实体对象中指定的某些字段。这在需要批量插入数据,但又不希望插入所有字段时非常有用。

使用场景:当你需要批量插入数据,并且希望只插入实体对象中的部分字段,以提高插入效率或保护敏感数据。

logicDeleteByIdWithFill

int logicDeleteByIdWithFill(T entity);

源码:logicDeleteByIdWithFill

功能:这个方法用于逻辑删除记录,并填充实体对象中的某些字段。逻辑删除意味着不是真正从数据库中删除记录,而是通过更新某个字段(如 deleted 字段)来标记记录已被删除。

使用场景:当你需要实现逻辑删除功能,并且希望在删除操作时自动填充实体对象中的某些字段(如删除时间、删除人等)。

使用提示

  • 在使用这些选装件之前,确保你的项目中已经正确配置了 Sql 注入器。
  • 这些方法通常需要在 Mapper 接口中显式声明,以便 Mybatis-Plus 能够识别并生成相应的 SQL 语句。
  • 每个选装件都有其特定的使用场景,根据业务需求选择合适的方法。
  • 在实际使用中,可能需要结合实体对象的注解(如 @TableField、@TableLogic 等)来实现更复杂的功能。

通过使用这些选装件,可以进一步扩展 Mybatis-Plus 的功能,满足更多样化的业务需求。

Chain链式编程

Chain 是 Mybatis-Plus 提供的一种链式编程风格,它允许开发者以更加简洁和直观的方式编写数据库操作代码。Chain 分为 query 和 update 两大类,分别用于查询和更新操作。每类又分为普通链式和 lambda 链式两种风格,其中 lambda 链式提供了类型安全的查询条件构造,但不支持 Kotlin。

查询

java
demoService.query().eq("name", "John").list(); demoService.lambdaQuery().eq(User::getAge, 30).one();

更新

java
// 普通链式更新示例 demoService.update().set("status", "inactive").eq("name", "John").update(); // 将 name 为 "John" 的记录 status 更新为 "inactive" // lambda 链式更新示例 User updateUser = new User(); updateUser.setEmail("new.email@example.com"); demoService.lambdaUpdate().set(User::getEmail, updateUser.getEmail()).eq(User::getId, 1).update(); // 更新 ID 为 1 的用户的邮箱

ActiveRecord-实体类

ActiveRecord 模式是一种设计模式,它允许实体类直接与数据库进行交互,实体类既是领域模型又是数据访问对象。在 Mybatis-Plus 中,实体类只需继承 Model 类即可获得强大的 CRUD 操作能力。

使用 ActiveRecord 模式前,需要确保项目中已注入对应实体的 BaseMapper。

实体类继承

java
import com.baomidou.mybatisplus.extension.activerecord.Model; public class User extends Model<User> { // 实体类的字段定义... private Long id; private String name; private Integer age; // ... 其他字段和 getter/setter 方法 }

调用 CRUD 方法

java
// 创建新用户并插入数据库 User user = new User(); user.setName("John Doe"); user.setAge(30); boolean isInserted = user.insert(); // 返回值表示操作是否成功 // 查询所有用户 List<User> allUsers = user.selectAll(); // 根据 ID 更新用户信息 user.setId(1L); user.setName("Updated Name"); boolean isUpdated = user.updateById(); // 返回值表示操作是否成功 // 根据 ID 删除用户 boolean isDeleted = user.deleteById(); // 返回值表示操作是否成功

SimpleQuery工具类

SimpleQuery 是 Mybatis-Plus 提供的一个工具类,它对 selectList 查询后的结果进行了封装,使其可以通过 Stream 流的方式进行处理,从而简化了 API 的调用。

SimpleQuery 的一个特点是它的 peeks 参数,这是一个可变参数,类型为 Consumer...,意味着你可以连续添加多个操作,这些操作会在查询结果被处理时依次执行。

使用 ActiveRecord 模式前,需要确保项目中已注入对应实体的 BaseMapper。

引入 SimpleQuery 工具类

java
import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda; import com.baomidou.mybatisplus.core.toolkit.support.SimpleQuery;

使用 SimpleQuery 进行查询

java
// 假设有一个 User 实体类和对应的 BaseMapper List<Long> ids = SimpleQuery.list( Wrappers.lambdaQuery(User.class), // 使用 lambda 查询构建器 User::getId, // 提取的字段,这里是 User 的 id System.out::println, // 第一个 peek 操作,打印每个用户 user -> userNames.add(user.getName()) // 第二个 peek 操作,将每个用户的名字添加到 userNames 列表中 );

使用提示

  • SimpleQuery 工具类提供了一种简洁的方式来处理查询结果,它允许你在查询结果上应用多个操作,这些操作会按照添加的顺序依次执行。
  • 在使用 SimpleQuery 时,你需要提供一个查询构建器(如 Wrappers.lambdaQuery()),一个用于提取结果的字段(如 User::getId),以及一个或多个 Consumer 类型的 peek 操作。
  • peek 操作可以用于执行任何副作用操作,如打印日志、更新缓存、发送通知等,而不会影响查询结果本身。
  • SimpleQuery 返回的结果是一个列表,包含了所有查询到的实体对象,这些对象已经应用了所有的 peek 操作。
  • 通过使用 SimpleQuery,你可以将查询和结果处理逻辑分离,使代码更加清晰和易于维护。

通过使用 SimpleQuery 工具类,开发者可以更加高效地处理查询结果,同时保持代码的简洁性和可读性。这种工具类尤其适合于需要对查询结果进行复杂处理的场景。

功能介绍

keyMap --- 将属性做为key,实体作为值

SimpleQuery 的 keyMap 方法提供了一种便捷的方式来查询数据库,并将查询结果封装成一个 Map,其中实体的某个属性作为键(key),实体本身作为值(value)。这个方法还支持在处理查询结果时执行额外的副作用操作,如打印日志或更新缓存。

java
// 假设有一个 User 实体类和对应的 BaseMapper LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getStatus, "active"); // 查询状态为 "active" 的用户 // 使用 keyMap 方法查询并封装结果 Map<String, User> userMap = SimpleQuery.keyMap( queryWrapper, // 查询条件构造器 User::getUsername, // 使用用户名作为键 user -> System.out.println("Processing user: " + user.getUsername()) // 打印处理的用户名 ); // 遍历结果 for (Map.Entry<String, User> entry : userMap.entrySet()) { System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); }

map --- 将一个属性做为key,另一个属性作为值

SimpleQuery 的 map 方法提供了一种便捷的方式来查询数据库,并将查询结果封装成一个 Map,其中实体的某个属性作为键(key),另一个属性作为值(value)。这个方法还支持在处理查询结果时执行额外的副作用操作,如打印日志或更新缓存。

java
// 假设有一个 User 实体类和对应的 BaseMapper LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getStatus, "active"); // 查询状态为 "active" 的用户 // 使用 map 方法查询并封装结果 Map<String, Integer> userMap = SimpleQuery.map( queryWrapper, // 查询条件构造器 User::getUsername, // 使用用户名作为键 User::getAge, // 使用年龄作为值 user -> System.out.println("Processing user: " + user.getUsername()) // 打印处理的用户名 ); // 遍历结果 for (Map.Entry<String, Integer> entry : userMap.entrySet()) { System.out.println("Username: " + entry.getKey() + ", Age: " + entry.getValue()); }

group ---按照某个属性分组返回map

SimpleQuery 的 group 方法提供了一种便捷的方式来查询数据库,并将查询结果按照实体的某个属性进行分组,封装成一个 Map。这个方法还支持在处理查询结果时执行额外的副作用操作,如打印日志或更新缓存。此外,它还允许你使用 Collector 对分组后的集合进行进一步的处理。

java
// 假设有一个 User 实体类和对应的 BaseMapper LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getStatus, "active"); // 查询状态为 "active" 的用户 // 使用 group 方法查询并封装结果,按照用户名分组 Map<String, List<User>> userGroup = SimpleQuery.group( queryWrapper, // 查询条件构造器 User::getUsername, // 使用用户名作为分组键 user -> System.out.println("Processing user: " + user.getUsername()) // 打印处理的用户名 ); // 遍历结果 for (Map.Entry<String, List<User>> entry : userGroup.entrySet()) { System.out.println("Username: " + entry.getKey()); for (User user : entry.getValue()) { System.out.println(" - User: " + user); } }

list --- 将某个属性封装成list

SimpleQuery 的 list 方法提供了一种便捷的方式来查询数据库,并将查询结果封装成一个 List,其中列表的元素是实体的某个属性。这个方法还支持在处理查询结果时执行额外的副作用操作,如打印日志或更新缓存。

java
// 假设有一个 User 实体类和对应的 BaseMapper LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getStatus, "active"); // 查询状态为 "active" 的用户 // 使用 list 方法查询并封装结果,提取所有用户的用户名 List<String> userNames = SimpleQuery.list( queryWrapper, // 查询条件构造器 User::getUsername, // 提取用户名作为列表元素 user -> System.out.println("Processing user: " + user.getUsername()) // 打印处理的用户名 ); // 遍历结果 for (String username : userNames) { System.out.println("Username: " + username); }

Db Kit

Db Kit 是 Mybatis-Plus 提供的一个工具类,它允许开发者通过静态调用的方式执行 CRUD 操作,从而避免了在 Spring 环境下可能出现的 Service 循环注入问题,简化了代码,提升了开发效率。

注意

使用 Db Kit 前,需要确保项目中已注入对应实体的 BaseMapper。 当参数为 Wrapper 时,需要在 Wrapper 中传入 Entity 或者 EntityClass,以便寻找对应的 Mapper。 不建议在循环中频繁调用 Db Kit 的方法,如果是批量操作,建议先将数据构造好,然后使用 Db.saveBatch(数据) 等批量方法进行保存。

java
// 假设有一个 User 实体类和对应的 BaseMapper // 根据 id 查询单个实体 User user = Db.getById(1L, User.class); // 根据 id 查询多个实体 List<User> userList = Db.listByIds(Arrays.asList(1L, 2L, 3L), User.class); // 根据条件构造器查询 LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(User.class) .eq(User::getStatus, "active"); List<User> activeUsers = Db.list(queryWrapper); // 插入新实体 User newUser = new User(); newUser.setUsername("newUser"); newUser.setAge(25); boolean isInserted = Db.insert(newUser); // 根据 id 更新实体 User updateUser = new User(); updateUser.setId(1L); updateUser.setUsername("updatedUser"); boolean isUpdated = Db.updateById(updateUser); // 根据条件构造器更新 LambdaUpdateWrapper<User> updateWrapper = Wrappers.lambdaUpdate(User.class) .set(User::getAge, 30) .eq(User::getUsername, "updatedUser"); boolean isUpdatedByWrapper = Db.update(null, updateWrapper); // 根据 id 删除实体 boolean isDeleted = Db.removeById(1L); // 根据条件构造器删除 LambdaDeleteWrapper<User> deleteWrapper = Wrappers.lambdaDelete(User.class) .eq(User::getStatus, "inactive"); boolean isDeletedByWrapper = Db.remove(deleteWrapper); // 批量插入 List<User> batchUsers = Arrays.asList( new User("user1", 20), new User("user2", 22), new User("user3", 24) ); boolean isBatchInserted = Db.saveBatch(batchUsers); // 批量更新 List<User> batchUpdateUsers = Arrays.asList( new User(1L, "user1", 21), new User(2L, "user2", 23), new User(3L, "user3", 25) ); boolean isBatchUpdated = Db.updateBatchById(batchUpdateUsers);

使用提示

  • Db Kit 提供了一系列静态方法,可以直接调用进行数据库操作,无需通过 Service 层,简化了代码结构。
  • 在使用 Db Kit 时,确保传入的参数正确,特别是当使用 Wrapper 时,需要指定实体类或实体对象。
  • 对于批量操作,如批量插入或更新,建议使用 Db Kit 提供的批量方法,以提高效率。
  • 避免在循环中频繁调用 Db Kit 的方法,这可能会导致性能问题。 通过使用 Db Kit,开发者可以更加高效地执行数据库操作,同时保持代码的简洁性和可读性。这种工具类尤其适合于简单的 CRUD 操作,可以大大减少重复代码的编写。

本文作者:Weee

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!