MyBatis-Plus 中BaseMapper接口是如何加速微服务内部开发的?

假设我们有一个简单的微服务项目,需要对 User 实体进行基本的数据库操作。

场景一:使用原生 MyBatis 的开发流程 (作为对比)

  1. 定义实体类 (Entity):

    // package com.yourcompany.usermicroservice.entity;
    public class User {
        private Long id;
        private String name;
        private Integer age;
        // Getters and Setters...
    }
    
  2. 定义 Mapper 接口: 需要手动声明每一个 CRUD 方法。

    // package com.yourcompany.usermicroservice.mapper;
    import com.yourcompany.usermicroservice.entity.User;
    import org.apache.ibatis.annotations.Mapper;
    import java.util.List;
    
    @Mapper // Or use @MapperScan in application class
    public interface UserMapper {
        int insert(User user);
        User selectById(Long id);
        List<User> selectList(); // Example for list query
        int updateById(User user);
        int deleteById(Long id);
    }
    
  3. 编写 Mapper XML 文件: 需要为接口中的每个方法编写对应的 SQL 语句。

    
    
    DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.yourcompany.usermicroservice.mapper.UserMapper">
    
        <insert id="insert" parameterType="com.yourcompany.usermicroservice.entity.User" useGeneratedKeys="true" keyProperty="id">
            INSERT INTO user (name, age) VALUES (#{name}, #{age})
        insert>
    
        <select id="selectById" resultType="com.yourcompany.usermicroservice.entity.User">
            SELECT id, name, age FROM user WHERE id = #{id}
        select>
    
        <select id="selectList" resultType="com.yourcompany.usermicroservice.entity.User">
            SELECT id, name, age FROM user
        select>
    
        <update id="updateById" parameterType="com.yourcompany.usermicroservice.entity.User">
            UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
        update>
    
        <delete id="deleteById">
            DELETE FROM user WHERE id = #{id}
        delete>
    mapper>
    
  4. 配置 (application.yml): 需要指定 XML 位置等。

    mybatis:
      mapper-locations: classpath*:/mapper/**/*.xml
      type-aliases-package: com.yourcompany.usermicroservice.entity
    

原生 MyBatis 的痛点:

  • 代码冗余: 每个实体都需要编写大量的 CRUD 接口方法和 SQL 语句。
  • 开发效率低: 编写、调试这些基础 SQL 非常耗时。
  • 易出错: 手写 SQL 容易出现拼写错误、字段遗漏等问题。

场景二:使用 MyBatis-Plus BaseMapper 的开发流程 (加速体现)

  1. 定义实体类 (Entity): 可以使用 MP 的注解优化。

    // package com.yourcompany.usermicroservice.entity;
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    
    @TableName("user") // 显式指定表名 (可选, 如果类名与表名不一致)
    public class User {
        @TableId(type = IdType.AUTO) // 指定主键和策略 (AUTO 为自增)
        private Long id;
        private String name;
        private Integer age;
        // Getters and Setters...
    }
    
  2. 定义 Mapper 接口: 只需继承 BaseMapper 即可,无需声明任何 CRUD 方法!

    // package com.yourcompany.usermicroservice.mapper;
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.yourcompany.usermicroservice.entity.User;
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper // Or use @MapperScan
    public interface UserMapper extends BaseMapper<User> {
        // 无需在此处声明 insert, selectById, updateById, deleteById 等方法!
        // BaseMapper 已经提供了这些方法的实现。
    
        // 我们可以在这里添加自定义的、BaseMapper 没有提供的复杂查询方法
        // List findUsersWithComplexCondition(...);
    }
    
  3. 编写 Mapper XML 文件: 对于基础 CRUD 操作,完全不需要编写 XML 文件和 SQL 语句! MP 会自动生成。只有当你需要编写 BaseMapper 未提供的复杂 SQL 时,才需要创建 XML 文件并编写对应的