JPA

Spring Data JPA

  • JPA只是一个官方制定的Java持久规范,并不是具体的实现框架,Spring Data JPA是具体实现的框架,底层集成Hibernate
  • 不用重复写CRUD代码,简单的操作不需要写sql语句,而且对于不同的数据库接口统一,降低了数据库迁移成本。
  • 开发的时候只需要继承对应接口就有相关的功能。Repository<T, ID>(标记接口,无法继承)->CrudRepository(基础CRUD)->PagingAndSortingRepository(+分页排序)->JpaRepository(+JPA特有功能,主流首选)。直接在Repository层写一个接口继承就可以使用写好的一些方法。T表示实体类对象,ID表示主键类型
public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);
}
  • 核心实现是通过动态代理,创建一个代理类将对应的方法绑定到对应默认的sql上
  • 也可以进行自定义sql,但是是面对实体对象的语句,不是原始的sql语句
    @Query("select u from User u where u.username = ?1 and u.nickname like ?2")
    Optional<User> findByUsernameAndNicknameLike(String username, String nicknamePattern);

对象和数据库之间的映射

  • JPA特性:在用户注册的时候会创建个人用户标签,这个需要用户的ID,但是这个ID是自增生成的,所以需要有两次save()存储过程,第一次只设置简单的参数save()这个时候JPA会执行的是insert操作,主键会自动生成,然后就可以设置个人组织标签,UserID就存在了,第二次进行save()就是一个update()操作,所以用户保存了两次
    //再给这个对象设置的时候不不要我们自己手动getId(),我们只需要把User整个对象传进去就可以了
    privateTag.setCreatedBy(owner);

    //ManyToOne声明【多对一】的关联关系,也就是说一个用户可以创建多个组织标签,但是一个组织标签只能有一个用户创建
    @ManyToOne 
    //指定数据库表中,要生成的「外键字段名」就是created_by,这个外键关联User必须存储的是主键ID,所以虽然上面传入的是User
    //但是最后数据库只存储了UserId
    @JoinColumn(name = "created_by", nullable = false)
    private User createdBy; // 创建者ID
posted @ 2026-01-05 15:13  Huangyien  阅读(34)  评论(0)    收藏  举报