🚀 MyBatis-Plus 学习笔记

🍉 什么是 MyBatis-Plus?

想象一下,你是一个 SQL 工人,每天都要重复写“搬砖(CRUD)”的代码。MyBatis 虽然解放了你的双手,让你不用写 JDBC 的烂摊子,但你依然要写 XML 文件,写一堆 select * from user 这种毫无技术含量的代码。

这时候,MyBatis-Plus(简称 MP) 出现了。它就像一个**“超级包工头”**,它对你说:“兄弟,别写了,这些简单的增删改查我帮你干了!你去喝咖啡吧。”

  • 定义:MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
  • 核心理念:“约定优于配置”。它利用反射和注解,自动帮你生成 SQL。
  • 特点:
    • 无侵入:就像给车装了个涡轮增压,原来的车(MyBatis)还能开,只是跑得更快了。
    • 强大的 CRUD 操作:内置通用 Mapper 和 Service,只要写好实体类,不用写任何 SQL,直接调用方法就能操作数据库。
    • Lambda 表达式:写查询条件不用拼字符串,直接用 Java 代码写,类型安全,不报错。
    • 代码生成器:它甚至能帮你把实体类、Mapper、Service、Controller 全部自动生成出来!

📦 安装教程:把神器搬回家

第一步:打开你的 pom.xml 文件

就像做饭前要准备食材一样,我们需要先引入依赖。看看项目中的 pom.xml:

<!-- MyBatis-Plus 核心依赖 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.15</version>
</dependency>

<!-- 代码生成器(懒人必备) -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.15</version>
</dependency>

<!-- 数据库驱动(这里用 MySQL) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>

<!-- 模板引擎(代码生成器需要) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    <version>2.3.2.RELEASE</version>
</dependency>

💡 小贴士:版本号要保持一致,不然会出现"版本不兼容"这种让人头大的问题!


🎯 使用教程:代码生成器实战

神奇的 CodeGenerator

这个 CodeGenerator.java 简直是懒人福音!运行它,就能自动生成:

  • ✅ 实体类 (Entity)
  • ✅ Mapper 接口
  • ✅ Service 接口
  • ✅ Service 实现类
  • ✅ Mapper XML 文件

就问你爽不爽?

核心代码解析

public class CodeGenerator {
    public static void main(String[] args) {
        // 1. 连接数据库(记得改密码!)
        FastAutoGenerator.create(
            "jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=UTF-8", 
            "root",      // 用户名
            "1111"       // 密码(这里是1111,你的可能是root或其他)
        )
        // 2. 全局配置
        .globalConfig(builder -> builder
            .author("shanyu")  // 作者名(写你的名字)
            .outputDir(Paths.get(System.getProperty("user.dir")) + "/src/main/java")
            .commentDate("yyyy-MM-dd")
        )
        // 3. 包配置(组织结构)
        .packageConfig(builder -> builder
            .parent("com.hg")      // 父包名
            .entity("pojo")        // 实体类放在 pojo 包
            .mapper("mapper")      // Mapper 接口放在 mapper 包
            .service("service")    // Service 接口放在 service 包
            .serviceImpl("service.impl")  // Service 实现类
            .xml("mapper")         // XML 文件位置
            .pathInfo(Collections.singletonMap(OutputFile.xml, 
                Paths.get(System.getProperty("user.dir")) + "/src/main/resources/mapper"))
        )
        // 4. 策略配置
        .strategyConfig(builder -> builder
            .addInclude("tb_emp")  // 要生成的表名(可以写多个)
            .addTablePrefix("tb_") // 去掉表前缀(tb_emp -> Emp)
            .serviceBuilder().formatServiceFileName("%sService")  // Service 接口名
            .entityBuilder()       // 实体类配置
        )
        // 5. 数据源配置(处理日期类型等)
        .dataSourceConfig(builder ->
            builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                if (JdbcType.DATE == metaInfo.getJdbcType()) {
                    return DbColumnType.DATE;
                }
                return typeRegistry.getColumnType(metaInfo);
            })
        )
        // 6. 使用 Freemarker 模板引擎
        .templateEngine(new FreemarkerTemplateEngine())
        // 7. 执行!
        .execute();
    }
}

运行效果

运行这个类后,你会发现项目里突然多了一堆文件:

src/main/java/com/hg/
├── pojo/
│   └── Emp.java          # 实体类
├── mapper/
│   └── EmpMapper.java    # Mapper 接口
├── service/
│   └── EmpService.java   # Service 接口
└── service/impl/
    └── EmpServiceImpl.java # Service 实现类

src/main/resources/mapper/
└── EmpMapper.xml         # Mapper XML

🎉 恭喜! 你已经成功"偷懒"了!


⚡ 实战演练 - 如何使用生成的代码

一、环境搭建(保姆级教程)

1.1 先看 pom.xml 怎么配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <!-- Spring Boot 爸爸 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
    </parent>

    <groupId>com.haogu</groupId>
    <artifactId>mybatis_plus</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- Spring Web:让你能写接口 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- MySQL驱动:连接数据库的通行证 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        
        <!-- Druid连接池:阿里爸爸出品,必属精品 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.0</version>
        </dependency>
        
        <!-- Mybatis-Plus:主角登场!CRUD神器 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
    </dependencies>
