
如果你是一名java开发工程师,工作多年,你是否认为自己就是高级开发了呢?或许你认为自己能力出众,技术高,经验丰富,自己早就是高级开发了。但是不同的岗位,不同的公司对高级开发的认可程度不一样。简单整了一下,并不是一定是参考,但是可以借鉴一下。希望能帮到大家。
对目前Spring Data JPA给大家做个简单总结,方便新手寻找学习方向,也方便老鸟回顾,未更高的境界冲刺,未更好的职业规划做准备。
CrudRepository、JpaRepository 接口,支持快速实现 CRUD 操作。
EntityManager)。
组件 | 功能描述 |
|---|---|
实体(Entity) | 映射数据库表的 Java 类,使用 @Entity 注解标记。 |
Repository | 数据访问接口,继承 JpaRepository,定义查询方法。 |
EntityManager | JPA 核心接口,管理实体生命周期(增删改查)。 |
事务(Transaction) | 通过 @Transactional 注解管理数据库事务。 |
@Entity、@Table、@Column 等注解将 Java 类映射到数据库表。
JpaRepository<Entity, ID>,声明自定义查询方法。
@Transactional 注解确保操作原子性。
内置方法:
JpaRepository 提供 save()、findById()、findAll()、delete() 等方法。
public interface UserRepository extends JpaRepository<User, Long> {}
// 使用示例
User user = userRepository.findById(1L).orElseThrow();
userRepository.save(new User("Alice"));方法名派生查询:
根据方法名自动生成查询逻辑(支持 And、Or、Like 等关键字)。
List<User> findByLastNameAndAgeGreaterThan(String lastName, int age);注解查询:
使用 @Query 定义 JPQL 或原生 SQL。
@Query("SELECT u FROM User u WHERE u.email LIKE %?1%")
List<User> findByEmailContaining(String email);
@Query(value = "SELECT * FROM users WHERE age > ?1", nativeQuery = true)
List<User> findByAgeNative(int age);分页查询:
使用 Pageable 参数和 Page 返回类型。
Page<User> findAll(Pageable pageable);
// 使用示例
Page<User> users = userRepository.findAll(PageRequest.of(0, 10, Sort.by("name")));关联类型:
@OneToMany、@ManyToOne、@ManyToMany、@OneToOne。
@Entity
public class Order {
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
}级联操作:
通过 cascade 属性定义级联行为(如 CascadeType.PERSIST)。
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<Order> orders;自动填充字段:
使用 @CreatedDate、@LastModifiedDate 记录创建和修改时间。
@EntityListeners(AuditingEntityListener.class)
public class User {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}启用审计:
在配置类添加 @EnableJpaAuditing。
JpaRepository 的接口生成代理类(如 SimpleJpaRepository)。
@Query 注解,生成 JPQL 或 SQL。
@Modifying 标记更新/删除操作,触发事务提交。
@Transactional 注解,支持传播行为(如 REQUIRED、REQUIRES_NEW)。
EntityManager 的提交与回滚。
实现机制:
使用 Hibernate 的动态代理(如 PersistentBag),在访问关联对象时触发 SQL 查询。
配置方式:
@OneToMany(fetch = FetchType.LAZY)
private List<Order> orders;框架 | 优势 | 劣势 |
|---|---|---|
Spring Data JPA | 开发效率高,代码简洁 | 复杂 SQL 调试困难 |
MyBatis | SQL 灵活,适合复杂查询 | 需手动编写 SQL 和结果映射 |
JDBC | 直接控制底层 SQL,性能最高 | 代码冗余,维护成本高 |
实体设计原则:
@Version 实现乐观锁,防止并发冲突。
N+1 查询问题:
JOIN FETCH 或 @EntityGraph 预加载关联数据。
@EntityGraph(attributePaths = "orders")
List<User> findAll();批量操作优化:
saveAll() 批量插入,结合 @Transactional 提升性能。
OpenSessionInView 模式。
@Transactional 注解在 public 方法上,且未被同类方法调用绕过代理。
JpaRepositoryFactory 如何生成 Repository 实现类。
Specifications 动态查询: 通过 JPA Criteria API 实现动态条件拼接。
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {}
// 使用示例
Specification<User> spec = (root, query, cb) -> cb.like(root.get("name"), "%A%");
List<User> users = userRepository.findAll(spec);投影(Projection): 自定义接口或 DTO 返回部分字段。
public interface UserSummary {
String getName();
int getAge();
}
List<UserSummary> findByName(String name);@EnableJpaRepositories(basePackages = "com.primary") 配置多数据源。
通过本报告,新手可快速掌握 Spring Data JPA 的核心用法,资深开发者可深入原理与调优策略,为构建高效、可维护的数据访问层奠定基础。建议结合电商、社交等实际场景进行项目实战,并持续关注 JPA 生态的新特性(如响应式支持)!