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

相关推荐
用户2986985301411 小时前
Java 实战:将 Markdown 文档转换为 Word 与 PDF
java·后端
optimistic_chen11 小时前
【AI Agent 全栈开发】提示词技巧(prompt)
java·人工智能·ai·prompt·agent
E_ICEBLUE11 小时前
在 Java 中使用 Spire.PDF 合并 PDF 文档(含加密与压缩处理)
java·pdf
消失的旧时光-194311 小时前
SQL 怎么学(工程实战总纲|用一套用户模型打穿全流程)
java·数据库·sql
白露与泡影11 小时前
从区间锁到行锁:一次高并发写入死锁治理实战
java·开发语言
村口张大爷11 小时前
01 — MVC 与 DDD 的思维差异
java·后端
疯狂成瘾者11 小时前
对比JAR 包部署 vs Docker 部署方式
java·docker·jar
丑八怪大丑11 小时前
Java范型
java·开发语言
加藤不太惠11 小时前
Nacos简单实用集群创建
java·开发语言·nacos