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") 改成你的包名

相关推荐
我命由我1234512 小时前
Windows 操作系统 - Windows 查看防火墙是否开启、Windows 查看防火墙放行端口
java·运维·开发语言·windows·java-ee·操作系统·运维开发
Kobebryant-Manba12 小时前
学习模型构造
python·深度学习·学习
fly spider12 小时前
Spring 原理总览:从启动到请求执行
java·数据库·spring
一锅炖出任易仙12 小时前
创梦汤锅学习日记day29
学习·ai·ue5·游戏引擎
大大杰哥12 小时前
SSeEmitter的基本使用和介绍
java·sse·通信
MartinYeung512 小时前
[论文学习]无资料选择性遗忘:透过模型反演实现 LLM 的资料免隐私保护(DFSU)
学习
闪电悠米12 小时前
黑马点评-Redis 消息队列-02_list_pubsub_limits
java·数据库·ide·redis·缓存·list·intellij-idea
海梨花12 小时前
字节面试高频算法题
java·算法·面试·职场和发展
野生技术架构师12 小时前
Java 23 种设计模式:从踩坑到精通 —— 开篇及系列介绍
java·开发语言·设计模式
折哥的程序人生 · 物流技术专研12 小时前
《Java 100 天进阶之路》第93篇:Redis实战应用:缓存策略与分布式锁(2026版)
java·redis·缓存·面试·架构·求职招聘