</project>

划重点:只需引入 mybatis-plus-boot-starter,Mybatis 和 Spring 的依赖会自动帮你搞定,省心!

1.2 application.yml 配置

server:
  port: 80  # 端口号,别跟其他程序打架

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver  # MySQL驱动类
    url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8
    username: root    # 数据库用户名(默认root)
    password: 1111    # 数据库密码(自己改!)
    type: com.alibaba.druid.pool.DruidDataSource  # 使用Druid连接池

mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml  # Mapper XML文件位置

注意:记得先在 MySQL 里创建 mybatis_plus 数据库哦!

二、核心代码解析

2.1 实体类 Emp.java

package com.hg.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

@TableName("tb_emp")  // 告诉MP:我对应数据库的tb_emp表
public class Emp implements Serializable {
    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)  // 主键自增
    private Integer id;
    
    private String name;    // 姓名
    private Integer age;    // 年龄
    private String sex;     // 性别
    private String birthday; // 生日
    private String address; // 地址

    // Getter、Setter、toString 省略(IDE自动生成)
}

知识点:

  • @TableName:指定实体类对应的数据库表名
  • @TableId:指定主键字段,IdType.AUTO 表示自增

2.2 Mapper 层 EmpMapper.java

package com.hg.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hg.pojo.Emp;

// 只需继承 BaseMapper,瞬间获得CRUD能力!
public interface EmpMapper extends BaseMapper<Emp> {
    // 什么都不用写!Mybatis-Plus帮你实现所有基础操作
}

震惊! 这就是 Mapper?空接口?是的!继承 BaseMapper<Emp> 后,你就拥有了:

  • insert() - 新增
  • deleteById() - 根据ID删除
  • updateById() - 根据ID更新
  • selectById() - 根据ID查询
  • selectList() - 查询所有
  • 等等…

2.3 Service 层

EmpService.java(接口):

package com.hg.service;

import com.hg.pojo.Emp;
import com.baomidou.mybatisplus.extension.service.IService;

// 继承 IService,获得更强大的服务层能力
public interface EmpService extends IService<Emp> {
}

EmpServiceImpl.java(实现类):

package com.hg.service.impl;

import com.hg.pojo.Emp;
import com.hg.mapper.EmpMapper;
import com.hg.service.EmpService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService {
    // 同样什么都不用写!继承 ServiceImpl 即可
}

Service层优势:除了 CRUD,还支持批量操作、链式调用等高级功能。

2.4 Controller 层 EmpController.java

package com.hg.controller;

import com.hg.pojo.Emp;
import com.hg.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/emp")
public class EmpController {

    @Autowired
    private EmpService empService;

    // 添加员工
    @RequestMapping("/addEmp")
    public String addEmp(){
        Emp emp = new Emp();
        emp.setName("张三");
        emp.setSex("男");
        emp.setAge(18);
        emp.setBirthday("07-01");
        emp.setAddress("北京");
        empService.save(emp);  // 一行代码搞定插入!
        return "添加成功";
    }

    // 删除员工
    @RequestMapping("/deleteEmp")
    public String deleteEmp(Integer id){
        empService.removeById(id);  // 根据ID删除,爽!
        return "删除成功";
    }

    // 查询员工
    @RequestMapping("/selectEmp")
    public Emp selectEmp(Integer id){
        return empService.getById(id);  // 根据ID查询,直接返回对象!
    }

    // 更新员工
    @RequestMapping("/updateEmp")
    public String updateEmp(Integer id){
        Emp emp = new Emp();
        emp.setId(id);
        emp.setAddress("河南");
        emp.setSex("女");
        emp.setName("李四");
        empService.updateById(emp);  // 根据ID更新,只改有值的字段!
        return "修改成功";
    }
}

总结:Controller 层代码简洁到令人发指!没有 SQL,没有 ResultSet,直接调用 Service 方法就行。

Mybatis-Plus 常用操作速查

操作Service方法说明
新增save(entity)保存单个实体
批量新增saveBatch(list)批量保存
根据ID删除removeById(id)删除一条记录
批量删除removeByIds(list)批量删除
根据ID更新updateById(entity)更新非空字段
根据ID查询getById(id)返回单个实体
查询所有list()返回实体列表
条件查询list(queryWrapper)自定义条件
分页查询page(page, queryWrapper)分页查询
统计数量count(queryWrapper)统计符合条件的数量

😄 总结

特性MyBatisMyBatis-Plus
CRUD手动写 SQL自动生成
代码量多多多少少少
开发速度🐢🚀
脱发程度严重轻微

核心优势:

  1. ✅ 零 SQL 实现 CRUD
  2. ✅ 代码生成器一键生成
  3. ✅ 强大的条件构造器
  4. ✅ 分页插件、乐观锁、逻辑删除等功能一应俱全

MyBatis-Plus 就是这样一个神奇的工具,让你从繁琐的重复劳动中解放出来,有更多时间去…

👉 喝咖啡、摸鱼、思考人生


💡 温馨提示

  1. 数据库连接信息要改对:别用示例中的密码 1111,改成你自己的数据库密码!
  2. 表名要正确:addInclude("tb_emp") 要改成你自己的表名
  3. 父包名自定义:parent("com.hg") 改成你的包名

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