附源码:构建一个简单的spring-boot的Data JPA项目
本案例在于构建一个简单的spring-boot的data jpa项目
pom.xml依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo_jpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo_jpa</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件:application.properties为空;
源代码:DemoJpaApplication.java文件是项目启动入口
关键源代码及解析如下:
DemoJpaApplication.java
package com.example.demo_jpa;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class DemoJpaApplication {
private static final Logger logger = LoggerFactory.getLogger(DemoJpaApplication.class);
public static void main(String[] args) {
SpringApplication.run(DemoJpaApplication.class, args);
}
@Bean
public CommandLineRunner demo(CustomerRepository repository){
return args -> {
repository.save(new Customer("Jack", "Bauer"));
repository.save(new Customer("Choloe", "0'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.findById(1L);
logger.info("Customer found with findById(1L):");
logger.info("---------------------------------");
logger.info(customer.toString());
logger.info("");
logger.info("Customer found with findByLastName('Bauer'):");
logger.info("--------------------------------------------");
repository.findByLastName("Bauer").forEach(bauer -> {
logger.info(bauer.toString());
});
logger.info("");
};
}
}
Customer.java
@Entity 标识Customer为JPA持久化实体类;
因为没有@Table注解,所以这里假设实体类被映射到了Customer的表
@Id 标识JPA会把它认作对象实例的ID key属性值
@GeneratedValue 标识id应该被自动生成
另外两个属性firstName和lastName未被注解,他们被假设映射到表的列,这些列和这些属性有共同的名称
默认构造仅为了JPA存在,我们不会直接使用它,所以把权限设计成了protected
另一个构造是我们用来创建Customer实例的,该实例会被保存到数据库中
package com.example.demo_jpa;
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);
}
public Long getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
CustomerRepository.java
package com.example.demo_jpa;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface CustomerRepository extends CrudRepository<Customer, Long> {
List<Customer> findByLastName(String lastName);
Customer findById(long id);
}
启动Spring Data JPA项目;
日志中打印以下内容表示成功
2021-02-13 23:53:58.820 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : Customers found with findAll():
2021-02-13 23:53:58.821 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : -------------------------------
2021-02-13 23:53:59.034 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : Customer[id=1, firstName='Jack', lastName='Bauer']
2021-02-13 23:53:59.035 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : Customer[id=2, firstName='Choloe', lastName='0'Bria
n']
2021-02-13 23:53:59.036 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : Customer[id=3, firstName='Kim', lastName='Bauer']
2021-02-13 23:53:59.037 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : Customer[id=4, firstName='David', lastName='Palmer'
]
2021-02-13 23:53:59.037 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : Customer[id=5, firstName='Michelle', lastName='Dess
ler']
2021-02-13 23:53:59.038 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication :
2021-02-13 23:53:59.053 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : Customer found with findById(1L):
2021-02-13 23:53:59.054 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : ---------------------------------
2021-02-13 23:53:59.054 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : Customer[id=1, firstName='Jack', lastName='Bauer']
2021-02-13 23:53:59.055 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication :
2021-02-13 23:53:59.055 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : Customer found with findByLastName('Bauer'):
2021-02-13 23:53:59.056 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : --------------------------------------------
2021-02-13 23:53:59.122 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : Customer[id=1, firstName='Jack', lastName='Bauer']
2021-02-13 23:53:59.124 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication : Customer[id=3, firstName='Kim', lastName='Bauer']
2021-02-13 23:53:59.124 INFO 10768 --- [ main] com.example.demo_jpa.DemoJpaApplication :