四川网站建设博客,房产网站怎么做才能吸引人,wordpress templates,东莞微信网站开发1.简介 在本文中#xff0c;我们将演示如何利用功能强大的Spring Data JPA API与本课程中的数据库#xff08;内存中的H2数据库#xff09;进行交互。 Spring Data JPA提供了一组非常强大且高度抽象的接口#xff0c;用于与任何基础数据库进行交互。 数据库可以是MySQL我们将演示如何利用功能强大的Spring Data JPA API与本课程中的数据库内存中的H2数据库进行交互。 Spring Data JPA提供了一组非常强大且高度抽象的接口用于与任何基础数据库进行交互。 数据库可以是MySQLMongoDBElasticsearch或任何其他受支持的数据库。 Spring Data JPA的其他优点包括 支持根据JPA公约建立扩展存储库 内置分页支持和动态查询执行 支持基于XML的实体映射 在此示例中我们将使用H2内存数据库。 数据库的选择不应影响我们将构建的Spring Data定义因为这是Spring Data JPA提供的主要优点。 它使我们能够将数据库查询与应用程序逻辑完全分开。 2.项目设置 我们将使用许多Maven原型之一为我们的示例创建一个示例项目。 要创建项目请在将用作工作空间的目录中执行以下命令 mvn archetype:generate -DgroupIdcom.javacodegeeks.example -DartifactIdJCG-SpringDataJPA-example -DarchetypeArtifactIdmaven-archetype-quickstart -DinteractiveModefalse 如果您是第一次运行maven则完成生成命令将花费几秒钟因为maven必须下载所有必需的插件和工件才能完成生成任务。 使用Maven的JPA项目设置 请注意现在您将在所选目录中拥有一个与artifactId同名的新目录。 现在随时在您喜欢的IDE中打开项目。 最后我们使用一个简单的maven命令来代替使用IDE来创建该项目。 这有助于我们使项目设置和初始化不受您可能使用的任何特定IDE的影响。 3. Maven依赖 首先我们需要在项目中添加适当的Maven依赖项。 我们将以下依赖项添加到我们的pom.xml文件中 pom.xml parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion1.5.10.RELEASE/versionrelativePath/ !-- lookup parent from repository --
/parentpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingproject.reporting.outputEncodingUTF-8/project.reporting.outputEncodingjava.version1.8/java.version
/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.h2database/groupIdartifactIdh2/artifactIdscoperuntime/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins
/build 在此处找到与Spring相关的最新依赖项。 请注意我们还在此处添加了H2数据库依赖关系及其范围作为运行时因为一旦应用程序停止运行H2数据就会被冲走。 在本课程中我们将不会关注H2的实际工作原理而是将自己局限于Spring Data JPA API。 您可能还会看到我们如何使用Spring应用程序配置嵌入式H2控制台 。 4.项目结构 在继续进行并开始处理该项目的代码之前让我们在此介绍一下将所有代码添加到项目后将拥有的projet结构 项目结构 我们将项目分为多个包以便遵循关注点分离的原则并且代码保持模块化。 5.定义模型 我们将在我们的项目中添加一个非常简单的模型Person 。 它的定义将非常标准例如 人.java import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;Entity
public class Person {IdGeneratedValueprivate Long id;private String name;private int age;public Person() {}public Person(String name, int age) {this.name name;this.age age;}//standard getters and settersOverridepublic String toString() {return String.format(Person{id%d, name%s, age%d}, id, name, age);}
} 为了简洁起见我们省略了标准的getter和setter方法但是由于Jackson在对象的序列化和反序列化过程中使用它们因此必须将它们制成。 Entity注释将该POJO标记为对象该对象将由Spring Data API管理并且其字段将被视为表列除非标记为transient 。 最后我们为toString()方法添加了一个自定义实现以便在测试应用程序时可以打印相关数据。 6.定义JPA存储库 JPA为我们提供了一种非常简单的定义JPA存储库接口的方法。 在了解如何定义JPA信息库之前我们需要记住只有在利用与JPA相关的功能时才使每个JPA接口与数据库表的单个实体进行交互。 如果我们看一下接口定义我们将对此有深刻的理解 PersonRepository.java import com.javacodegeeks.jpaexample.model.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;Repository
public interface PersonRepository extends JpaRepositoryPerson, Long {
} 尽管上面的接口定义是空的但我们仍然需要了解一些要点 Repository批注将此接口标记为Spring Bean该Bean在应用程序启动时初始化。 借助此注释Spring可以管理异常数据库交互引发的正常运行 我们使用Person作为参数来表示此JPA接口将管理Person实体 最后我们还传递了数据类型Long作为参数。 这表示Person实体包含唯一标识符其类型为Long 7.制作服务界面 在本节中我们将定义一个服务接口该接口将充当实现的合同并重新表达我们的服务必须支持的所有操作。 这些动作将与结交新用户以及获取与数据库中对象有关的信息有关。 这是我们将使用的合同定义 PersonService.java import com.javacodegeeks.jpaexample.model.Person;
import java.util.List;public interface PersonService {Person createPerson(Person person);Person getPerson(Long id);Person editPerson(Person person);void deletePerson(Person person);void deletePerson(Long id);List getAllPersons(int pageNumber, int pageSize);List getAllPersons();long countPersons();
} 我们在该合同中提到了所有四个CRUD操作以及分页概念。 当我们引入基于pageSize和pageNumber从数据库中获取所有对象时使用分页API很重要。 pageSize属性表示从数据库中获取的对象数而pageNumber属性用作查询的跳过部分。 有关Spring分页如何工作的详细课程请阅读本课程 。 8.提供服务实施 我们将使用上面的接口定义来提供其实现以便我们可以执行与我们先前定义的Person实体相关的CRUD操作。 我们将在这里执行 PersonServiceImpl.java import com.javacodegeeks.jpaexample.model.Person;
import com.javacodegeeks.jpaexample.repository.PersonRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;import java.util.List;Service
public class PersonServiceImpl implements PersonService {Autowiredprivate PersonRepository personRepository;Overridepublic Person createPerson(Person person) {return personRepository.save(person);}Overridepublic Person getPerson(Long id) {return personRepository.findOne(id);}Overridepublic Person editPerson(Person person) {return personRepository.save(person);}Overridepublic void deletePerson(Person person) {personRepository.delete(person);}Overridepublic void deletePerson(Long id) {personRepository.delete(id);}Overridepublic ListPerson getAllPersons(int pageNumber, int pageSize) {return personRepository.findAll(new PageRequest(pageNumber, pageSize)).getContent();}Overridepublic ListPerson getAllPersons() {return personRepository.findAll();}Overridepublic long countPersons() {return personRepository.count();}
} 令人惊讶的是所有方法实现都只是一行代码。 这显示了JPA存储库提供给我们的抽象级别。 上面的大多数操作都很容易理解。 需要注意的主要事情是我们从未在存储库中提供过像getAllPersons()等那样的任何方法 那么这些方法是如何一起出现的呢 答案还是在于JPA存储库提供给我们的抽象。 所有方法如findAll() delete() save(...)等都内置在我们在存储库接口定义中扩展的JpaRepository中。 9.使用CommandLineRunner 为了测试我们现在编写的收费代码以及数据库交互部分我们将在Spring Boot应用程序的主类中使用CommandLineRunner 。 CommandLineRunner在Spring Boot应用程序的main()方法被调用之前运行因此它是执行任何初始化步骤或测试代码的理想空间。 为了测试应用程序我们将使用服务bean在我们的类中执行数据库操作 pom.xml import com.javacodegeeks.jpaexample.model.Person;
import com.javacodegeeks.jpaexample.service.PersonService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
public class DataJpaApp implements CommandLineRunner {private static final Logger LOG LoggerFactory.getLogger(JCG);Autowiredprivate PersonService service;public static void main(String[] args) {SpringApplication.run(DataJpaApp.class, args);}Overridepublic void run(String... strings) {LOG.info(Current objects in DB: {}, service.countPersons());Person person service.createPerson(new Person(Shubham, 23));LOG.info(Person created in DB : {}, person);LOG.info(Current objects in DB: {}, service.countPersons());person.setName(Programmer);Person editedPerson service.editPerson(person);LOG.info(Person edited in DB : {}, person);service.deletePerson(person);LOG.info(After deletion, count: {}, service.countPersons());}
} 在上面的示例代码中我们只是简单地调用了我们在服务中创建的一些重要方法例如创建了一些数据并在以后的方法调用中对其进行了访问。 现在我们最终将使用Maven本身运行我们的项目再次独立于任何IDE来运行我们的项目。 10.运行应用程序 使用maven可以轻松运行应用程序只需使用以下命令 运行应用程序 mvn spring-boot:run 一旦运行项目我们将看到以下输出 数据JPA项目输出 如预期的那样我们首先创建了一些样本数据并通过调用count()方法调用对其进行了确认。 最后我们删除了数据并再次通过count()方法调用进行了确认。 11.下载源代码 这是Spring Boot和Spring Data JPA API以及内存中H2数据库的示例。 下载 您可以在此处下载此示例的完整源代码 Spring Data JPA示例 翻译自: https://www.javacodegeeks.com/2018/03/spring-data-jpa-example-with-spring-boot.html