构建一个简单的spring-boot的Data JPA项目

秦浩漫
2023-12-01

附源码:构建一个简单的spring-boot的Data JPA项目

概括:

本案例在于构建一个简单的spring-boot的data jpa项目

  • 基于内存,使用java persistence API操作数据库
  • 模拟数据库CRUD操作

1. 准备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

  • 构建一个应用,使用Spring Data JPA来存取关系型数据库
  • 构建一个应用,在基于内存的数据库中存储POJO对象
  • CommandLineRunner:springboot启动时执行任务CommandLineRunner
    • 其中对数据库操作接口做了几个测试:从spring中获取资源库操作接口CustomerRepository–>通过save()方法保存一些Customer对象–>通过findAll()方法获取所有存储的对象–>通过findById获取单一对象–>通过findByLastName()方法获取指定名字的对象
    • CommandLineRunner的实现在应用启动时自动运行,多个实现按顺序(@Order)执行
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

  • Spring Data JPA重点:在于使用JPA存储数据到关系型数据库中;
  • Spring Data JPA的特性是:在运行时,从存储库接口可以自动创建存储库实现;
  • 存储库接口需要继承CrudRepository接口
  • 存储库处理的实体类类型(Customer)和ID类型(Long)被指定到存储库接口的通用参数中
  • 通过继承CrudRepository接口,存储库接口继承了很多方法来处理Customer持久类,包括saving,deleting,finding等等
  • Spring Data JPA允许您根据声明的方法签名(应该是属性名称)定义其他查询方法,如下findByLastName();
  • 一般java应用中,我们会再写一个CustomerRepository的实现类,但是Spring Data JPA是不需要这样的,因为,Spring Data JPA会在应用运行时创建一个实现;
  • 所以,我们只需要有一个JPA接口即可
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);
}

2. 源代码启动

启动Spring Data JPA项目;

3. 结果

日志中打印以下内容表示成功

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  :

 类似资料: