源本科技 | 码上会

ActiveRecord AR 模式

2026/04/02
0
0

引言

ActiveRecord 是一种实体对象直接操作数据库的开发模式,核心思想是:一个实体类对应一张表,一个对象对应一行数据。 在 MyBatis-Plus 中,只需让实体继承 Model,就能直接调用 CRUD,无需注入 Mapper / Service,代码极度简洁。


概念

  • ActiveRecord(AR):领域模型 == 数据访问对象,实体自带 CRUD 能力。

  • MyBatis-Plus 实现:实体继承 Model<T> 即可拥有 CRUD 方法。

  • 前提:必须存在对应 Mapper 并继承 BaseMapper<T>(Spring 能扫描到即可)。


使用步骤

实体类

继承 Model<T>

import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;

@Data
public class User extends Model<User> {

    private Long id;
    private String name;
    private Integer age;
    private String email;
}

编写 Mapper

public interface UserMapper extends BaseMapper<User> {
}

注意: 不需要在业务类中 @Autowired 注入 Mapper,AR 内部会自动获取。


CRUD 示例

新增

User user = new User();
user.setName("张三");
user.setAge(20);
user.setEmail("test@qq.com");

// 插入
boolean success = user.insert();

根据 ID 查询

User user = new User();
user.setId(1L);
User result = user.selectById();

条件查询

支持 Wrapper

List<User> userList = new User().selectList(
    Wrappers.<User>lambdaQuery()
           .eq(User::getAge, 20)
);

根据 ID 更新

User user = new User();
user.setId(1L);
user.setName("李四");
boolean success = user.updateById();

根据条件更新

boolean success = new User().update(
    Wrappers.<User>lambdaUpdate()
            .set(User::getName, "王五")
            .eq(User::getId, 1L)
);

根据 ID 删除

User user = new User();
user.setId(1L);
boolean success = user.deleteById();

条件删除

boolean success = new User().delete(
    Wrappers.<User>lambdaQuery()
           .eq(User::getAge, 18)
);

查询所有 / 计数

// 查询所有
List<User> users = new User().selectAll();

// 计数
long count = new User().selectCount(null);

Model 常用方法

查询

  • selectById():根据 ID 查询

  • selectOne(Wrapper):查询单个

  • selectList(Wrapper):查询列表

  • selectCount(Wrapper):查询总数

  • selectAll():查询全部

修改

  • insert():插入

  • updateById():根据 ID 更新

  • update(Wrapper):条件更新

  • deleteById():根据 ID 删除

  • delete(Wrapper):条件删除


AR 模式优缺点

优点

  • 代码极简:实体直接调用,无需注入 Mapper/Service

  • 语义直观user.insert()user.updateById() 见名知意

  • 适合快速开发:简单 CRUD 效率极高

  • 兼容 Wrapper:复杂条件依然可用 Lambda 构造器

缺点

  • 不适合复杂业务:多表联查、事务、复杂逻辑不推荐

  • 可读性在大项目中下降:业务逻辑散落在实体调用中

  • 违反单一职责原则:实体既做数据载体又做数据访问


注意事项

  1. 必须提供对应的 Mapper 即使不注入,也必须定义并让 Spring 扫描到,否则抛异常。

  2. 主键必须正确配置 @TableId 必须标注,否则 AR 无法识别 ID。

  3. updateById() 必须 setId 否则 MP 不知道更新哪一行。

  4. AR 底层还是调用 BaseMapper 性能与普通 Mapper 调用完全一致,只是语法糖。

  5. 事务控制不变 方法上加 @Transactional 即可。


适用场景

  • 后台管理系统简单 CRUD

  • 原型开发、快速迭代

  • 单表操作极多的场景

不推荐:复杂查询、多表联查、高并发核心业务。