MybatisPlus从入门到精通
一、MyBatis-Plus核心特性
- 无侵入性
在MyBatis基础上增强,无需修改原有代码即可使用。 - 自动化CRUD
内置通用Mapper和Service,减少80%单表操作代码。 - Lambda表达式
支持Lambda形式的条件构造,避免字段名硬编码错误。 - 主键策略
支持雪花算法(ASSIGN_ID)、UUID(ASSIGN_UUID)、自增(AUTO)等主键生成方式。
二、快速入门案例
1. 数据库准备
DROP TABLE IF EXISTS sys_user;
CREATE TABLE sys_user
(
id BIGINT NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
DELETE FROM sys_user;
INSERT INTO sys_user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
2. Spring Boot配置
pom.xml依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.3</version>
</dependency>
application.yml:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
username: root
password: root
3. 实体类与Mapper
package com.awei.mybatismodel.entity;
import lombok.Data;
@Data
public class SysUser {
private Long id;
private String name;
private Integer age;
private String email;
}
package com.awei.mybatismodel.mapper;
import com.awei.mybatismodel.entity.SysUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface SysUserMapper extends BaseMapper<SysUser> {
}
4.启动类
package com.awei.mybatismodel;
import org.springframework.boot.SpringApplication;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.awei.mybatismodel.mapper")
public class MybatisModelApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisModelApplication.class, args);
}
}
5.测试
package com.awei.mybatismodel;
import com.awei.mybatismodel.entity.SysUser;
import com.awei.mybatismodel.mapper.SysUserMapper;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class QuickStartTest {
@Autowired
private SysUserMapper userMapper;
@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<SysUser> userList = userMapper.selectList(null);
Assertions.assertEquals(5, userList.size());
userList.forEach(System.out::println);
}
}
三、核心注解详解
注解 | 作用 | 示例 |
---|---|---|
@TableName | 指定实体类对应的表名 | @TableName("sys_user") |
@TableId | 标识主键字段 | @TableId(type = IdType.AUTO) |
@TableField | 字段与列映射/自动填充策略 | @TableField(value = "email", fill = FieldFill.INSERT_UPDATE) |
主键策略示例:
public enum IdType {
AUTO, // 数据库自增
ASSIGN_ID, // 雪花算法(默认)
ASSIGN_UUID // UUID生成
}
四、CRUD操作
1. 基础操作
// 插入
User user = new User();
user.setName("Tom");
userMapper.insert(user);
// 查询
User user = userMapper.selectById(1L);
// 更新
user.setAge(30);
userMapper.updateById(user);
// 删除
userMapper.deleteById(2L);
2. 条件构造器(Wrapper)
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.like(User::getName, "J") // 模糊查询
.ge(User::getAge, 18) // 年龄>=18
.orderByDesc(User::getCreateTime);
List<User> users = userMapper.selectList(wrapper);
生成SQL:
SELECT * FROM user WHERE name LIKE '%J%' AND age >= 18 ORDER BY create_time DESC
五、分页查询
1. 配置分页插件
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
2. 分页查询代码
Page<User> page = new Page<>(1, 10); // 第1页,每页10条
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 20);
IPage<User> userPage = userMapper.selectPage(page, wrapper);
System.out.println("总记录数:" + userPage.getTotal());
六、高级功能
1. 逻辑删除
表字段:
ALTER TABLE user ADD is_deleted TINYINT(1) DEFAULT 0 COMMENT '逻辑删除标记';
配置:
mybatis-plus:
global-config:
db-config:
logic-delete-field: isDeleted # 逻辑删除字段名
logic-delete-value: 1 # 删除标记值
logic-not-delete-value: 0 # 未删除标记值
2. 自动填充
public class MetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
}
更新中----