# MyBatis-Plus教程 - 5 Service增删改查

在前面讲解了通过让 Mapper 继承 com.baomidou.mybatisplus.core.mapper.BaseMapper 接口,就可以继承很多方法,不用我们编写Mapper 方法。

在 HelloWorld 中也看到,通过 controller 调用 service,通过 service 调用 mapper,service 很多的方法就是调用 mapper 而已,可能没有特别的逻辑,所以 MyBatis-Plus 针对 Service 也提供了基础的功能,我们甚至不用编写 Service 中的方法,直接继承 MyBatis-Plus 提供的父类即可。

# 5.1 Service实现

下面看看如何使用 MyBatis-Plus 提供的 Service ,不用写 Service 方法,就能实现增删改查。

# 1 修改Service

修改 HelloWorld 中的 Service,需要修改 Service 接口和具体的实现类 。

修改 IUserService.java 接口,实现 IService 接口(MyBatis-Plus提供的):

package com.foooor.helloplus.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.foooor.helloplus.pojo.User;

public interface IUserService extends IService<User> {

}
1
2
3
4
5
6
7
8

接口中不需要有接口方法,接口方法是继承自 IService 的。


修改 UserServiceImpl 实现类,继承 ServiceImpl(MyBatis-Plus提供的),添加泛型:

package com.foooor.helloplus.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.foooor.helloplus.service.IUserService;
import com.foooor.helloplus.mapper.UserMapper;
import com.foooor.helloplus.pojo.User;
import org.springframework.stereotype.Service;

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


}
1
2
3
4
5
6
7
8
9
10
11
12
13

实现类中也不需要提供方法,ServiceImpl 中提供了方法。需要添加 Mapper 和实体类的泛型支持。

# 2 修改Controller

因为 Service 中没有方法,调用的是 IService 接口提供的方法,所以得按照 IService 提供的方法来调用。

UserController.java

package com.foooor.helloplus.controller;

import com.foooor.helloplus.pojo.User;
import com.foooor.helloplus.service.IUserService;
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 IUserService userService;

    /**
     * 获取所有用户信息
     */
    @GetMapping("/all")
    public List<User> selectAll() {
        return userService.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

IService 中提供的查询列表的方法是 list(),所以这里调用的是 userService.list()

运行项目,访问 Controller 中的接口,还是可以获取到 User 表的全部数据。


下面看一下通过 IServiceServiceImpl 如何实现数据的增删改查。也就是看看 ServiceImpl 中提供的方法。

为了测试方便,还是在测试类中注入 UserServiceImpl 并调用。当然 UserServiceImpl 中是没有代码的。

# 5.2 插入数据

编写测试类,并编写测试方法。

插入用户数据:

package com.foooor.helloplus;

import com.foooor.helloplus.pojo.User;
import com.foooor.helloplus.service.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;

@Slf4j
@SpringBootTest
public class ServiceTests {

    @Autowired
    private IUserService userService;

    /**
     * 测试插入用户
     */
    @Test
    void testInsertUser() {
        User user = new User();
        user.setUsername("foooor");
        user.setAge(13);
        user.setEmail("foooor@foooor.com");

        Date currentDate = new Date();
        user.setCreateTime(currentDate);
        user.setUpdateTime(currentDate);

        boolean result = userService.save(user);
        log.info("插入用户结果:{}", result);
        log.info("插入用户:{}", user.getId());
    }
}
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
30
31
32
33
34
35
36
37

调用 save() 方法插入数据,返回的结果是 boolean 类型。插入完成,可以获取到数据的主键ID。

和之前的 BaseMapper 中的方法名和返回值不一样而已。

# 5.3 修改数据

修改用户数据:

@Test
void testUpdateUser() {
    Long id = 2L;

    User user = new User();
    user.setId(id);
    user.setUsername("张三");
    user.setAge(12);
    user.setUpdateTime(new Date());

    // 通过ID修改用户信息
    boolean result = userService.updateById(user);
    log.info("修改用户结果:{}", result);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

上面根据 ID 修改用户信息,将要修改的值封装在 User 对象中,只会修改属性不为空的值。

# 5.4 查询数据

查询用户数据:

@Test
void testSelectUserById() {
    Long id = 2L;
    User user = userService.getById(id);
    log.info("查询用户:{}", user);
}
1
2
3
4
5
6

上面根据 ID 查询用户。

# 5.5 删除数据

删除用户数据:

@Test
void testDeleteUser() {
    Long id = 2L;
    boolean result = userService.removeById(id);
    log.info("删除用户结果:{}", result);
}
1
2
3
4
5
6

上面根据 ID 删除用户。


操作都是非常的简单,通过 IServiceServiceImpl 提供的方法,可以简化我们 Service 的开发, Service 中提供了很多的增删改查的方法,可以根据自己的需求进行调用。

如果 ServiceImpl 中提供的方法无法满足你的要求,你可以自己实现 Service 方法,并调用 Mapper 接口提供的功能。