Spring Boot之使用JPA訪問數據

這篇文章簡單講解使用Spring Data JPA在關係型數據庫中存儲和取出數據。java

你將建立什麼樣的應用

你將建立一個在內存數據庫中存取CustomerPOJOs的應用。web

準備工做:

  • 大約15分鐘
  • 你喜歡的文本編輯器或者IDE
  • JDK >= 1.8
  • Maven >= 3.0
建立目錄結構

在你選擇的工程目錄下,建立以下目錄結構;例如在*nix系統使用mkdir -p src/main/java/hello:spring

└── src
    └── main
        └── java
            └── hello

pom.xml數據庫

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>gs-accessing-data-jpa</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
    </parent>

    <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>
        </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>

    <repositories>
        <repository>
            <id>spring-releases</id>
            <name>Spring Releases</name>
            <url>https://repo.spring.io/libs-release</url>
        </repository>
        <repository>
            <id>org.jboss.repository.releases</id>
            <name>JBoss Maven Release Repository</name>
            <url>https://repository.jboss.org/nexus/content/repositories/releases</url>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-releases</id>
            <name>Spring Releases</name>
            <url>https://repo.spring.io/libs-release</url>
        </pluginRepository>
    </pluginRepositories>

</project>
定義一個簡單的實體

在這個例子中,經過JPA實體的註解,新建一個Customer的對象。apache

src/main/java/hello/Customer.javamaven

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);
    }

}

Customer 類有三個屬性, id, firstName,和 lastName. 類有兩個構造函數.JPA須要一個 默認的構造函數 . 你不須要直接使用它,因此設置成 protected. 另外一個構造函數只是爲了方便建立 Customer 實例保存在數據庫中.編輯器

在這篇文章中爲了簡潔,省略了getters和setters方法。ide

Customer 類用@Entity註釋,代表它是一個JPA實體。由於沒有@Table註釋,數據庫中映射的表名爲實體名Customer.函數

@Entity註釋類時,數據庫映射後表名爲實體名,字段名和屬性名稱也相同
@Table註釋類時,默認是和@Entity相同,可是能夠用@Table(name='value')指定表名,用@Column(name='value')指定字段名。spring-boot

Customerid 屬性用@Id註釋JPA將識別它,並把它做爲對象的ID.id屬性還被@GeneratedValue 註解,代表ID將自動的增長。

firstNamelastName屬性沒有被註釋.他們將被映射成和屬性名相同的字段。

toString() 能夠很方便的輸出customer的屬性

建立簡單的查詢

Spring Data JPA 只要是使用 JPA 在關係型數據庫中存儲數據. 它最大的特色就是,繼承repository接口,在運行期間能夠自動的幫你去建立查詢方法.

建立Customer的repository接口:

src/main/java/hello/CustomerRepository.java

package hello;

import java.util.List;

import org.springframework.data.repository.CrudRepository;

public interface CustomerRepository extends CrudRepository<Customer, Long> {

    List<Customer> findByLastName(String lastName);
}

CustomerRepository繼承CrudRepository接口.CrudRepository 有兩個規定的參數實體類型和ID類型,咱們這裏傳CustomerLong.CustomerRepository經過對CrudRepository繼承有了對Customer持久化的幾個方法,包含基本的增刪改查。

Spring Data JPA一樣容許你本身定義一些其餘的查詢方法,只須要經過一些簡單的命名規則.在CustomerRepositoryfindByLastName()就是這樣的方法.

在通常的Java應用中,你會去寫一個類去實現CustomerRepository.可是Spring Data JPA是如此的強大:你不須要去寫repository接口的實現。Spring Data JPA會在應用運行過程當中幫你自動的建立。

建立應用程序

src/main/java/hello/Application.java

package hello;

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 Application {

	private static final Logger log = LoggerFactory.getLogger(Application.class);

	public static void main(String[] args) {
		SpringApplication.run(Application.class);
	}

	@Bean
	public CommandLineRunner demo(CustomerRepository repository) {
		return (args) -> {
			// save a couple of customers
			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"));

			// fetch all customers
			log.info("Customers found with findAll():");
			log.info("-------------------------------");
			for (Customer customer : repository.findAll()) {
				log.info(customer.toString());
			}
			log.info("");

			// fetch an individual customer by ID
			Customer customer = repository.findOne(1L);
			log.info("Customer found with findOne(1L):");
			log.info("--------------------------------");
			log.info(customer.toString());
			log.info("");

			// fetch customers by last name
			log.info("Customer found with findByLastName('Bauer'):");
			log.info("--------------------------------------------");
			for (Customer bauer : repository.findByLastName("Bauer")) {
				log.info(bauer.toString());
			}
			log.info("");
		};
	}

}

@SpringBootApplication 是個「複合」註解,它包含如下註解做用:

  • @Configuration 註解將類做爲程序上下文bean的源.
  • @EnableAutoConfiguration 告訴Spring Boot啓動時添加beans和其餘大量的設置.
  • 原本你須要增長 @EnableWebMvc 爲一個 Spring MVC 應用, 可是Spring Boot會自動增長. 這個註釋代表這個應用是一個web應用而且去激活像DispatcherServlet這些設置.
  • @ComponentScan 告訴Spring 去查找其餘的組件,配置和services 在hello包中,而且容許發現controllers.

main()方法中使用Spring Boot’s SpringApplication.run()方法去啓動應用. 不知道你有沒注意到咱們沒有一個 XML文件? 甚至連 web.xml 文件也沒有. 這個web應用是100% 純Java而且你不要處理任何基礎的配置.

main() 方法裏有幾個CustomerRepository 的測試. 首先,從Spirng應用上下文中獲取CustomerRepository . 而後使用save() 方法保存幾個 Customer 對象. 接着, 使用 findAll()方法從數據庫獲取全部 Customer對象. 一樣可使用 findOne() 經過id獲取一個 Customer對象. 最後, 也能夠用findByLastName() 方法經過 "Bauer"去查找 Customer對象.

默認的Spring Boot的JPA repository支持在@SpringBootApplication所在包及其子包中掃描查找。若是你定義JPA repository接口的位置不明顯,你可使用@EnableJpaRepositories註解並傳basePackageClasses=MyRepository.class參數來指出所在位置。

編譯成JAR文件

你能夠把應用編譯成包含必須依賴,類和資源的JAR文件。JAR文件更方便在不一樣的運行環境中部署。

你能夠運行應用使用./mvnw spring-boot:run命令.或者用./mvnw clean package命令編譯成JAR文件.而後那你就能夠運行JAR文件:

java -jar target/gs-accessing-data-jpa-0.1.0.jar

這個命令將建立一個可運行的JAR文件,固然你也能夠編譯成WAR文件。

你將會看見以下一些內容:

== Customers found with findAll():
Customer[id=1, firstName='Jack', lastName='Bauer']
Customer[id=2, firstName='Chloe', lastName='O'Brian']
Customer[id=3, firstName='Kim', lastName='Bauer']
Customer[id=4, firstName='David', lastName='Palmer']
Customer[id=5, firstName='Michelle', lastName='Dessler']

== Customer found with findOne(1L):
Customer[id=1, firstName='Jack', lastName='Bauer']

== Customer found with findByLastName('Bauer'):
Customer[id=1, firstName='Jack', lastName='Bauer']
Customer[id=3, firstName='Kim', lastName='Bauer']
總結

恭喜你!你已經學會了一個簡單使用Spring Data JPA去存儲一個對象進數據庫中,而且經過repository接口去獲取它。

原文連接:https://spring.io/guides/gs/accessing-data-jpa/

相關文章
相關標籤/搜索