MyBatis-Plus可通过实体继承Model类、配置全局Mapper并调用其方法实现近似ActiveRecord模式。需继承Model、重写pkVal()、实现Serializable;在启动类中通过Model.setMapper()注入Mapper Bean;之后可直接调用insert()、updateById()、selectById()等方法,但仅限单表操作且需手动配置Mapper。

MyBatis-Plus 本身不直接提供传统意义上的 ActiveRecord 模式(如 Rails 或 Laravel 那样模型自带 save/update/delete 方法并隐式操作数据库),但它通过 Entity 继承 Model 类 + BaseMapper + Service 层封装,可以非常接近 ActiveRecord 的开发体验。关键在于合理组合使用其内置能力,而非开启某个开关。
1. 让实体类继承 Model 并实现序列化
这是模拟 ActiveRecord 的基础。Model 类提供了通用的 insert、updateById、selectById 等链式操作方法,但需配合全局 Mapper 才能真正执行 SQL。
- 实体类必须继承
com.baomidou.mybatisplus.extension.activerecord.Model - 重写
pkVal()方法,返回主键字段值(通常用反射获取) - 建议实现
Serializable,避免分布式或缓存场景问题
public class User extends Model<User> implements Serializable {
private Long id;
private String name;
private Integer age;
@Override
protected Serializable pkVal() {
return this.id; // 告诉 Model 主键是哪个字段
}
}
2. 配置全局 Mapper(必需步骤)
仅继承 Model 不够——MyBatis-Plus 需要知道该用哪个 Mapper 来执行操作。必须在启动类或配置类中调用 Model.setMapper(...) 注入 Mapper 实例。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
- 推荐在 Spring Boot 启动类的
@PostConstruct方法中设置 - Mapperr 必须是 Spring 管理的 Bean(即接口上标注了
@Mapper或被@MapperScan扫描到)
@SpringBootApplication
public class Application {
@Autowired
private UserMapper userMapper;
@PostConstruct
public void init() {
Model.setMapper(userMapper); // ⚠️ 关键!否则调用 save() 会抛空指针
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3. 在业务中像 ActiveRecord 一样操作实体
完成以上两步后,实体对象即可直接调用持久化方法,无需显式注入 Mapper:
立即学习“Java免费学习笔记(深入)”;
-
user.insert()→ 插入新记录(自增 ID 会回填) -
user.updateById()→ 根据主键更新(只更新非 null 字段,除非配置了 updateStrategy) -
User.selectById(1L)→ 静态方法查单条 -
User.selectList(null)→ 静态方法查列表(null 表示无条件) - 支持链式调用:
new User().setName("Tom").setAge(25).insert()
4. 注意事项与常见问题
- 不是真正的“零配置”ActiveRecord:仍需定义 Mapper 接口和 XML/注解 SQL(哪怕空接口),且必须手动 setMapper
- 不支持跨表关联操作:Model 方法只面向单表;一对多/多对一需用 Service 封装或自定义 Mapper
-
批量操作需谨慎:如
insertBatch是 Mapper 层方法,Model 未提供对应静态批量接口 -
事务需由调用方控制:比如在 @Service 方法上加
@Transactional,Model 方法内部不开启事务
本质上,MyBatis-Plus 的 ActiveRecord 是一种轻量级语法糖,它把「实体 + Mapper」绑定起来,让你少写一行 userMapper.insert(user)。只要理解 Model 的依赖来源和生命周期,就能安全高效地使用。

















