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
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
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
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
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
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
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
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
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
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
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
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
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
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
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