mybatis-plus

1 阅读2分钟

CRUD

// DAO User.java
@Data
public class User {
    // 主键
    private Long id;
    // 姓名
    private String name;
    // 年龄
    private Integer age;
    // 邮箱
    private String email;
}

// 继承 mybatis-plus 提供的基础 Mapper 接口,自带 crud 方法
public interface UserMapper extends BaseMapper<User> {}

// 调用crud方法
@SpringBootTest //springboot下测试环境注解
public class SampleTest {
    @Autowired
    private UserMapper userMapper;
    @Test
    public void testSelect() {
        // 等价于 SELECT * FROM user;
        List<User> userList = userMapper.selectList(null);
        userList.forEach(System.out::println);
    }
}
@Autowired
private UserMapper userMapper;

public void insertUser() {
    User user = new User();
    user.setName("张三");
    user.setAge(18);
    user.setEmail("zhangsan@example.com");
    // insert() 会只插入 非 null 字段,等价: INSERT INTO user (name, age, email) VALUES ('张三', 18, 'zhangsan@example.com');
    int result = userMapper.insert(user);

    System.out.println("影响行数:" + result);
    System.out.println("插入后ID:" + user.getId()); // 自动回填
}
// 根据 ID 删除
// 等价于 DELETE FROM user WHERE id = 1L;
userMapper.deleteById(1L);

// 根据条件删除
// 等价于 DELETE FROM user WHERE age = 18;
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("age", 18);
userMapper.delete(wrapper);

// 批量删除
// 等价于 DELETE FROM user WHERE id IN (1L, 2L, 3L);
List<Long> ids = Arrays.asList(1L, 2L, 3L);
userMapper.deleteBatchIds(ids);
User user = new User();
user.setId(1L);
user.setName("李四");
user.setAge(20);

// 等价于 UPDATE user SET name = '李四', age = 20 WHERE id = 1L;
userMapper.updateById(user);
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("name", "张三")
       .set("age", 25);

// 等价于 UPDATE user SET age = 25 WHERE name = '张三';
userMapper.update(null, wrapper);
User user = new User();
user.setEmail("new@example.com");

UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id", 1L);
// 等价于 UPDATE user SET email = 'new@example.com' WHERE id = 1L;
userMapper.update(user, wrapper);
// 根据 ID 查询
// 等价于 SELECT * FROM user WHERE id = 1L;
User user = userMapper.selectById(1L);

// 查询全部
// 等价于 SELECT * FROM user;
List<User> list = userMapper.selectList(null);

// 条件查询
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("age", 18);
// 等价于 SELECT * FROM user WHERE age = 18;
List<User> list = userMapper.selectList(wrapper);

// 查询单条
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "张三");
// 等价于 SELECT * FROM user WHERE name = '张三';
User user = userMapper.selectOne(wrapper);


// 分页查询
Page<User> page = new Page<>(1, 10); // 当前页,页大小
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 18);
Page<User> result = userMapper.selectPage(page, wrapper);

// 等价于 SELECT * FROM user WHERE age > 18 LIMIT 10 OFFSET 0;
System.out.println(result.getRecords()); // 数据
// 等价于 SELECT COUNT(*) FROM user WHERE age > 18;
System.out.println(result.getTotal());   // 总数

整体调用链路:Controller → Service → ServiceImpl → BaseMapper → SQL → DB

  1. GET /user/list 请求进来
  2. Controller 层:接收请求 + 返回响应
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService; // UserService userService = new UserServiceImpl();
    @GetMapping("/list")
    public List<User> list() {
        return userService.list();
    }
}
  1. Service 层
// 接口继承IService接口,IService内部定义好方法:list()、getById()、save()、removeById()
public interface UserService extends IService<User> {

}
  1. ServiceImpl 层,类继承ServiceImpl实现类
// 类继承ServiceImpl实现类,虽然定义了 UserService 接口,但是没有实现任何方法
// implements UserService,让 Spring 能注入,没有它 Spring 找不到实现类
// 继承 ServiceImpl,真正的功能来源,ServiceImpl<M, T> M = Mapper(操作数据库的工具)T = 实体类(操作的数据类型)
// T(实体类)决定你操作的是哪张表,决定返回值类型
// M(Mapper)用哪个 Mapper 操作数据库,调用 this.list(); 实际执行:this.baseMapper.selectList(null); 也就是:userMapper.selectList(null);
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {

}
  1. Mapper 层
public interface UserMapper extends BaseMapper<User> {

}
  1. 数据库(DB) 最终执行 SQL:SELECT * FROM user;