程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • mybatis-plus

    • mybatis-plus概述
    • MyBatis-Plus入门案例
    • BaseMapper 增删改查
    • Service层 增删改查
      • 1. IService<T> 的核心特点
      • 2. IService<T> 中提供的 CRUD 方法
        • 2.1 增加:Save、SaveOrUpdate
        • 2.2 删除:Remove
        • 2.3 修改:Update
        • 2.4 查询:Get、List、Count
        • 2.5 分页:Page
      • 3. 通过 IService<T> 接口和 ServiceImpl<T> 实现类操作数据库
        • 3.1 定义实体类
        • 3.2 定义 Service 接口并继承 IService<T>
        • 3.3 实现 Service 接口并继承 ServiceImpl<T>
        • 3.4 在 Service 层调用 IService<T> 提供的方法
        • 3.5 调用示例
      • 4. 调用 Service 层实现 CRUD 操作
        • 4.1 插入操作
        • 4.2 删除操作
        • 4.3 修改操作
        • 4.4 查询操作
      • 5. 通用 Service 层操作总结
    • MyBatis-Plus常用注解
    • MyBatis-Plus条件构造器
    • MyBatis-Plus查询条件
    • MyBatis-Plus常用插件
    • 通用枚举和多数据源
    • MyBatisX 插件
  • MyBatis-plus
  • mybatis-plus
scholar
2024-08-25
目录

Service层 增删改查

# Service 层增删改查

前言

在 MyBatis-Plus 中,IService<T> 接口和它的实现类 ServiceImpl<T> 封装了常见的业务层 CRUD 操作。通过继承 IService<T>,开发者可以在 Service 层中快速使用内置的 CRUD 方法,同时可以扩展自定义的方法。

# 1. IService<T> 的核心特点

  • 进一步封装 CRUD:相较于 BaseMapper<T>,IService<T> 提供了更易用的接口,采用 get(查询单行)、remove(删除)、list(查询集合)、page(分页)等前缀命名,区分 Mapper 层操作。
  • 灵活扩展:可以根据项目需要扩展自定义的通用 Service 方法,建议通过创建自己的 IBaseService 接口继承 IService<T>,以实现自定义逻辑。
  • 条件构造器:支持通过 Wrapper<T> 条件构造器进行复杂查询、更新、删除等操作。

# 2. IService<T> 中提供的 CRUD 方法

# 2.1 增加:Save、SaveOrUpdate

// 插入一条记录(选择字段,策略插入)
boolean save(T entity);

// 批量插入
boolean saveBatch(Collection<T> entityList);

// 批量插入(指定批次大小)
boolean saveBatch(Collection<T> entityList, int batchSize);

// 更新或插入(根据是否存在 TableId 注解)
boolean saveOrUpdate(T entity);

// 根据条件更新或插入
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);

// 批量更新或插入
boolean saveOrUpdateBatch(Collection<T> entityList);

// 批量更新或插入(指定批次大小)
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • 功能:提供单条记录插入、批量插入、条件插入或更新等多种保存操作。
  • 参数:
    • T entity - 要保存或更新的实体对象。
    • Collection<T> entityList - 批量操作时的实体列表。
    • int batchSize - 批量操作时的批次大小。
    • Wrapper<T> updateWrapper - 条件构造器,用于指定更新条件。
  • 返回值:返回操作结果,true 表示成功,false 表示失败。

# 2.2 删除:Remove

// 根据条件删除
boolean remove(Wrapper<T> queryWrapper);

// 根据 ID 删除
boolean removeById(Serializable id);

// 根据条件 Map 删除
boolean removeByMap(Map<String, Object> columnMap);

// 批量删除(根据 ID 列表)
boolean removeByIds(Collection<? extends Serializable> idList);
1
2
3
4
5
6
7
8
9
10
11
  • 功能:支持根据条件、ID、Map、批量删除等多种删除操作。
  • 参数:
    • Wrapper<T> queryWrapper - 条件构造器,用于指定删除条件。
    • Serializable id - 需要删除的记录的 ID。
    • Map<String, Object> columnMap - 条件 Map,键为列名,值为条件值。
    • Collection<? extends Serializable> idList - 批量删除时的 ID 列表。
  • 返回值:返回操作结果,true 表示成功,false 表示失败。

# 2.3 修改:Update

// 根据条件更新
boolean update(Wrapper<T> updateWrapper);

// 根据条件更新指定实体
boolean update(T updateEntity, Wrapper<T> whereWrapper);

// 根据 ID 更新
boolean updateById(T entity);

// 批量更新
boolean updateBatchById(Collection<T> entityList);

