--- title: "03-MyBatis-MyBatis-plus" created: 2025-12-02 tags: - 项目 aliases: - MyBatis-MyBatis-plus - MyBatis/MyBatis-plus --- # MyBatis/MyBatis-plus ## mapper层的一些拓展操作 做 两件事情 一是声明为mapper接口 二是继承基类 已经实现了基本的 CRUD 操作 在实际开发中,mapper 层还有许多可以拓展的点和技巧 ### 1. 自定义查询方法 虽然 `BaseMapper` 提供了基本的 CRUD 操作,但有时你可能需要实现一些复杂的查询。你可以在 mapper 接口中添加自定义方法,并使用 MyBatis 的注解或 XML 来实现。 ```java import org.apache.ibatis.annotations.Select; import java.util.List; public interface UserMapper extends BaseMapper { // 自定义查询方法 @Select("SELECT * FROM user WHERE username = #{username}") List findByUsername(String username); } ``` ### 2. 使用 Wrapper 进行复杂查询 MyBatis-Plus 提供了 `QueryWrapper` 和 `UpdateWrapper`,可以用于构建复杂的查询和更新条件。 ```java import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; public List getUsersByCondition(String username) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("username", username); return userMapper.selectList(queryWrapper); } ``` ### 3. 分页查询 MyBatis-Plus 支持分页查询,可以使用 `Page` 类进行分页操作。 ```java import com.baomidou.mybatisplus.extension.plugins.pagination.Page; public Page getUsersByPage(int currentPage, int pageSize) { Page page = new Page<>(currentPage, pageSize); return userMapper.selectPage(page, null); // 可以传入条件 } ``` ### 4. 批量操作 MyBatis-Plus 也支持批量插入和更新,适合处理大量数据时使用。 ```java public void insertBatch(List userList) { userMapper.insertBatchSomeColumn(userList); // 批量插入 } ``` ### 5. 自定义 SQL 如果需要执行复杂的 SQL 语句,可以直接在 mapper 接口中定义使用 `@Select`、`@Insert`、`@Update` 或 `@Delete` 注解的方法。 ```java @Update("UPDATE user SET password = #{password} WHERE id = #{id}") void updatePassword(@Param("id") Integer id, @Param("password") String password); ``` ### 6. 事务管理 在服务层调用 mapper 时,可能需要使用事务。你可以使用 Spring 的 `@Transactional` 注解来管理事务。 ```java import org.springframework.transaction.annotation.Transactional; @Transactional public void createUser(User user) { userMapper.insert(user); // 其他操作 } ``` ### 7. 逻辑删除 MyBatis-Plus 支持逻辑删除,你可以在实体类中使用 `@TableLogic` 注解来标记逻辑删除字段。 ```java import com.baomidou.mybatisplus.annotation.TableLogic; public class User { @TableLogic // 标记为逻辑删除字段 private Integer deleted; } ``` ### 8. 性能分析插件 MyBatis-Plus 提供了性能分析插件,可以在开发阶段用于监控 SQL 执行的性能。 ```java @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 特性,允许通过标签(如 ``、`` 等)编写复杂的 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` 接口,自动获得单表的基本增删改查操作(如 `selectById`、`insert`、`deleteById` 等),不需要手写常用的 SQL。 3. **Lambda 表达式支持**: - MyBatis-Plus 支持通过 Lambda 表达式来编写查询条件,避免了字符串拼接带来的问题,增强了代码的可读性。 - ``` // 使用 Lambda 表达式查询 List users = userMapper.selectList(new LambdaQueryWrapper() .eq(User::getAge, 20)); ``` 4. **强大的分页插件**: - MyBatis-Plus 提供了内置的分页插件,使用非常简单,只需要传入 `Page` 对象即可。 ```java // 分页查询 Page page = new Page<>(1, 10); // 第 1 页,每页 10 条 Page result = userMapper.selectPage(page, null); ``` 5. **代码生成器**: - MyBatis-Plus 提供了强大的代码生成器,能够根据数据库表结构自动生成实体类、Mapper 接口、Service 类等,显著提高开发效率。 6. **自动填充**: - 支持数据库表字段的自动填充,例如创建时间、更新时间等,可以通过注解实现自动填充。 ```java @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; ``` 7. **逻辑删除**: - 支持逻辑删除,只需要在实体类中标注逻辑删除字段,即可自动处理逻辑删除。 ```java @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 的插件体系,例如乐观锁、性能分析插件等。 --- **项目分区导航**: [[02-lombok注解|lombok注解]] ⬅️ | 03-MyBatis-MyBatis-plus | ➡️ [[04-RestController和Controller|RestController和Controller]]