Spring Data JPA

1 什么是JPA

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

  • 相关实现:ElicpseLink、Hibernate、Apache OpenJPA

2 JPA核心概念

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

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

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

  • 类必须有一个 publicprotected 的无参构造函数

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

  • 唯一的对象标识符:简单主键(javax.persistence.Id)、复合主键(javax.persistence.EmbeddedIdjavax.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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值