🚀 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 | 自动生成 |
| 代码量 | 多多多 | 少少少 |
| 开发速度 | 🐢 | 🚀 |
| 脱发程度 | 严重 | 轻微 |
核心优势:
- ✅ 零 SQL 实现 CRUD
- ✅ 代码生成器一键生成
- ✅ 强大的条件构造器
- ✅ 分页插件、乐观锁、逻辑删除等功能一应俱全
MyBatis-Plus 就是这样一个神奇的工具,让你从繁琐的重复劳动中解放出来,有更多时间去...
👉 喝咖啡、摸鱼、思考人生
💡 温馨提示
- 数据库连接信息要改对 :别用示例中的密码
1111,改成你自己的数据库密码! - 表名要正确 :
addInclude("tb_emp")要改成你自己的表名 - 父包名自定义 :
parent("com.hg")改成你的包名