1. Spring Data JPA Repository入门:从零开始的数据访问层
第一次接触Spring Data JPA时,最让我惊讶的是它能让数据库操作变得如此简单。记得刚入行时,我还在手动编写JDBC代码,一个简单的查询就要写十几行。而现在,只需要定义一个接口,就能自动获得完整的CRUD功能。这就像从手动挡汽车突然升级到了自动驾驶——虽然底层原理没变,但开发体验完全不同。
Spring Data JPA的核心就是Repository体系。最基础的Repository接口就像是一个空白的画布,只提供了最基础的类型标记功能。但别小看它,这是整个体系的根基。在实际项目中,我通常不会直接使用它,而是通过它的子接口获得更多能力。比如:
java复制public interface UserRepository extends Repository<User, Long> {
User findByUsername(String username);
}
这个简单的接口已经能完成按用户名查询的功能。Spring会在运行时自动生成实现类,这就是所谓的"约定优于配置"原则。我刚开始用的时候总怀疑:"这样真的能工作吗?"直到看到控制台打印的SQL语句才确信它的魔力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心Repository接口能力对比
2.1 CrudRepository:基础CRUD的瑞士军刀
当项目需要基础的增删改查时,CrudRepository是我的首选。它继承了Repository接口,添加了15个常用方法。有次我接手一个老项目,发现之前的开发者手动实现了所有CRUD操作——这相当于重新发明轮子。用CrudRepository改造后,代码量减少了70%。
几个我常用的方法:
save(S entity):保存或更新实体findById(ID id):按ID查询findAll():查询所有记录deleteById(ID id):按ID删除
java复制public interface ProductRepository extends CrudRepository<Product, Long> {
// 自动获得所有CRUD方法
}
但要注意,findAll()返回的是Iterable类型,这在Java 8之后显得有点过时。我通常会配合Stream API使用:
java复制productRepository.findAll().forEach(System.out::println);
2.2 PagingAndSortingRepository:分页与排序专家
当数据量超过几千条时,分页查询就变得至关重要。PagingAndSortingRepository在CrudRepository基础上增加了分页和排序能力。去年我做的一个电商项目,商品列表页就用到了这个特性:
java复制Page<Product> products = productRepository.findAll(
PageRequest.of(0, 20, Sort.by("price").descending())
);
`
