秦悦明的运维笔记

spring data JPA

1. JPA提供的功能

JPA主要用于在java中处理持久化操作。对ORM特性和功能进行标准化。
分别定义了用来将对象模型映射到关系模型API,可以在对象上面执行CRUD操作,一种对象查询语言以及通过对象图获取数据的标准API。

简单来说就是ORM的java规范,比jdbc要方便太多太多。

JPA的实现有很多种,比如Hibernate,openJPA等。

2. maven依赖

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>

3.1 定义一个entity

跟普通的BEAN对象差别不大,就是多了一些JPA的注解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package hello;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Customer {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String firstName;
private String lastName;
protected Customer() {}
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return String.format(
"Customer[id=%d, firstName='%s', lastName='%s']",
id, firstName, lastName);
}
}

3.1 几个关键的注解

@Entity 定义实体,如果一个对象在数据库端与一个带有主键的纪录相对于,那么该对象就称为实体。可以用@Table注解指定表名。

@Id 标记了主键属性。

@GeneratedValue注解告诉JPA,应用程序将不负责分配主键值,stratepy属性指定实体类的ID生成策略。

4 定义一个repository接口

repository是spring dat jpa里面的特性,很magic,实现了CrudRepository接口就能自动实现CRUD操作了,不用自己去实现方法! amazing! I like it!

1
2
3
4
5
6
7
8
9
import java.util.List;
import org.springframework.data.repository.CrudRepository;
public interface CustomerRepository extends CrudRepository<Customer, Long> {
List<Customer> findByLastName(String lastName);
}

将Entity和Id的值传到CrudRepository泛型中去即可。也可以自己定义查询,比如上面定义的findByLastName。很方便。

5.调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Bean
public CommandLineRunner demo(CustomerRepository repository){
return (args)-> {
repository.save(new Customer("Jack","Bauer"));
repository.save(new Customer("Chloe", "O'Brian"));
repository.save(new Customer("Kim", "Bauer"));
repository.save(new Customer("David", "Palmer"));
repository.save(new Customer("Michelle", "Dessler"));
logger.info("Customers found with findAll():");
logger.info("--------------------------------");
for (Customer customer : repository.findAll()){
logger.info(customer.toString());
}
logger.info("");
Customer customer = repository.findOne(1L);
logger.info("Customer found with findOne(1L):");
logger.info("---------------------------------");
logger.info(customer.toString());
logger.info("");
logger.info("Customer found with findByLastName('Bauer'):");
logger.info("-------------------------------------------");
for (Customer bauer : repository.findByLastName("Bauer")){
logger.info(bauer.toString());
}
logger.info("");
};

直接开个CustomerRepository的对象,各种增删改查就可以了。