Spring Data JPA教程

 

Spring Data JPA教程

 

Spring Data JPA是Spring Data系列的一部分。Spring Data可以更轻松地创建使用新方法访问数据的Spring驱动应用程序,例如非关系数据库,地图缩减框架,云服务以及高级关系数据库支持。本文将讨论Spring Data JPA。我们还将研究Spring Data JPA示例应用程序。

目录[ 隐藏 ]

Spring Data JPA 教程

Spring Data JPA提供的一些很酷的功能是:

  1. 创建和支持使用Spring和JPA创建的存储库
  2. 支持QueryDSL和JPA查询
  3. 审核域类
  4. 支持批量加载,排序,动态查询
  5. 支持实体的XML映射
  6. 使用CrudRepository减少通用CRUD操作的代码大小

何时使用Spring Data JPA?

我想说如果你需要快速创建一个主要用于CRUD操作的基于JPA的存储库层,并且你不想创建抽象DAO,实现接口,Spring Data JPA是一个不错的选择。

Spring Data JPA示例

对于我们的Spring Data JPA示例,我们将创建一个将连接到Postgresql数据库的RESTful Web服务。我们将实现基本的CRUD操作并处理我们已经创建的示例数据。

Spring JAP示例示例数据

使用以下查询在Postgresql数据库中创建表并添加一些测试数据。


create table people (
id serial not null primary key,
first_name varchar(20) not null,
last_name varchar(20) not null,
age integer not null
);

insert into people (id, first_name, last_name, age) values
(1, 'Vlad', 'Boyarskiy', 21),
(2,'Oksi', ' Bahatskaya', 30),
(3,'Vadim', ' Vadimich', 32);

Spring Data JPA Maven项目结构

下图显示了最终的Spring JPA项目结构。我们稍后将详细介绍每个组件。
Spring Data JPA,Spring JPA示例

 

Spring Data JPA Maven依赖项

我们需要为Spring Data JPA示例项目添加以下依赖项。

  1. postgresql:Postgresql java驱动。
  2. spring-corespring-contextSpring Framework Core依赖项。
  3. spring-webmvcjackson-databind:适用于Spring REST应用程序。
  4. spring-data-jpahibernate-entitymanager:用于Spring Data JPA和Hibernate支持。

以下是最终pom.xml构建文件的内容。


<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 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.journaldev</groupId>
	<artifactId>springData</artifactId>
	<packaging>war</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>Spring Data JPA Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<properties>
		<spring.framework>4.3.0.RELEASE</spring.framework>
		<postgres.version>42.1.4</postgres.version>
		<serializer.version>2.8.1</serializer.version>
		<spring.data>1.3.4.RELEASE</spring.data>
		<hibernate.manager>4.2.5.Final</hibernate.manager>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.framework}</version>
		</dependency>
		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</artifactId>
			<version>${postgres.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.framework}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.framework}</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-jpa</artifactId>
			<version>${spring.data}</version>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>${hibernate.manager}</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>${serializer.version}</version>
		</dependency>
	</dependencies>

	<build>
		<finalName>${project.artifactId}</finalName>
	</build>
</project>

Spring配置类


package com.journaldev.spring.config;

import java.util.Properties;

import javax.sql.DataSource;

import org.hibernate.ejb.HibernatePersistence;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("com.journaldev.spring.repository")
@PropertySource("classpath:database.properties")
public class DataConfig {

	private final String PROPERTY_DRIVER = "driver";
	private final String PROPERTY_URL = "url";
	private final String PROPERTY_USERNAME = "user";
	private final String PROPERTY_PASSWORD = "password";
	private final String PROPERTY_SHOW_SQL = "hibernate.show_sql";
	private final String PROPERTY_DIALECT = "hibernate.dialect";

	@Autowired
	Environment environment;

