MyBatis/MyBatis-plus

mapper层的一些拓展操作

做 两件事情 一是声明为mapper接口 二是继承基类 已经实现了基本的 CRUD 操作

在实际开发中,mapper 层还有许多可以拓展的点和技巧

1. 自定义查询方法

虽然 BaseMapper 提供了基本的 CRUD 操作,但有时你可能需要实现一些复杂的查询。你可以在 mapper 接口中添加自定义方法,并使用 MyBatis 的注解或 XML 来实现。

import org.apache.ibatis.annotations.Select;
import java.util.List;

public interface UserMapper extends BaseMapper<User> {

    // 自定义查询方法
    @Select("SELECT * FROM user WHERE username = #{username}")
    List<User> findByUsername(String username);
}

2. 使用 Wrapper 进行复杂查询

MyBatis-Plus 提供了 QueryWrapperUpdateWrapper,可以用于构建复杂的查询和更新条件。

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

public List<User> getUsersByCondition(String username) {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("username", username);
    return userMapper.selectList(queryWrapper);
}

3. 分页查询

MyBatis-Plus 支持分页查询,可以使用 Page 类进行分页操作。

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

public Page<User> getUsersByPage(int currentPage, int pageSize) {
    Page<User> page = new Page<>(currentPage, pageSize);
    return userMapper.selectPage(page, null); // 可以传入条件
}

4. 批量操作

MyBatis-Plus 也支持批量插入和更新,适合处理大量数据时使用。

public void insertBatch(List<User> userList) {
    userMapper.insertBatchSomeColumn(userList); // 批量插入
}

5. 自定义 SQL

如果需要执行复杂的 SQL 语句,可以直接在 mapper 接口中定义使用 @Select@Insert@Update@Delete 注解的方法。

@Update("UPDATE user SET password = #{password} WHERE id = #{id}")
void updatePassword(@Param("id") Integer id, @Param("password") String password);

6. 事务管理

在服务层调用 mapper 时,可能需要使用事务。你可以使用 Spring 的 @Transactional 注解来管理事务。

import org.springframework.transaction.annotation.Transactional;

@Transactional
public void createUser(User user) {
    userMapper.insert(user);
    // 其他操作
}

7. 逻辑删除

MyBatis-Plus 支持逻辑删除,你可以在实体类中使用 @TableLogic 注解来标记逻辑删除字段。

import com.baomidou.mybatisplus.annotation.TableLogic;

public class User {
    @TableLogic // 标记为逻辑删除字段
    private Integer deleted;
}

8. 性能分析插件

MyBatis-Plus 提供了性能分析插件,可以在开发阶段用于监控 SQL 执行的性能。

@Bean
public PerformanceInterceptor performanceInterceptor() {
    return new PerformanceInterceptor();
}

MyBatis/MyBatis-plus

MyBatis 和 MyBatis-Plus 是 Java 开发中常用的持久层框架,用于简化与数据库的交互。以下是对它们的详细介绍,以及在开发中如何有效利用它们的知识。

MyBatis 简介

MyBatis 是一款持久层框架,它消除了绝大部分 JDBC 代码以及手动设置参数和获取结果集的工作。MyBatis 通过简单的 XML 或注解配置即可将 SQL 语句映射成 Java 的 POJO 类,同时可以根据需求灵活自定义 SQL 查询。

MyBatis 的主要特性:

  1. SQL 映射:
    • 使用 XML 文件或注解来定义 SQL 语句,并将 SQL 结果映射到 POJO。
    • 可以灵活编写和优化 SQL 语句,适合复杂查询和操作。
  2. 动态 SQL:
    • MyBatis 提供了强大的动态 SQL 特性,允许通过标签(如 <if><choose> 等)编写复杂的 SQL 语句。
    • 使得 SQL 的可读性和灵活性得到很大提升。
  3. 缓存机制:
    • MyBatis 支持一级缓存和二级缓存,用于提高查询效率和性能。
  4. 支持多种数据库:
    • MyBatis 支持多种关系型数据库(如 MySQL、Oracle、PostgreSQL 等),并且与主流数据库兼容性良好。

