MyBatis Plus 详细使用教程

MyBatis Plus 详细使用教程

MyBatis Plus 详细使用教程

一、MyBatis Plus 简介

MyBatis Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它实现了通用的 CRUD 操作,内置了分页、逻辑删除、自动填充等强大功能,极大减少了开发者的工作量。

核心特性:

  • 无侵入:只做增强不做改变,引入它不会对现有项目产生影响
  • 损耗小:只生成少量 SQL 即可进行通用的 CRUD 操作
  • 强大的 CRUD 操作:内置通用 Mapper,通过少量配置即可实现单表操作
  • 支持 Lambda 形式调用:通过 Lambda 表达式,防止硬编码

二、快速开始

1. 添加依赖

在 `pom.xml` 中添加 MyBatis Plus 依赖:

“`xml

com.baomidou
mybatis-plus-boot-starter
3.5.5


2. 配置数据库

yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf-8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver


3. 创建实体类

java
@Data
@TableName(“user”)
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}


4. 创建 Mapper 接口

java
@Mapper
public interface UserMapper extends BaseMapper {
}


5. 启动 Spring Boot 应用

java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}


三、核心功能详解

1. CRUD 操作

MyBatis Plus 内置的 `BaseMapper` 提供了常用的单表 CRUD 方法:

java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;

// 插入一条记录(选择字段,策略插入)
public void insert(User user) {
userMapper.insert(user);
}

// 删除记录
public void deleteById(Long id) {
userMapper.deleteById(id);
}

// 修改记录
public void updateById(User user) {
userMapper.updateById(user);
}

// 根据 ID 查询记录
public User selectById(Long id) {
return userMapper.selectById(id);
}

// 查询所有记录
public List selectAll() {
return userMapper.selectList(null);
}

// 根据 Map 条件查询
public List selectByMap(Map map) {
return userMapper.selectByMap(map);
}
}


2. 条件构造器(QueryWrapper)

使用条件构造器可以灵活地构建查询条件:

java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;

// 查询年龄大于 18 岁且邮箱不为空的用户
public List queryAdults() {
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.gt(“age”, 18)
.isNotNull(“email”)
.orderByDesc(“age”);
return userMapper.selectList(wrapper);
}

// 使用 Lambda 表达式(类型安全)
public List queryByName(String name) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.like(User::getName, name)
.in(User::getAge, 18, 20, 22)
.between(User::getAge, 18, 30);
return userMapper.selectList(wrapper);
}

// 多条件组合查询
public List complexQuery() {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 25)
.or()
.and(wrapper2 -> wrapper2.like(User::getName, “张”)
.like(User::getAge, 26));
return userMapper.selectList(wrapper);
}
}


3. 分页查询

MyBatis Plus 内置了强大的分页功能:

java
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}

@Service
public class UserService {
@Autowired
private UserMapper userMapper;

// 分页查询
public Page pageQuery(int currentPage, int pageSize) {
Page page = new Page<>(currentPage, pageSize);
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.orderByDesc(“create_time”);
return userMapper.selectPage(page, wrapper);
}

// 查询结果
List records = page.getRecords();
long total = page.getTotal();
int current = page.getCurrent();
int size = page.getSize();
}


4. 逻辑删除

启用逻辑删除,避免物理删除数据:

java
// 在实体类上配置
@Data
@TableName(“user”)
public class User {
private Long id;
private String name;
private Integer age;

@TableLogic
private Integer isDeleted; // 0:未删除,1:已删除
}

// 配置
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加逻辑删除插件
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
return interceptor;
}
}

// 使用
@Service
public class UserService {
@Autowired
private UserMapper userMapper;

public void deleteById(Long id) {
// 执行逻辑删除,生成 SQL: UPDATE user SET is_deleted=1 WHERE id=? AND is_deleted=0
userMapper.deleteById(id);
}

// 查询时自动过滤已删除数据
public List selectAll() {
return userMapper.selectList(null);
}
}


5. 自动填充

自动填充创建时间、更新时间等字段:

java
// 创建元数据处理器
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName(“createTime”, new Date(), metaObject);
this.setFieldValByName(“updateTime”, new Date(), metaObject);
}

@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName(“updateTime”, new Date(), metaObject);
}
}

// 在实体类上配置
@Data
@TableName(“user”)
public class User {
private Long id;
private String name;

@TableField(fill = FieldFill.INSERT)
private Date createTime;

@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}


6. 通用 Service

使用 `IService` 和 `ServiceImpl` 快速构建业务层:

java
// 定义 Service 接口
public interface IUserService extends IService {
List queryAdults();
}

// 实现类
@Service
public class UserServiceImpl extends ServiceImpl implements IUserService {
@Autowired
private UserMapper userMapper;

@Override
public List queryAdults() {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.ge(User::getAge, 18);
return this.list(wrapper);
}
}


四、最佳实践

1. 项目结构分层

com.example.project
├── mapper // Mapper 层
├── service // Service 层
├── controller // Controller 层
├── entity // 实体类
├── dto // 数据传输对象
└── config // 配置类


2. 分页参数统一处理

java
@Data
public class PageQuery {
private Integer pageNum = 1;
private Integer pageSize = 10;
}


3. 统一返回结果

java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result {
private Integer code;
private String message;
private T data;

public static Result success(T data) {
return new Result<>(200, “success”, data);
}

public static Result error(String message) {
return new Result<>(500, message, null);
}
}


4. 避免 N+1 问题

对于关联查询,使用 `@TableField(exist = false)` 标注不需要查询的字段,或者使用联表查询。

java
@Data
@TableName(“user”)
public class User {
private Long id;
private String name;

@TableField(exist = false)
private Order orderInfo; // 不参与数据库查询
}
“`

5. 性能优化建议

  • 合理使用索引
  • 避免在条件中使用函数操作
  • 大数据量分页使用游标分页
  • 定期分析慢查询日志

五、总结

MyBatis Plus 通过内置的通用 Mapper 和强大的功能特性,极大简化了 MyBatis 的开发流程。掌握其核心功能,能够显著提升开发效率。建议在实际项目中合理使用各项功能,避免过度依赖,以保持代码的可维护性和性能。

记住:最好的工具是能够提升开发效率,同时保持代码简洁和可维护性的工具。MyBatis Plus 正是这样一个优秀的 MyBatis 增强工具。

标签

发表评论