Mybatis-Plus学习笔记

🚀 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

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 文件

就问你爽不爽?

核心代码解析

java 复制代码
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 复制代码
<?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 配置

yaml 复制代码
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

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

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(接口)

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(实现类)

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

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) 统计符合条件的数量

😄 总结

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

核心优势

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

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

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


💡 温馨提示

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

相关推荐
Dicky-_-zhang6 小时前
消息队列Kafka/RocketMQ选型与高可用架构:从单体到100万TPS的演进
java·jvm
晨曦中的暮雨6 小时前
4.15腾讯 CSIG云服务产线 一面
java·开发语言
fake_ss1987 小时前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
茉莉玫瑰花茶7 小时前
工作流的常见模式 [ 1 ]
java·服务器·前端
未若君雅裁7 小时前
Spring AOP、日志切面与声明式事务原理
java·后端·spring
Upsy-Daisy7 小时前
AI Agent 项目学习笔记(二):Spring AI 与 ChatClient 主链路解析
人工智能·笔记·学习
No8g攻城狮8 小时前
【人大金仓】wsl2+ubuntu22.04安装人大金仓数据库V9
java·数据库·spring boot·非关系型数据库
xiaoerbuyu12338 小时前
开源Java 邮箱 基于SpringBoot+Vue前后端分离的电子邮件
java·开发语言
C+++Python9 小时前
C++ 进阶学习完整指南
java·c++·学习