MyBatis 的基本用法:

  • 配置 XML 映射文件:定义 SQL 语句及其与 Java 对象的映射。
  • 接口与 XML 绑定:通过接口定义方法,并将这些方法映射到 XML 中的 SQL 语句。

MyBatis-Plus 简介

MyBatis-Plus 是在 MyBatis 基础上的增强版,提供了大量便捷功能,使得开发更加高效。MyBatis-Plus 是一款简化 CRUD 操作的增强框架,同时保持了 MyBatis 的灵活性。

MyBatis-Plus 的主要特性:

  1. 无侵入性:

    • MyBatis-Plus 基于 MyBatis 实现,不会对原有的代码和操作产生影响,可以平滑迁移和集成。
  2. 丰富的内置 CRUD 方法:

    • 通过继承 BaseMapper 接口,自动获得单表的基本增删改查操作(如 selectByIdinsertdeleteById 等),不需要手写常用的 SQL。
  3. Lambda 表达式支持:

    • MyBatis-Plus 支持通过 Lambda 表达式来编写查询条件,避免了字符串拼接带来的问题,增强了代码的可读性。
    • // 使用 Lambda 表达式查询
      
      List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>()
      
          .eq(User::getAge, 20));
      
  4. 强大的分页插件:

    • MyBatis-Plus 提供了内置的分页插件,使用非常简单,只需要传入 Page 对象即可。
    // 分页查询
    
    Page<User> page = new Page<>(1, 10); // 第 1 页,每页 10 条
    
    Page<User> result = userMapper.selectPage(page, null);
    
  5. 代码生成器:

    • MyBatis-Plus 提供了强大的代码生成器,能够根据数据库表结构自动生成实体类、Mapper 接口、Service 类等,显著提高开发效率。
  6. 自动填充:

    • 支持数据库表字段的自动填充,例如创建时间、更新时间等,可以通过注解实现自动填充。
    @TableField(fill = FieldFill.INSERT)
    
    private LocalDateTime createTime;
    
  7. 逻辑删除:

    • 支持逻辑删除,只需要在实体类中标注逻辑删除字段,即可自动处理逻辑删除。
    @TableLogic
    
    private Integer deleted;
    

MyBatis 与 MyBatis-Plus 的区别

  • 基本 CRUD:MyBatis-Plus 通过继承 BaseMapper 接口,可以自动获得常用的 CRUD 方法,而 MyBatis 则需要手动编写。
  • 动态 SQL 支持:MyBatis-Plus 保持了 MyBatis 的动态 SQL 特性,因此你可以在需要时编写复杂的 SQL 查询。
  • 分页和查询条件:MyBatis-Plus 内置了分页插件和 Wrapper 查询条件封装,简化了分页和复杂条件查询的实现。
  • 代码生成器:MyBatis-Plus 提供了代码生成器,可以根据表结构生成基本的代码,大幅提升了开发效率。

如何使用 MyBatis-Plus 进行开发

  1. 引入依赖:在 pom.xml 中引入 MyBatis-Plus 相关依赖。
  2. 配置数据源:在 application.yml 中配置数据库连接信息。
  3. 定义实体类:使用 Lombok 和 MyBatis-Plus 注解定义数据库表对应的实体类。
  4. 创建 Mapper 接口:继承 BaseMapper 接口,自动获取 CRUD 操作。
  5. 编写 Service 层代码:在 Service 层编写具体的业务逻辑,使用 Mapper 实现对数据库的操作。
  6. 编写 Controller 层代码:处理前端的请求,调用 Service 层的业务逻辑。

进一步的拓展

  • 自定义 SQL:如果项目有一些复杂的业务逻辑,可以通过自定义 SQL 来灵活处理。
  • 高级查询:学习如何使用 Wrapper 和 Lambda 表达式进行复杂条件查询。
  • 插件机制:深入了解 MyBatis-Plus 的插件体系,例如乐观锁、性能分析插件等。

项目分区导航lombok注解 ⬅️ | 03-MyBatis-MyBatis-plus | ➡️ RestController和Controller