// 批量更新(指定批次大小)
boolean updateBatchById(Collection<T> entityList, int batchSize);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • 功能:支持单条记录、批量、条件更新等操作。
  • 参数:
    • T updateEntity - 要更新的实体对象。
    • Wrapper<T> updateWrapper - 条件构造器,用于指定更新条件。
    • Collection<T> entityList - 批量操作时的实体列表。
    • int batchSize - 批量操作时的批次大小。
  • 返回值:返回操作结果,true 表示成功,false 表示失败。

# 2.4 查询:Get、List、Count

// 根据 ID 查询
T getById(Serializable id);

// 根据条件查询单条记录
T getOne(Wrapper<T> queryWrapper);

// 查询所有记录
List<T> list();

// 根据条件查询记录列表
List<T> list(Wrapper<T> queryWrapper);

// 批量查询(根据 ID 列表)
Collection<T> listByIds(Collection<? extends Serializable> idList);

// 根据条件 Map 查询
Collection<T> listByMap(Map<String, Object> columnMap);

// 查询总记录数
int count();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • 功能:支持单条记录查询、批量查询、条件查询等多种查询操作。
  • 参数:
    • Serializable id - 查询的记录 ID。
    • Wrapper<T> queryWrapper - 条件构造器,用于指定查询条件。
    • Collection<? extends Serializable> idList - 批量查询时的 ID 列表。
    • Map<String, Object> columnMap - 条件 Map,键为列名,值为条件值。
  • 返回值:返回查询的实体对象或列表,或者返回查询的记录数。

# 2.5 分页:Page

// 分页查询
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);

// 根据条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);
1
2
3
4
5
  • 功能:支持分页查询,返回分页后的数据。
  • 参数:
    • IPage<T> page - 分页参数,指定页码和每页大小。
    • Wrapper<T> queryWrapper - 条件构造器,用于指定查询条件。
  • 返回值:返回分页结果,包含数据列表和分页信息。

# 3. 通过 IService<T> 接口和 ServiceImpl<T> 实现类操作数据库

# 3.1 定义实体类

首先需要定义一个与数据库表对应的实体类。通常,我们会使用 MyBatis-Plus 提供的注解来与数据库表进行映射:

@Data  // Lombok 注解,自动生成 getter/setter 方法
@TableName("user")  // 与数据库表 "user" 进行映射
public class User {
    private Long id;  // 主键 ID
    private String name;  // 用户名
    private Integer age;  // 年龄
    private String email;  // 邮箱
}
1
2
3
4
5
6
7
8

说明:

  • @TableName 注解用于指定实体类与数据库表的映射关系。
  • @Data 注解是 Lombok 提供的,自动生成常见的 getter/setter 等方法,简化代码编写。

# 3.2 定义 Service 接口并继承 IService<T>

定义一个继承 IService<T> 的业务接口,通常用于定义业务逻辑:

public interface UserService extends IService<User> {
    // 可以在这里自定义一些业务方法
}
1
2
3

说明:

  • UserService 继承了 IService<User>,因此拥有 MyBatis-Plus 提供的通用 CRUD 功能。
  • 可以在这里定义其他业务方法,例如复杂的业务逻辑。

# 3.3 实现 Service 接口并继承 ServiceImpl<T>

创建一个实现类,继承 ServiceImpl<UserMapper, User>,实现自定义的 Service 接口:

@Service  // 标识这是一个服务层组件
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 你可以在这里覆盖父类的方法或添加自定义的业务逻辑
}
1
2
3
4

说明:

  • UserServiceImpl 继承了 ServiceImpl<UserMapper, User>,并实现了 UserService 接口,因此拥有了 MyBatis-Plus 提供的通用 CRUD 方法。
  • 如果需要自定义业务逻辑,可以在这里扩展方法。

# 3.4 在 Service 层调用 IService<T> 提供的方法

在 Service 实现类中,你可以直接使用 IService<T> 中封装的 CRUD 方法:

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

    /**
     * 保存用户信息
     * @param user 要保存的用户对象
     * @return 保存结果,true 表示成功
     */
    public boolean saveUser(User user) {
        return this.save(user);  // 使用 IService 提供的 save 方法保存数据
    }

    /**
     * 根据 ID 查询用户
     * @param id 用户 ID
     * @return 查询到的用户对象
     */
    public User getUserById(Long id) {
        return this.getById(id);  // 使用 IService 提供的 getById 方法查询数据
    }

    /**
     * 查询所有用户
     * @return 用户列表
     */
    public List<User> getAllUsers() {
        return this.list();  // 使用 IService 提供的 list 方法查询所有数据
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

说明:

  • save 是 IService<T> 提供的保存方法。
  • getById 是 IService<T> 提供的根据 ID 查询方法。
  • list 是 IService<T> 提供的查询所有数据的方法。

# 3.5 调用示例

在 Controller 或其他地方调用 Service 层的方法来实现业务逻辑:

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUserById(id);  // 调用 Service 层的查询方法
    }
}
1
2
3
4
5
6
7
8
9
10
11

