Spring Data MongoDB Repository 对比笔记
Spring Data MongoDB Repository 对比笔记
对比对象:Spring Data Mongo Repository VS MyBatis
场景:设备台账文档操作(MongoDB集合 Device)
一、代码示例(Spring Data Mongo)
@Repository
public interface DeviceRepository extends MongoRepository<Device, String> {
Device findByDeviceId(String deviceId);
List<Device> findByDeviceType(String deviceType);
List<Device> findByStatus(String status);
}
✅ Spring Data Mongo 核心要点
- 不需要XML映射文件,不用手写Mongo查询语句
框架自动解析接口方法名,动态生成Mongo查询。
findByDeviceId→ 生成查询:{ "deviceId" : 参数 }- 启动时通过动态代理自动生成接口实现类,不用自己写实现类。
MongoRepository<Device, String>
Device:实体类,加@Document,对应MongoDB collection(集合,类似MySQL表)String:Mongo文档内置主键_id的类型- 父接口自带基础CRUD:
save()、findById()、findAll()、delete()save():存在则更新,不存在则新增;判断依据是Mongo内置_id,不是业务字段deviceId
- 实体类映射
@Document(collection = "device")
public class Device {
@Id
private String id; // MongoDB内置主键 _id
@Indexed(unique = true)
private String deviceId; // 业务设备编号(业务唯一,≠_id)
private String deviceType;
private String status;
@Field("stationCode")
private String station;
}
@Document:指定集合名称@Id:映射Mongo内置_id@Indexed(unique=true):给deviceId建立唯一索引,防止重复设备@Field:自定义文档字段名,实体驼峰默认直接映射
- 自定义复杂查询
简单单字段查询用方法名;多条件/复杂查询用@Query写原生Mongo JSON查询:
@Query("{ 'status': 'online', 'station': ?0 }")
List<Device> findOnlineByStation(String station);
- 业务使用示例(DeviceService)
Device device = deviceRepository.findByDeviceId(deviceId);
// 修改字段
device.setStatus("online");
deviceRepository.save(device); // 更新文档
- ⚠️ 业务坑点(Kafka消息场景重点)
findByDeviceId返回单个对象,如果数据库存在多条相同deviceId文档 → 直接抛异常,业务上deviceId必须唯一,建唯一索引- 并发覆盖问题:多条Kafka消息并发读取同一条文档,各自修改后save,后保存的数据覆盖前面更新,丢失中间状态。
二、MyBatis(作为对照)
public interface DeviceMapper {
Device findByDeviceId(String deviceId);
List<Device> findByDeviceType(String deviceType);
int updateStatus(Device device);
}
需要配套 Mapper.xml,手写SQL,写字段映射:
<select id="findByDeviceId" resultType="Device">
select id,device_id,device_type,status from device where device_id=#{deviceId}
</select>
✅ MyBatis 核心要点
- 必须手写SQL + XML映射文件(或注解SQL)
接口只是定义方法,SQL写在xml或者@Select/@Update注解。 - 不会自动生成实现类,MyBatis底层动态代理调用XML里的SQL。
- 没有自带CRUD,基础增删改查都需要自己写SQL。
- 实体映射:xml写
resultMap,配置数据库列名和实体字段映射。
三、对比表格
| 对比项 | Spring Data MongoDB Repository | MyBatis |
|---|---|---|
| 数据库 | MongoDB(文档库) | MySQL等关系型数据库 |
| 映射文件 | 不需要XML | 需要Mapper.xml / 注解SQL |
| 查询写法 | 简单查询:方法名自动解析;复杂查询:@Query写Mongo JSON | 全部SQL需要手动编写 |
| CRUD能力 | 继承MongoRepository自带save/findById/findAll/delete | 没有自带CRUD,全部需要自己写 |
| 实体映射 | @Document、@Field、@Id注解映射集合与文档字段 | xml resultMap映射表字段和实体 |
| 底层实现 | 启动动态代理生成接口实现,拼装Mongo命令 | 动态代理执行xml中预定义SQL |
| 主键区分 | 内置_id(框架识别)和业务字段deviceId分开 | 表主键自己定义 |
| 适合场景 | MongoDB,简单CRUD为主,快速开发 | 关系型数据库,SQL灵活可控,复杂查询 |
四、一句话总结
Spring Data Mongo Repository:只写接口,靠方法名自动生成Mongo查询,无XML,自带基础CRUD;
MyBatis:接口+手写SQL(XML),不会自动生成语句,适合关系库。



被折叠的 条评论
为什么被折叠?



