文章目录
-
- 对比Mapper接口CRUD区别:
- 使用Iservice接口方式
- 举例详解
- 第1:创建数据库表(准备数据载体)
- 第2:编写实体类User(映射数据库表)
- 第3:编写Mapper接口UserMapper(数据访问层)
- 第4:编写Service接口UserService(业务层接口)
- 第5:编写Service实现类UserServiceImpl
- 第6:编写Controller(接口测试层)
- 第7:启动项目并测试
-
- [7.1 启动项目](#7.1 启动项目)
- [9.2 接口测试(用Postman/浏览器/IDEA自带工具)](#9.2 接口测试(用Postman/浏览器/IDEA自带工具))
- 扩展:添加自定义业务方法(可选)
-
- [1. 在UserService接口中添加方法](#1. 在UserService接口中添加方法)
- [2. 在UserServiceImpl中实现方法](#2. 在UserServiceImpl中实现方法)
- [3. 在UserController中添加测试接口](#3. 在UserController中添加测试接口)
通用 Service CRUD 封装 IService (opens new window) 接口,进一步封装 CRUD,
采用 get 查询单行、 remove 删除、 list 查询集合、 page 分页 前缀命名方式,区分 Mapper 层避免混淆
对比Mapper接口CRUD区别:
- service添加了批量方法
- service层的方法自动添加事务
使用Iservice接口方式
接口继承IService接口
java
public interface UserService extends IService<User> {
}
类继承ServiceImpl实现类
java
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService{
}
举例详解
总结
-
核心流程 :Spring Boot + MyBatis-Plus的Service层开发,
核心是「
接口继承 IService+实现类继承 ServiceImpl」,复用MP封装的通用CRUD方法,无需手写基础SQL。
-
关键注解 :
@Service(标记 Service Bean)、
@Mapper(标记 Mapper接口)、
@TableName/@TableId(实体类 映射 数据库)。 -
核心类关系 :
UserServiceImpl→ 继承ServiceImpl<UserMapper, User>→ 关联Mapper和实体类 → 实现UserService→ 提供通用+自定义业务方法。
第1:创建数据库表(准备数据载体)
sql
-- 创建user表
CREATE TABLE IF NOT EXISTS `user` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`username` VARCHAR(50) NOT NULL COMMENT '用户名',
`password` VARCHAR(50) NOT NULL COMMENT '密码',
`nickname` VARCHAR(50) COMMENT '昵称',
`age` INT(3) COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 插入测试数据
INSERT INTO `user` (`username`, `password`, `nickname`, `age`) VALUES
('zhangsan', '123456', '张三', 20),
('lisi', '654321', '李四', 22);
第2:编写实体类User(映射数据库表)
在src/main/java/com/example/mpdemo下新建entity包,创建User.java:
java
package com.example.mpdemo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
" 用户实体类:和数据库user表一一映射 "
@Data
@TableName("user") // "指定映射的数据库表名(类名和表名一致时可省略)"
public class User {
// 主键ID,设置为自增(和数据库表的AUTO_INCREMENT对应)
@TableId(type = IdType.AUTO)
private Long id;
private String username; // 对应表的 username 字段
private String password; // 对应表的 password 字段
private String nickname; // 对应表的 nickname 字段
private Integer age; // 对应表的 age 字段
}
第3:编写Mapper接口UserMapper(数据访问层)
在src/main/java/com/example/mpdemo下新建mapper包,创建UserMapper.java:
java
package com.example.mpdemo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mpdemo.entity.User;
import org.apache.ibatis.annotations.Mapper;
" Mapper接口:继承MyBatis-Plus的BaseMapper,获得通用CRUD方法 "
" @Mapper:告诉MyBatis这是Mapper接口,Spring会扫描并创建代理对象 "
@Mapper
public interface UserMapper extends BaseMapper<User> {
"基础CRUD不用写,MyBatis-Plus已经封装好了"
"如需自定义SQL,比如:"根据昵称查用户",可以在这里加方法,后续写XML 或 注解"
}
第4:编写Service接口UserService(业务层接口)
在src/main/java/com/example/mpdemo下新建service包,创建UserService.java:
java
package com.example.mpdemo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.mpdemo.entity.User;
" 业务层接口:继承MyBatis-Plus的IService,获得Service层的通用CRUD方法 "
public interface UserService extends IService<User> {
" 这里可以加自定义业务方法(比如:"根据用户名查用户"),先空着,后续扩展 "
}
第5:编写Service实现类UserServiceImpl
在service包下新建impl子包,创建UserServiceImpl.java:
java
package com.example.mpdemo.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.mpdemo.entity.User;
import com.example.mpdemo.mapper.UserMapper;
import com.example.mpdemo.service.UserService;
import org.springframework.stereotype.Service;
/**
* 业务层实现类:
* 1. 继承ServiceImpl(MyBatis-Plus的IService实现类),指定Mapper和实体类
* 2. 实现自定义的UserService接口
* 3. @Service:让Spring管理这个Bean,后续可以注入使用
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
"基础CRUD方法不用写,ServiceImpl已经实现了"
}
第6:编写Controller(接口测试层)
在src/main/java/com/example/mpdemo下新建controller包,创建UserController.java:
java
package com.example.mpdemo.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.mpdemo.entity.User;
import com.example.mpdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
" 控制层:提供HTTP接口,调用Service层方法实现CRUD "
@RestController
@RequestMapping("/user")
public class UserController {
// 注入UserService(Spring会自动找UserServiceImpl实现类)
@Autowired
private UserService userService;
// ========== 测试1:查询所有用户 ==========
"调用IService的通用方法 list(),查询所有用户"
@GetMapping("/list")
public List<User> listAll() {
return userService.list();
}
// ========== 测试2:根据ID查询单个用户 ==========
"调用IService的通用方法 getById(),根据ID查询"
@GetMapping("/{id}")
public User getById(@PathVariable Long id) {
return userService.getById(id);
}
// ========== 测试3:新增用户 ==========
" 调用IService的通用方法 save(),新增用户 "
@PostMapping("/save")
public boolean saveUser(@RequestBody User user) {
return userService.save(user);
}
// ========== 测试4:分页查询用户 ==========
@GetMapping("/page")
public IPage<User> pageUser(
@RequestParam(defaultValue = "1") Integer pageNum, // 页码,默认第1页
@RequestParam(defaultValue = "2") Integer pageSize // 每页条数,默认2条
) {
// 创建分页对象
Page<User> page = new Page<>(pageNum, pageSize);
// 调用IService的通用方法page(),分页查询
return userService.page(page);
}
// ========== 测试5:删除用户 ==========
" 调用IService的通用方法 removeById(),根据ID删除 "
@DeleteMapping("/{id}")
public boolean deleteUser(@PathVariable Long id) {
return userService.removeById(id);
}
}
第7:启动项目并测试
7.1 启动项目
打开项目的启动类MpDemoApplication.java(默认在com.example.mpdemo下),直接运行main方法:
java
package com.example.mpdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // 核心注解,开启Spring Boot自动配置
public class MpDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MpDemoApplication.class, args);
}
}
启动成功后,控制台会显示「Started MpDemoApplication in xxx seconds」。
9.2 接口测试(用Postman/浏览器/IDEA自带工具)
| 接口地址 | 请求方式 | 测试说明 | 示例结果(简要) |
|---|---|---|---|
| http://localhost:8080/user/list | GET | 查询所有用户 | 返回2条测试数据(张三、李四) |
| http://localhost:8080/user/1 | GET | 查询ID=1的用户 | 返回张三的信息 |
| http://localhost:8080/user/save | POST | 新增用户(JSON参数) | 传入{"username":"wangwu","password":"111111","nickname":"王五","age":25},返回true |
| http://localhost:8080/user/page?pageNum=1\&pageSize=2 | GET | 分页查询 | 返回第1页、每页2条的用户列表 |
| http://localhost:8080/user/3 | DELETE | 删除ID=3的用户(新增的王五) | 返回true |
扩展:添加自定义业务方法(可选)
如果通用方法不够用,比如:要「根据用户名查询用户」,我们来扩展:
1. 在UserService接口中添加方法
java
public interface UserService extends IService<User> {
" 自定义方法:根据用户名查询用户 "
User getByUsername(String username);
}
2. 在UserServiceImpl中实现方法
java
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public User getByUsername(String username) {
// 用QueryWrapper构造查询条件
return this.getOne(new QueryWrapper<User>().eq("username", username));
}
}
3. 在UserController中添加测试接口
java
@GetMapping("/username/{username}")
public User getByUsername(@PathVariable String username) {
return userService.getByUsername(username);
}
测试:访问http://localhost:8080/user/username/zhangsan,会返回张三的信息。