两种方式的区别与选择

  • BaseMapper<T>:

    • 适合直接操作数据库的场景,提供基础的 CRUD 方法。
    • 更适合在数据访问层(DAO)中使用,粒度较细。
    • 如果需要自定义复杂的 SQL 查询,可以直接使用 BaseMapper<T>。
  • IService<T> 和 ServiceImpl<T>:

    • 适合在业务逻辑层使用,提供更高层次的封装。
    • 提供了更丰富的功能(如批量操作、分页查询等),更加便于业务逻辑的实现。
    • 适合在业务层中通过继承 IService<T> 实现常见的业务操作。

# 4. 调用 Service 层实现 CRUD 操作

在实际开发中,通过继承 IService<T>,可以在 Service 层中直接使用 MyBatis-Plus 提供的 CRUD 方法。

# 4.1 插入操作

/**
 * 测试批量插入数据
 * @return 插入操作结果,通常返回 true 表示成功
 */
@Test
public void testSaveBatch(){
    List<User> list = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
        User user = new User();
        user.setName("Vz" + i);
        user.setAge(20 + i);
        list.add(user);
    }
    boolean result = userService.saveBatch(list); // 批量插入
    System.out.println(result ? "添加成功!" : "添加失败!");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

重要 API 说明:

  • boolean saveBatch(Collection<T> entityList):批量插入数据。
    • 参数: Collection<T> entityList - 要插入的实体列表。
    • 返回值: 返回 true 表示插入成功。

# 4.2 删除操作

/**
 * 测试根据条件删除数据
 * @return 删除操作结果,通常返回 true 表示成功
 */
@Test
public void testRemoveByMap(){
    Map<String, Object> map = new HashMap<>();
    map.put("age", 22); // 示例:删除 age = 22 的记录
    boolean result = userService.removeByMap(map); // 根据 Map 条件删除
    System.out.println(result ? "删除成功!" : "删除失败!");
}
1
2
3
4
5
6
7
8
9
10
11

重要 API 说明:

  • boolean removeByMap(Map<String, Object> columnMap):根据条件 Map 删除记录。
    • 参数: Map<String, Object> columnMap - 条件 Map,键为列名,值为条件值。
    • 返回值: 返回 true 表示删除成功。

# 4.3 修改操作

/**
 * 测试根据 ID 修改数据
 * @return 修改操作结果,通常返回 true 表示成功
 */
@Test
public void testUpdateById(){
    User user = new User();
    user.setId(1L); // 设置要更新的记录 ID
    user.setName("Updated Name");
    boolean result = userService.updateById(user); // 根据 ID 更新
    System.out.println(result ? "修改成功!" : "修改失败!");
}
1
2
3
4
5
6
7
8
9
10
11
12

重要 API 说明:

  • boolean updateById(T entity):根据 ID 更新记录。
    • 参数: T entity - 要更新的实体对象,必须包含 ID。
    • 返回值: 返回 true 表示更新成功。

# 4.4 查询操作

/**
 * 测试根据 ID 查询数据
 * @return 查询结果,返回单个实体对象
 */
@Test
public void testGetById(){


    User user = userService.getById(1L); // 根据 ID 查询
    System.out.println(user);
}
1
2
3
4
5
6
7
8
9
10
11

重要 API 说明:

  • T getById(Serializable id):根据 ID 查询单条记录。
    • 参数: Serializable id - 查询的记录 ID。
    • 返回值: 返回查询到的实体对象。

# 5. 通用 Service 层操作总结

通过继承 MyBatis-Plus 提供的 IService<T> 接口,开发者可以在 Service 层中方便地使用内置的 CRUD 方法,同时可以在 ServiceImpl 实现类中扩展自定义的业务逻辑。

  • 插入操作: 使用 save 系列方法进行单条或批量插入操作。
  • 删除操作: 使用 remove 系列方法进行条件删除、批量删除等操作。
  • 更新操作: 使用 update 系列方法进行条件更新、批量更新等操作。
  • 查询操作: 使用 get、list 系列方法进行单条查询、条件查询、批量查询等操作。
  • 分页操作: 使用 page 系列方法进行分页查询。
编辑此页 (opens new window)
上次更新: 2025/01/05, 02:09:04
BaseMapper 增删改查
MyBatis-Plus常用注解

← BaseMapper 增删改查 MyBatis-Plus常用注解→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式