MyBatis-Plus快速入门:八年Java老兵的效率实践指南

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      // 总页数
}

七、八年老兵的经验总结

  1. 性能优化建议

    • 大数据量分页使用PageOptimizeInterceptor
    • 查询指定字段用select()避免SELECT *
  2. 最佳实践

    java 复制代码
    // 条件构造器正确用法
    userService.lambdaQuery()
         .like(StringUtils.isNotBlank(name), User::getName, name)
         .gt(age != null, User::getAge, age)
         .list();
  3. 进阶功能

    • 逻辑删除 :添加@TableLogic注解
    • 自动填充 :实现MetaObjectHandler
    • 多租户 :使用TenantLineInnerInterceptor
  4. 避坑指南

    • 避免Service层直接暴露QueryWrapper
    • 实体类字段与数据库命名风格保持一致(可通过global-config.db-config.column-underline配置)
    • 生产环境关闭mybatis-plus.configuration.log-impl

最后忠告:MyBatis-Plus虽好,但复杂查询仍建议使用XML映射文件,保持代码可维护性!


通过以上步骤,30分钟内即可完成从项目搭建到分页查询的全流程。MyBatis-Plus的核心价值在于减少样板代码,让开发者更专注于业务逻辑实现。根据项目复杂度灵活选择MP功能,切忌过度设计。

相关推荐
Dcs5 分钟前
Spring Framework 6.2 正式发布:开发者最值得关注的更新全览!
java
别来无恙1496 分钟前
Spring Boot自动装配原理深度解析:从核心注解到实现机制
java·spring boot·后端
亲爱的非洲野猪7 分钟前
Spring Cloud Gateway 电商系统实战指南:架构设计与深度优化
java·spring cloud·gateway
[听得时光枕水眠]7 分钟前
Gateway
java·开发语言·gateway
m0_4811473322 分钟前
枚举类高级用法
java·开发语言·windows
开往198226 分钟前
@DateTimeFormat、@JsonFormat、@JSONField区别及用法
java·前端·时间·datetime
愿你天黑有灯下雨有伞1 小时前
Spring Boot+Redis Zset:三步构建高可靠延迟队列系统
spring boot·redis·后端
慕y2741 小时前
Java学习第六十三部分——K8s
java·开发语言·学习
bobz9651 小时前
交换机上的DMZ的优先级比ACL的限制的优先级更高么
后端
你我约定有三1 小时前
RabbitMQ--批量处理
java·windows·后端·rabbitmq