	@Bean
	LocalContainerEntityManagerFactoryBean entityManagerFactory() {
		LocalContainerEntityManagerFactoryBean lfb = new LocalContainerEntityManagerFactoryBean();
		lfb.setDataSource(dataSource());
		lfb.setPersistenceProviderClass(HibernatePersistence.class);
		lfb.setPackagesToScan("com.journaldev.spring.model");
		lfb.setJpaProperties(hibernateProps());
		return lfb;
	}

	@Bean
	DataSource dataSource() {
		DriverManagerDataSource ds = new DriverManagerDataSource();
		ds.setUrl(environment.getProperty(PROPERTY_URL));
		ds.setUsername(environment.getProperty(PROPERTY_USERNAME));
		ds.setPassword(environment.getProperty(PROPERTY_PASSWORD));
		ds.setDriverClassName(environment.getProperty(PROPERTY_DRIVER));
		return ds;
	}

	Properties hibernateProps() {
		Properties properties = new Properties();
		properties.setProperty(PROPERTY_DIALECT, environment.getProperty(PROPERTY_DIALECT));
		properties.setProperty(PROPERTY_SHOW_SQL, environment.getProperty(PROPERTY_SHOW_SQL));
		return properties;
	}

	@Bean
	JpaTransactionManager transactionManager() {
		JpaTransactionManager transactionManager = new JpaTransactionManager();
		transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
		return transactionManager;
	}
}
  • @Configuration:这个春天的注释说它是配置类。
  • @EnableTransactionManagement:此注释允许用户在应用程序中使用事务管理。
  • @EnableJpaRepositories("com.journaldev.spring.repository"):表示存储库类的存在位置。
  • @PropertySource("classpath:database.properties"):说我们的classpath中有属性文件。此文件中的值将注入环境变量中。database.properties文件的内容如下所示。
    
    driver=org.postgresql.Driver
    url=jdbc:postgresql://127.0.0.1:5432/postgres
    user=postgres
    password=postgres
    
    hibernate.dialect=org.hibernate.dialect.PostgreSQL82Dialect
    hibernate.show_sql=true
    
  • 对于使用Spring Data,首先我们必须配置DataSourcebean。然后我们需要配置LocalContainerEntityManagerFactoryBeanbean。我们需要这个bean来控制实体。在这个bean中,您必须指定持久性提供程序,即HibernatePersistence在我们的例子中。
  • 下一步是为事务管理配置bean 。在我们的例子中JpaTransactionManager。请注意,如果不配置事务管理器,我们就无法使用@Transactional 注释

AppInitializerWebConfig类是将我们的应用程序配置为Web应用程序而不使用web.xml文件。

 

模型类


package com.journaldev.spring.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "people")
public class Person {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	@Column(name = "age")
	private Integer age;
	@Column(name = "first_name")
	private String firstName;
	@Column(name = "last_name")
	private String lastName;

	public Person() {
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	@Override
	public String toString() {
		return "Person{" + "id=" + id + ", age=" + age + ", firstName='" + firstName + '\'' + ", lastName='" + lastName
				+ '\'' + '}';
	}
}

这里我们有一些新的注释。让我们更详细地谈谈它们。

  • @Entity:此批注允许实体管理器使用此类并将其置于上下文中。
  • @Table(name =“people”):将类与数据库中的表相关联。
  • @Id:说这个字段是主键。
  • @GeneratedValue(strategy = GenerationType.IDENTITY):定义生成主键的策略。
  • @Column(name = "age"):表示数据库中与此字段关联的列。

 

Spring Data JPA Repository

下一步是创建JPA存储库。


package com.journaldev.spring.repository;

import org.springframework.data.repository.CrudRepository;

import com.journaldev.spring.model.Person;

import java.util.List;

public interface PersonRepository<P> extends CrudRepository<Person, Long> {
    List<Person> findByFirstName(String firstName);
}

通过继承CrudRepository,我们可以调用许多方法而无需自己实现它们。其中一些方法是:

