欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JPA 和 Spring Data JPA

程序员文章站 2022-03-02 15:40:31
...

JPA


JPA名词解释:

  • JPA(Java Persistence API) 是用于管理Java EE和Java SE环境中的持久化,以及对象/关系映射的Java API,具体实现有Hibernate、EclipseLink、Apache OpenJPA

JPA核心概念:

  • 实体表示关系数据库中的表
  • 每个实体实例对应于该表中的行
  • 类必须用javax.persistence.Entity注解
  • 类必须有一个public或protected的无参数的构造函数
  • 实体实例被当作值以分离对象方式进行传递(例如通过会话bean的远程业务接口),则该类必须实现Seriializable接口
  • 唯一的对象标识符,简单主键(javax.persistence.Id)、复合主键(javax.persistence.EmbeddedId和javax.persistence.IdClass)
  • 关系:

一对一:@OneToOne
一对多:@OneToMany
多对一:@ManyToOOne
多对多:@ManyTomany

  • EntityManger接口:

定义用于与持久性上下文进行交互的方法
创建和删除持久实体实例,通过实体的主键查找实体
允许在实体上运行查询

  • 获取EntityManger实例
@PersistenceUnit
EntityManagerFactory emf;
EntityManager em;
@Resource
UserTransaction utx;
...
em = emf.createEntityManager();
try {
    utx.begin();
    em.persist(SomeEntity);
    em.merge(AnotherEntity);
    em.remove(ThirdEntity);
    utx.commit();
}  catch (Exception e)  {
      utx.rollback();
}
  • 查找实体
@PersistenceContext
EntityManager em;
public void enterOrder(int custID, CustomerOrder newOrder) {
    Customer cust = em.find(Customer.class, custID);
    cust.getOrders().add(newOrder);
    newOrder.setCustomer(cust);
}

Spring Data JPA


什么是Spring Data JPA:

  • 是更大的Spring Data家族的一部分
  • 对基于JPA的数据访问层的增强支持
  • 更易于构建基于使用Spring数据访问技术栈的应用程序

常用接口:

  • 增删改查:CrudRepository
public interface CrudRepository<T,ID extends Serializable>
    extends Repository<T,ID> {
    <S extends T> S save(S entity);
    T findOne(ID primaryKey);
    Iterable<T> findAll();
    Long count();
    void delete(T entity);
    boolean exists(ID primaryKey);
}
  • 分页/排序:PagingAndSortingRepository
public interface PagingAndSortingRepository<T,ID extends Serializable>
    extends CrudRepository<T,ID> {
    Iterable<T> findAll(Sort sort);
    Page<T> findAll(Pageable pageable);
}
  • 自定义接口:根据方法名创建查询
public interface PersonRepository extends Repository<User,Long>{
    List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
    
    // 启用 distinct 标志(去重:放在前面后面都可以)
    List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
    List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);

    // 给独立的属性启用 ignore case(忽略大小写)
    List<Person> findByLastnameIgnoreCase(String lastname);
    // 给所有合适的属性启用 ignore case
    List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

    // 启用 ORDER BY(排序)
    List<Person> findByLastnameOrderByFirsnameAsc(String lastname);
    List<Person> findByLastnameOrderByFirsnameDesc(String lastname);
}

Spring Data JPA 、Hibernate与Spring Boot 集成


修改build.gradle

// 添加 Spring Data JPA依赖
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// 添加 MySQL连接驱动依赖
    runtimeOnly 'mysql:mysql-connector-java'

转载于:https://www.jianshu.com/p/ee6c46afe4c5