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

相关推荐
AOwhisky9 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
Java内核笔记10 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端
糖果店的幽灵10 小时前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph
谙弆悕博士10 小时前
系统集成项目管理工程师教程(第3版)笔记——第4章:信息系统架构
笔记·系统架构·项目管理·创业创新·学习方法·业界资讯·物理
极光代码工作室11 小时前
基于SpringBoot的在线博客系统
java·springboot·web开发·后端开发
minglie111 小时前
zynq中linux系统的自动登录和免密登录
学习
我是唐青枫11 小时前
Java Spring Security 实战详解:从登录认证到 JWT 权限控制
java·spring
茯苓gao11 小时前
嵌入式开发笔记:Qt信号槽机制深度解析——从原理到实战的全方位指南
开发语言·笔记·嵌入式硬件·qt·学习
ihuyigui12 小时前
海外签收通知短信接口
android·java·开发语言·前端·数据库·后端
海棠Flower未眠12 小时前
SpringBoot 消息死信队列(荣耀典藏版)
java·数据库·spring boot