基于 MyBatis-Plus curd
# 基于 MyBatis-Plus curd
# 1. 数据库建表 SQL
-- 用户信息表的建表 SQL
CREATE TABLE user_info (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键 ID', -- 主键 ID,自动递增
name VARCHAR(50) NOT NULL COMMENT '名称', -- 用户名称,不能为空
age INT NOT NULL COMMENT '年龄', -- 用户年龄,不能为空
avatar VARCHAR(255) COMMENT '头像', -- 用户头像,允许为空
address VARCHAR(255) COMMENT '地址' -- 用户地址,允许为空
) COMMENT '用户信息表';
2
3
4
5
6
7
8
# 2. 实体类(User.java)
在 MyBatis-Plus 中,实体类需要通过注解与数据库表字段对应:
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* 用户实体类
*/
@Data
@TableName("user_info") // 指定对应的数据库表名
public class User {
@TableId // 标识主键
private Long id; // 主键 ID
private String name; // 名称
private Integer age; // 年龄
private String avatar; // 头像
private String address; // 地址
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
关键点说明:
@TableName("user_info")
:指定实体类与数据库表user_info
对应。@TableId
:标识主键字段,MyBatis-Plus 会根据这个注解识别主键。
# 3. Mapper 接口(UserMapper.java)
MyBatis-Plus 提供了通用的 BaseMapper
接口,我们可以直接使用它,同时自定义一些复杂查询:
package com.example.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
/**
* 用户 Mapper 接口
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
2
3
4
5
6
7
8
9
10
11
12
关键点说明:
BaseMapper<User>
:继承 MyBatis-Plus 提供的基础 Mapper 接口,自动实现常见的增删改查操作。
# 4. Service 接口(UserService.java)
定义用户服务接口,继承 MyBatis-Plus 的 IService
:
package com.example.demo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;
import java.util.List;
/**
* 用户服务接口
*/
public interface UserService extends IService<User> {
/**
* 分页获取用户列表
*
* @param page 页码
* @param size 每页条数
* @return 用户列表
*/
List<User> getUserList(int page, int size);
/**
* 根据 ID 获取用户信息
*
* @param id 用户 ID
* @return 用户信息
*/
User getUserById(Long id);
/**
* 保存或更新用户信息
*
* @param user 用户信息
*/
void saveUser(User user);
/**
* 根据 ID 删除用户
*
* @param id 用户 ID
*/
void deleteUserById(Long id);
/**
* 批量删除用户
*
* @param ids 用户 ID 列表
*/
void deleteUsersByIds(List<Long> ids);
/**
* 分页搜索用户
*
* @param name 用户名称(搜索关键字)
* @param page 页码
* @param size 每页条数
* @return 分页结果
*/
IPage<User> searchUserByName(String name, int page, int size);
}
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 5. Service 实现类(UserServiceImpl.java)
实现用户服务接口,并使用 userMapper
和 MyBatis-Plus 的分页插件:
package com.example.demo.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 用户服务实现类
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> getUserList(int page, int size) {
// 使用分页插件实现分页查询
Page<User> userPage = new Page<>(page, size);
IPage<User> resultPage = userMapper.selectPage(userPage, new QueryWrapper<>());
return resultPage.getRecords(); // 返回分页数据
}
@Override
public User getUserById(Long id) {
return userMapper.selectById(id);
}
@Override
public void saveUser(User user) {
if (user.getId() == null) {
userMapper.insert(user); // 插入新用户
} else {
userMapper.updateById(user); // 更新已有用户
}
}
@Override
public void deleteUserById(Long id) {
userMapper.deleteById(id);
}
@Override
public void deleteUsersByIds(List<Long> ids) {
userMapper.deleteBatchIds(ids); // 批量删除用户
}
@Override
public IPage<User> searchUserByName(String name, int page, int size) {
// 创建分页对象
Page<User> userPage = new Page<>(page, size);
// 创建查询条件,使用模糊查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", name); // LIKE 查询
// 执行分页查询
return this.page(userPage, queryWrapper);
}
}
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
关键点说明:
- 使用了分页插件
Page<User>
进行分页查询,userMapper.selectPage()
会返回分页结果,包含总记录数、当前页、总页数等信息。 - 依旧使用了
QueryWrapper<User>
实现模糊查询。
# 6. Controller 层(UserController.java)
定义 RESTful 接口,供前端调用:
package com.example.demo.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 用户控制器
*/
@RestController
@RequestMapping("/api/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 获取用户列表(分页)
*
* @param page 页码
* @param size 每页条数
* @return 分页结果
*/
@GetMapping("/data")
public Map<String, Object> getUserList(@RequestParam int page, @RequestParam int size) {
List<User> userList = userService.getUserList(page, size);
int total = userService.count(); // 获取用户总数
Map<String, Object> result = new HashMap<>();
result.put("data", userList);
result.put("total", total);
return result;
}
/**
* 根据 ID 查询用户
*
* @param id 用户 ID
* @return 用户信息
*/
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getUserById(id);
}
/**
* 新增用户
*
* @param user 用户信息
* @return 操作结果
*/
@PostMapping("/add")
public String addUser(@RequestBody User user) {
userService.saveUser(user);
return "新增成功";
}
/**
* 编辑用户信息
*
* @param user 用户信息
* @return 操作结果
*/
@PutMapping("/save/{id}")
public String updateUser(@RequestBody User user, @PathVariable Long id) {
user.setId(id); // 设置 ID 以更新用户
userService.saveUser(user);
return "编辑成功";
}
/**
* 根据 ID 删除用户
*
* @param id 用户 ID
* @return 操作结果
*/
@DeleteMapping("/delete/{id}")
public String deleteUserById(@PathVariable Long id) {
userService.deleteUserById(id);
return "删除成功";
}
/**
* 批量删除用户
*
* @param ids 用户 ID 列表
* @return 操作结果
*/
@PostMapping("/deleteRows")
public String deleteUsersByIds(@RequestBody List<Long> ids) {
userService.deleteUsersByIds(ids);
return "批量删除成功";
}
/**
* 搜索用户并分页返回结果
*
* @param name 用户名称
* @param page 页码
* @param size 每页条数
* @return 搜索结果
*/
@GetMapping("/search")
public Map<String, Object> searchUserByName(@RequestParam String name,
@RequestParam int page,
@RequestParam int size) {
IPage<User> userPage = userService.searchUserByName(name, page, size);
Map<String, Object> result = new HashMap<>();
result.put("data", userPage.getRecords());
result.put("total", userPage.getTotal());
return result;
}
}
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
关键点说明:
- 使用
@RestController
和@RequestMapping
实现 RESTful
风格的接口。
@RequestBody
用于接收 JSON 格式的数据。- 通过
@RequestParam
、@PathVariable
注解获取 URL 参数。
# 7. 项目配置文件(application.yml)
配置数据库连接和 MyBatis-Plus 相关配置:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo_db?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: yourpassword
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
type-aliases-package: com.example.demo.entity
2
3
4
5
6
7
8
9
10
11
12
13
关键点说明:
spring.datasource
: 配置数据库连接信息。mybatis-plus.mapper-locations
: 指定 MyBatis-Plus 的 Mapper XML 文件位置。mybatis-plus.type-aliases-package
: 配置实体类的包路径,以便简化 Mapper XML 中的类型定义。
# 8. 测试数据插入
INSERT INTO user_info (name, age, avatar, address) VALUES ('常涛', 35, NULL, '四川省 内江市');
INSERT INTO user_info (name, age, avatar, address) VALUES ('钱娜', 27, NULL, '山西省 晋中市');
INSERT INTO user_info (name, age, avatar, address) VALUES ('林艳', 24, NULL, '台湾 高雄市');
2
3
结论
通过以上代码示例,我们可以看到 MyBatis-Plus 极大简化了 CRUD 操作,减少了手动编写 SQL 和 XML 的繁琐工作。在企业级应用中,MyBatis-Plus 提供了丰富的封装和便捷的工具,适合处理大部分业务场景。如果你的项目需要高效的开发体验并且涉及大量的数据库操作,MyBatis-Plus 是一个非常好的选择。
# 9. 用户信息管理接口文档
# 1. 获取用户列表(分页)
接口地址: /api/user/data
请求方式: GET
请求参数:
参数名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
page | int | 是 | 页码,从 1 开始 |
size | int | 是 | 每页显示的条数 |
响应参数:
参数名 | 类型 | 说明 |
---|---|---|
data | List<User> | 用户列表数据 |
total | int | 用户总数 |
响应示例:
{
"data": [
{
"id": 1,
"name": "常涛",
"age": 35,
"avatar": null,
"address": "四川省 内江市"
},
{
"id": 2,
"name": "钱娜",
"age": 27,
"avatar": null,
"address": "山西省 晋中市"
},
{
"id": 3,
"name": "林艳",
"age": 24,
"avatar": null,
"address": "台湾 高雄市"
}
],
"total": 3
}
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
# 2. 根据 ID 获取用户详情
接口地址: /api/user/{id}
请求方式: GET
请求参数:
参数名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
id | int | 是 | 用户 ID |
响应参数:
参数名 | 类型 | 说明 |
---|---|---|
id | int | 用户 ID |
name | String | 用户名称 |
age | int | 用户年龄 |
avatar | String | 用户头像 URL |
address | String | 用户地址 |
响应示例:
{
"id": 1,
"name": "常涛",
"age": 35,
"avatar": null,
"address": "四川省 内江市"
}
2
3
4
5
6
7
# 3. 新增用户
接口地址: /api/user/add
请求方式: POST
请求参数:
参数名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 用户名称 |
age | int | 是 | 用户年龄 |
avatar | String | 否 | 用户头像 URL |
address | String | 是 | 用户地址 |
请求示例:
{
"name": "张三",
"age": 28,
"avatar": null,
"address": "北京市 朝阳区"
}
2
3
4
5
6
响应参数:
参数名 | 类型 | 说明 |
---|---|---|
message | String | 操作结果 |
响应示例:
{
"message": "新增成功"
}
2
3
# 4. 编辑用户信息
接口地址: /api/user/save/{id}
请求方式: PUT
请求参数:
参数名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
id | int | 是 | 用户 ID |
name | String | 是 | 用户名称 |
age | int | 是 | 用户年龄 |
avatar | String | 否 | 用户头像 URL |
address | String | 是 | 用户地址 |
请求示例:
{
"name": "李四",
"age": 30,
"avatar": null,
"address": "上海市 浦东新区"
}
2
3
4
5
6
响应参数:
参数名 | 类型 | 说明 |
---|---|---|
message | String | 操作结果 |
响应示例:
{
"message": "编辑成功"
}
2
3
# 5. 根据 ID 删除用户
接口地址: /api/user/delete/{id}
请求方式: DELETE
请求参数:
参数名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
id | int | 是 | 用户 ID |
响应参数:
参数名 | 类型 | 说明 |
---|---|---|
message | String | 操作结果 |
响应示例:
{
"message": "删除成功"
}
2
3
# 6. 批量删除用户
接口地址: /api/user/deleteRows
请求方式: POST
请求参数:
参数名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
ids | List<Integer> | 是 | 用户 ID 列表 |
请求示例:
{
"ids": [1, 2, 3]
}
2
3
响应参数:
参数名 | 类型 | 说明 |
---|---|---|
message | String | 操作结果 |
响应示例:
{
"message": "批量删除成功"
}
2
3
# 7. 搜索用户(带分页与模糊查询)
接口地址: /api/user/search
请求方式: GET
请求参数:
参数名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 搜索关键词(模糊匹配) |
page | int | 是 | 当前页码 |
size | int | 是 | 每页显示的条数 |
响应参数:
参数名 | 类型 | 说明 |
---|---|---|
data | List<User> | 当前页的匹配用户列表 |
total | Long | 符合条件的用户总数 |
响应示例:
{
"data": [
{
"id": 1,
"name": "钱涛",
"age": 35,
"avatar": null,
"address": "四川省 内江市"
},
{
"id": 2,
"name": "钱娜",
"age": 27,
"avatar": null,
"address": "山西省 晋中市"
}
],
"total": 2
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
API 使用说明
- 分页查询: 在请求中通过
page
和size
参数控制分页,返回的数据包含当前页的用户列表和符合条件的用户总数。 - 模糊查询: 使用
name
参数进行模糊匹配,支持部分匹配,如传入name=涛
时,会匹配出包含 “涛” 的用户。 - 该接口支持分页与模糊查询的结合,在大数据量下依然可以高效处理。