开发一个类似mybatisplus的mybatis扩展,该怎么入手?
要开发一个类似于 MyBatis-Plus 的 MyBatis 扩展框架,你需要从以下几个核心方面入手,逐步构建出一个功能完整、易用性强、兼容性好的增强型 MyBatis 框架。
🧱 一、整体架构设计
1. 定位清晰
你的扩展框架应定位为:
- 对 MyBatis 的增强而非替代
- 提供通用 CRUD、查询构造器、插件系统等能力
- 支持 Spring Boot 自动装配(starter)
2. 技术栈依赖
- 基于
mybatis
核心库 - 可选:Spring Boot、JPA 注解风格、Java 8+
🛠️ 二、核心模块划分
模块 | 功能说明 |
---|---|
Core | 核心封装类、工具类、基础接口 |
Mapper | 通用 Mapper 接口(如 BaseMapper) |
Wrapper | 查询条件构造器(QueryWrapper、LambdaWrapper) |
Plugins | 插件体系(分页、逻辑删除、多租户等) |
Generator | 代码生成器(可选) |
Starter | Spring Boot Starter 集成 |
🔨 三、具体实现步骤与关键点
✅ 1. 封装通用 Mapper 接口
目标:
提供统一的 CRUD 方法,减少重复开发。
public interface BaseMapper<T> extends Mapper<T> {T selectById(Serializable id);int insert(T entity);int updateById(T entity);int deleteById(Serializable id);List<T> selectList(@Param("ew") Wrapper<T> wrapper);
}
实现方式:
- 继承 MyBatis 原生
Mapper
- 在 XML 或注解中编写 SQL
- 使用
<if>
、<where>
等标签动态拼接 SQL
✅ 2. 构建 Wrapper 查询构造器
目标:
支持链式调用、类型安全的查询条件构建。
List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("age", 25).like("name", "Tom"));
实现方式:
- 定义
Wrapper<T>
接口 - 实现
QueryWrapper
和UpdateWrapper
- 使用
lambda 表达式
实现字段类型安全(LambdaWrapper)
public class QueryWrapper<T> implements Wrapper<T> {private Map<String, Object> conditions = new HashMap<>();public QueryWrapper<T> eq(String column, Object value) {conditions.put(column, value);return this;}// 转换为 SQL 片段public String toSqlSegment() {return conditions.entrySet().stream().map(e -> e.getKey() + " = '" + e.getValue() + "'").collect(Collectors.joining(" AND "));}
}
✅ 3. 实现自动映射实体类和表字段
目标:
无需手动写 resultMap,自动识别字段名和表列名。
实现方式:
- 使用注解标记字段映射关系
- 自定义
TableId
、TableField
注解 - 利用反射机制读取字段信息并构建 SQL
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TableField {String value() default "";
}// 使用示例
@TableField("user_name")
private String name;
✅ 4. 开发插件系统(Interceptor)
目标:
提供分页、逻辑删除、性能监控、多租户等功能。
实现方式:
- 实现
org.apache.ibatis.plugin.Interceptor
接口 - 使用
@Intercepts
注解拦截目标方法 - 修改 SQL 语句或参数
示例:分页插件
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class PaginationInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {StatementHandler statementHandler = (StatementHandler) invocation.getTarget();BoundSql boundSql = statementHandler.getBoundSql();String originalSql = boundSql.getSql();// 添加 LIMIT 分页String paginatedSql = originalSql + " LIMIT #{offset}, #{limit}";// 替换 SQLField field = boundSql.getClass().getDeclaredField("sql");field.setAccessible(true);field.set(boundSql, paginatedSql);return invocation.proceed();}
}
✅ 5. 主键策略支持
目标:
支持自动生成主键(UUID、Snowflake、数据库自增等)
实现方式:
- 定义
KeyGenerator
接口 - 提供默认实现(SnowFlakeUtil)
- 结合注解使用
@IdGenerator(type = IdType.SNOWFLAKE)
private Long id;
✅ 6. 逻辑删除支持
目标:
软删除数据,不真正执行 DELETE
实现方式:
- 在查询时自动添加
WHERE deleted = 0
- 在更新/插入时处理 deleted 字段
✅ 7. 自动填充字段(如 create_time、update_time)
目标:
在插入或更新时自动填充时间戳等字段
实现方式:
- 实现
MetaObjectHandler
接口 - 重写
insertFill()
和updateFill()
方法
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.now(), LocalDateTime.class);}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.now(), LocalDateTime.class);}
}
✅ 8. 提供 Spring Boot Starter 支持
目标:
一键集成到 Spring Boot 项目中
实现方式:
- 创建
spring-boot-starter-mybatis-ext
- 编写自动配置类(
MyBatisExtAutoConfiguration
) - 注册 Bean(BaseMapper、Interceptor、MetaObjectHandler)
📦 四、推荐开发顺序(由浅入深)
阶段 | 内容 |
---|---|
第一阶段 | 封装通用 Mapper + 基础 CRUD 方法 |
第二阶段 | 实现 Wrapper 查询构造器 |
第三阶段 | 实体类自动映射(注解 + 反射) |
第四阶段 | 插件系统(分页、逻辑删除) |
第五阶段 | 主键策略、自动填充字段 |
第六阶段 | Spring Boot Starter 集成 |
第七阶段 | 代码生成器(可选) |
📌 五、注意事项
事项 | 建议 |
---|---|
兼容性 | 不破坏原有 MyBatis 使用方式 |
性能 | 避免过度封装导致性能下降 |
文档 | 提供详细文档和使用示例 |
社区 | 提供 GitHub 仓库、Issue 支持 |
测试 | 单元测试覆盖所有核心功能 |
✅ 六、总结
要开发一个类似 MyBatis-Plus 的 MyBatis 扩展框架,你可以按照以下路径推进:
通用 Mapper → Wrapper 查询构造器 → 实体类映射 → 插件系统 → Spring Boot 集成 → 自动填充 & 主键策略
最终目标是构建一个:
- 轻量级
- 高性能
- 易用性强
- 兼容性好
- 可扩展性强
的 MyBatis 扩展框架。
如果你希望开源或推广这个框架,还可以加入:
- 代码生成器
- 多租户支持
- 审计日志
- 事务管理增强
这样你就可以打造一个企业级的 MyBatis 扩展工具包。