這篇文章簡單講解使用Spring Data JPA在關係型數據庫中存儲和取出數據。java
你將建立一個在內存數據庫中存取Customer
POJOs的應用。web
在你選擇的工程目錄下,建立以下目錄結構;例如在*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.java
maven
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
Customer
的id
屬性用@Id
註釋JPA將識別它,並把它做爲對象的ID.id
屬性還被@GeneratedValue
註解,代表ID將自動的增長。
firstName
和lastName
屬性沒有被註釋.他們將被映射成和屬性名相同的字段。
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類型,咱們這裏傳Customer
和Long
.CustomerRepository
經過對CrudRepository
繼承有了對Customer
持久化的幾個方法,包含基本的增刪改查。
Spring Data JPA一樣容許你本身定義一些其餘的查詢方法,只須要經過一些簡單的命名規則.在CustomerRepository
中findByLastName()
就是這樣的方法.
在通常的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文件更方便在不一樣的運行環境中部署。
你能夠運行應用使用./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接口去獲取它。