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的对象,各种增删改查就可以了。