MyBatis-Plus快速入门:八年Java老兵的效率实践指南
作为拥有八年Java开发经验的工程师,我亲历了从原生Mybatis到MyBatis-Plus的演进。本文将带你用最精炼的方式实现从零搭建到完整CRUD分页功能,分享实战中积累的高效实践。
一、环境准备与项目创建(IDEA实操)
1. 创建Spring Boot项目
File → New → Project → Spring Initializr
- 选择JDK 1.8+(推荐JDK 11,LTS版本稳定)
- 依赖选择:
✅ Spring Web
✅ MySQL Driver
✅ Lombok(强烈推荐,减少样板代码)
2. 添加MyBatis-Plus依赖
在pom.xml中删除原生Mybatis依赖,添加:
xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version> <!-- 2023年最新稳定版 -->
</dependency>
经验之谈:MP的boot-starter已包含Mybatis核心包,避免依赖冲突!
二、数据库设计与配置
1. 创建示例表(MySQL)
sql
CREATE TABLE `sys_user` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` VARCHAR(50) NOT NULL COMMENT '姓名',
`age` INT DEFAULT 0 COMMENT '年龄',
`email` VARCHAR(100) COMMENT '邮箱',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. 配置application.yml
yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mp_demo?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
# MP专属配置(重要!)
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志
global-config:
db-config:
id-type: auto # 主键自增策略
logic-delete-field: deleted # 逻辑删除字段(按需添加)
避坑提示:生产环境务必关闭SQL日志!此处仅用于调试
三、领域模型与Mapper开发
1. 实体类编写(使用Lombok)
java
@Data // 自动生成getter/setter
@TableName("sys_user") // 表映射注解
public class User {
@TableId(type = IdType.AUTO) // 主键自增
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT) // 自动填充
private LocalDateTime createTime;
}
2. Mapper接口 (核心步骤!)
java
@Mapper // 需添加注解
public interface UserMapper extends BaseMapper<User> {
// 无需任何方法!已包含基础CRUD
}
八年经验总结:
- 继承
BaseMapper
是MP的核心魔法- 避免在Mapper中写
@Select
等注解(MP动态生成SQL)
四、业务层高效开发
1. Service接口
java
public interface UserService extends IService<User> {
// 可扩展自定义方法
Page<User> getUserPage(Page<User> page);
}
2. Service实现类 (MP的链式调用)
java
@Service
public class UserServiceImpl
extends ServiceImpl<UserMapper, User>
implements UserService {
@Override
public Page<User> getUserPage(Page<User> page) {
return lambdaQuery()
.orderByDesc(User::getCreateTime) // 按创建时间倒序
.page(page);
}
}
高效技巧:
- 优先使用
lambdaQuery()
保证类型安全- 复杂查询可用
QueryWrapper
动态构建
五、控制器与分页实现
1. 分页插件配置 (关键步骤!)
java
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
2. Controller实现完整CRUD
java
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
// 新增
@PostMapping
public boolean saveUser(@RequestBody User user) {
return userService.save(user);
}
// 删除
@DeleteMapping("/{id}")
public boolean removeUser(@PathVariable Long id) {
return userService.removeById(id);
}
// 修改
@PutMapping
public boolean updateUser(@RequestBody User user) {
return userService.updateById(user);
}
// 分页查询
@GetMapping("/page")
public Page<User> pageUsers(
@RequestParam(defaultValue = "1") int current,
@RequestParam(defaultValue = "10") int size) {
Page<User> page = new Page<>(current, size);
return userService.getUserPage(page);
}
}
六、接口测试(Postman示例)
分页请求 :
GET http://localhost:8080/users/page?current=1&size=5
响应结构:
json
{
"records": [
{
"id": 1,
"name": "张三",
"age": 28,
"email": "zhangsan@example.com",
"createTime": "2023-06-15T10:30:00"
}
],
"total": 42, // 总记录数
"size": 5, // 每页大小
"current": 1, // 当前页
"pages": 9 // 总页数
}
七、八年老兵的经验总结
-
性能优化建议:
- 大数据量分页使用
PageOptimizeInterceptor
- 查询指定字段用
select()
避免SELECT *
- 大数据量分页使用
-
最佳实践:
java// 条件构造器正确用法 userService.lambdaQuery() .like(StringUtils.isNotBlank(name), User::getName, name) .gt(age != null, User::getAge, age) .list();
-
进阶功能:
- 逻辑删除 :添加
@TableLogic
注解 - 自动填充 :实现
MetaObjectHandler
- 多租户 :使用
TenantLineInnerInterceptor
- 逻辑删除 :添加
-
避坑指南:
- 避免Service层直接暴露
QueryWrapper
- 实体类字段与数据库命名风格保持一致(可通过
global-config.db-config.column-underline
配置) - 生产环境关闭
mybatis-plus.configuration.log-impl
- 避免Service层直接暴露
最后忠告:MyBatis-Plus虽好,但复杂查询仍建议使用XML映射文件,保持代码可维护性!
通过以上步骤,30分钟内即可完成从项目搭建到分页查询的全流程。MyBatis-Plus的核心价值在于减少样板代码,让开发者更专注于业务逻辑实现。根据项目复杂度灵活选择MP功能,切忌过度设计。