  • 保存
  • 找一个
  • 存在
  • 找到所有
  • 计数
  • 删除
  • 删除所有

我们也可以定义自己的方法。这些方法名称应使用特殊关键字,例如“find”,“order”和变量名称。Spring Data JPA开发人员试图考虑您可能需要的大多数可能选项。在我们的示例findByFirstName(String firstName)方法中,返回表中字段first_name等于的所有条目firstName

这是Spring Data JPA最重要的特性之一,因为它减少了大量的锅炉板代码。此外,错误的可能性较小,因为许多已经使用它们的项目对这些Spring方法进行了很好的测试。

 

Spring Service 服务类

现在我们的Spring Data JPA代码已准备就绪,下一步是创建服务类并定义我们必须使用数据库表的方法。


package com.journaldev.spring.services;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.journaldev.spring.model.Person;
import com.journaldev.spring.repository.PersonRepository;

@Service
public class PersonService {

	@Autowired
	PersonRepository<Person> personRepository;

	@Transactional
	public List<Person> getAllPersons() {
		return (List<Person>) personRepository.findAll();
	}

	@Transactional
	public List<Person> findByName(String name) {
		return personRepository.findByFirstName(name);
	}

	@Transactional
	public Person getById(Long id) {
		return personRepository.findOne(id);
	}

	@Transactional
	public void deletePerson(Long personId) {
		personRepository.delete(personId);
	}

	@Transactional
	public boolean addPerson(Person person) {
		return personRepository.save(person) != null;
	}

	@Transactional
	public boolean updatePerson(Person person) {
		return personRepository.save(person) != null;
	}
}

@Transactional注释表示该方法将在事务中执行。Spring将负责事务管理。

弹簧控制器类

最后一步是创建控制器类以将我们的API暴露给外部世界。


package com.journaldev.spring.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.journaldev.spring.model.Person;
import com.journaldev.spring.services.PersonService;

@RestController
public class PersonController {

	@Autowired
	PersonService personService;

	@RequestMapping(value = "/person/{id}", method = RequestMethod.GET)
	public @ResponseBody Person getAllUsers(@PathVariable Long id) {
		return personService.getById(id);
	}

	@RequestMapping(value = "/personByName/{name}", method = RequestMethod.GET)
	public List<Person> getPersoneByName(@PathVariable String name) {
		return personService.findByName(name);
	}

	@RequestMapping(value = "/person", method = RequestMethod.GET)
	public List<Person> getAll() {
		return personService.getAllPersons();
	}

	@RequestMapping(value = "/person/{id}", method = RequestMethod.DELETE)
	public HttpStatus deletePersnone(@PathVariable Long id) {
		personService.deletePerson(id);
		return HttpStatus.NO_CONTENT;
	}

	@RequestMapping(value = "/person", method = RequestMethod.POST)
	public HttpStatus insertPersone(@RequestBody Person person) {
		return personService.addPerson(person) ? HttpStatus.CREATED : HttpStatus.BAD_REQUEST;
	}

	@RequestMapping(value = "/person", method = RequestMethod.PUT)
	public HttpStatus updatePerson(@RequestBody Person person) {
		return personService.updatePerson(person) ? HttpStatus.ACCEPTED : HttpStatus.BAD_REQUEST;
	}
}

Spring Data JPA测试

只需构建项目并将其部署到您喜欢的servlet容器(如Tomcat)中。下图显示了一些API调用的响应。

Spring Data JPA全部阅读

Spring Data JPA示例全部阅读

Spring Data JPA按名称获取

Spring JPA阅读

Spring Data JPA创建

Spring Data JPA创建

Spring Data JPA更新

Spring Data JPA更新

Spring Data JPA删除

Spring Data JPA示例删除

这就是Spring Data JPA示例教程的全部内容。您可以从下面的链接下载最终项目。

下载Spring Data JPA示例项目

参考:官方网站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值