Spring Data JPA

    xiaoxiao2022-07-14  156

    1 什么是JPA

    JPA(Java Persistence API)是用于管理Java EE和Java SE中的持久化,以及对象/关系映射的Java API

    相关实现:ElicpseLink、Hibernate、Apache OpenJPA

    2 JPA核心概念

    实体表示关系数据库中的表(即Entity)

    每个实体实例对应于该表中的行

    类必须用 javax.persistence.Entity 注解即 @Entity

    类必须有一个 public 或 protected 的无参构造函数

    实体实例被当作值以分离对象方式进行传递(例如通会话远程业务接口),则该类必须实现Serializable接口

    唯一的对象标识符:简单主键(javax.persistence.Id)、复合主键(javax.persistence.EmbeddedId 和javax.persistence.IdClass)即 @Id

    关系

    一对一:@OneToOne

    一对多:@OneToMany

    多对一:@ManyToOne

    多对多:@ManyToMany

    3 EntityManager接口

    定义用于与持久性上下文进行交互的方法

    创建和删除持久实体实例,通过实体的主键查找实体

    允许在实体上运行查询

    获取EntityManager实例

    @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); }

    4 Spring Data JPA常用接口

    CrudRepository(Crud增删改查)

    public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> { <S extends T> 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> { // 方法名对应sql查询的关键字: // findBy:根据什么查询 // And:多个查询条件 // Or:一个或多个查询条件 // IgnoreCase:忽略大小写 // AllIgnorecase:忽略所有大小写,在多个条件的情况下使用 // OrderBy:根据什么排序,在方法名最后追加上要使用的排序方式,Asc为升序排序,Des为降序排序 List<Person> findByEmailAddressAndLastname(EnailAddress emailAddress, String lastname); // 启动distinct去重,因为条件有可能通过Lastname或者Firstname都查询到可能有重复,所以要去重 List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname); List<Person> findPeopleDisinctByLastnameOrFirstname(String lastname, String firstname); List<Person> findByLastnameIgnoreCase(String lastname); List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname); List<Person> findByLastnameOrderByFirstnameAsc(String lastname); List<Person> findByLastnmaeOrderByFirstnameDes(String lastname); }

    5 项目中配置Spring Data JPA

    pom.xml中依赖 <!-- 数据库JPA --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- mysql数据库连接 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> application.properties或application.yml中添加mysql和jpa的参数: spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/thymeleaf?charsetEncoding=utf-8&useSSL=false username: root password: root jpa: show-sql: true hibernate: ddl-auto: update 声明创建表实体 @Entity public class User { /** * 用户唯一标识 */ @Id private Long id; /** * 用户名 */ private String username; /** * 用户账号 */ private String email; public User() {} public User(Long id, String username, String email) { this.id = id; this.username = username; this.email = email; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } 创建表的Repository public interface UserRepository extends JpaRepository<User, Long> { }
    最新回复(0)