一、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%2B8username: rootpassword: 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 {@Autowiredprivate SysUserMapper userMapper;@Testpublic 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 {@Beanpublic 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 {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());}
}
更新中----