先创建一个 Spring Boot 项目,我这里的版本是3.5.6
。
添加 Spring data jpa 的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
按照需要选择性添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.42</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
实体类
创建实体类:
name = "customer")
(
access = AccessLevel.PROTECTED)
(public class Customer {
strategy = GenerationType.IDENTITY)
( private Long id;
private String firstName;
private String lastName;
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
这里使用 简化实体类的代码。
Spring JPA 的实体类除了通常实体类需要的 Getter/Setter 方法外,还需要提供一个无参构造器用于 Spring JPA 创建实体类对象,这个无参构造器不需要是 public 的,只需要设置为 protected 即可。
这里最好编译一下,查看 Lombok 是否正确生成了期望的字节码,如果不是,需要检查是 Lombok 版本太旧存在 bug 抑或是 IDE 的配置问题(编译工具里查看注解处理器的配置)
JPA 的实体类由 @Entity
注解标记。JPA 的实体类默认对应的表名就是实体类名称,如果不是,就需要使用@Table
注解指定,这里实际上不是必须的。
需要用@Id
标记实体类中的主键字段,用@GeneratedValue
表名主键生成规则,MySQL 中的主键自增对应@GeneratedValue(strategy = GenerationType.IDENTITY)
,不同的数据库自增这里的规则可能不同。
存储库
创建实体类对应的存储库:
public interface CustomerRepository extends CrudRepository<Customer, Long> {
List<Customer> findByLastName(String lastName);
Customer findById(long id);
}
JPA 中的存储库(repository)对应 MyBatis 中的 Mapper。
这个存储库继承了CrudRepository
接口,该接口提供了一些 JPA 默认封装的增删改查相关的接口方法。
测试
编写测试用例测试存储库:
public class CustomerRepositoryTests {
private CustomerRepository customerRepository;
public void testAddCustomers(){
customerRepository.save(new Customer("Jack", "Bauer"));
customerRepository.save(new Customer("Chloe", "O'Brian"));
customerRepository.save(new Customer("Kim", "Bauer"));
customerRepository.save(new Customer("David", "Palmer"));
customerRepository.save(new Customer("Michelle", "Dessler"));
}
public void testFindByLastName() {
Iterable<Customer> customers = customerRepository.findByLastName("Bauer");
for (Customer customer : customers) {
System.out.println(customer);
}
}
public void testFindById() {
Customer customer = customerRepository.findById(1L);
System.out.println(customer);
}
public void testFindAll() {
Iterable<Customer> customers = customerRepository.findAll();
for (Customer customer : customers) {
System.out.println(customer);
}
}
}
文章评论