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 核心要点

  1. 不需要XML映射文件,不用手写Mongo查询语句
    框架自动解析接口方法名,动态生成Mongo查询。
  • findByDeviceId → 生成查询:{ "deviceId" : 参数 }
  • 启动时通过动态代理自动生成接口实现类,不用自己写实现类。
  1. MongoRepository<Device, String>
  • Device:实体类,加@Document,对应MongoDB collection(集合,类似MySQL表)
  • String:Mongo文档内置主键_id的类型
  • 父接口自带基础CRUD:save()、findById()、findAll()、delete()
    • save():存在则更新,不存在则新增;判断依据是Mongo内置_id,不是业务字段deviceId
  1. 实体类映射
@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:自定义文档字段名,实体驼峰默认直接映射
  1. 自定义复杂查询
    简单单字段查询用方法名;多条件/复杂查询用@Query写原生Mongo JSON查询:
@Query("{ 'status': 'online', 'station': ?0 }") 
List<Device> findOnlineByStation(String station);
  1. 业务使用示例(DeviceService)
Device device = deviceRepository.findByDeviceId(deviceId);
// 修改字段
device.setStatus("online");
deviceRepository.save(device); // 更新文档
  1. ⚠️ 业务坑点(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 核心要点

  1. 必须手写SQL + XML映射文件(或注解SQL)
    接口只是定义方法,SQL写在xml或者@Select/@Update注解。
  2. 不会自动生成实现类,MyBatis底层动态代理调用XML里的SQL。
  3. 没有自带CRUD,基础增删改查都需要自己写SQL。
  4. 实体映射:xml写resultMap,配置数据库列名和实体字段映射。

三、对比表格

对比项Spring Data MongoDB RepositoryMyBatis
数据库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),不会自动生成语句,适合关系库。

上一篇: Kafka & RabbitMQ 死信队列(DLQ)超全整合笔记
下一篇: Kafka全套核心术语
ab123768
博客等级 码龄3年 43粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ab123768

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值