首页 > 编程语言 > 详细

Spring Data Jpa(一)使用入门

时间:2020-07-15 00:41:07      阅读:42      评论:0      收藏:0      [点我收藏+]

1、Spring Data JPA 使用入门

我一直认为 Spring Data JPA 是一个好东西,有着自己独特的黑魔法。但是由于目前接触甚少,不知道该如何开启。所以想通过从无到有的过程,逐渐的去认识它,搞清楚它与Mybatis的关系,如果站在架构的角度看会怎么怎么样的情况。在这个过程中,会使用文字的方式将过程记录下来,也算是一点经历。

2、Spring Data JPA 介绍

From spring.io:Spring Data JPA是Spring Data系列的一个组成部分,可以轻松快捷的实现数据访问层的增强支持,这使得基于Spring且使用了数据库访问技术的应用程序更加容易构建。Spring Data JPA 内置了简单数据库读写操作,包括分页查询,并提供接口以待增强。

Spring Data JPA 是基于Hibernate(在3.2版本中便对JPA提供了完全的支持)、JPA规范的基础上封装的一套ORM框架,可以说就是JPA规范的一个实践落地的产品。Spring Data JPA的内置实现中提供了包括增删改查、分页、自定义SQL的常用功能,且提供接口以待拓展增强。基于Spring Data JPA可以简洁的代码,快速的实现对数据库的访问。

3、使用示例

环境说明:

  • windows 10 专业版
  • IntelliJ IDEA 2019.3.1
  • JDK 1.8
  • maven 3.6.1
  • Spring Boot 2.2.5.RELEASE

3.1、引入依赖

 <dependency>??? 
    <groupId>org.springframework.boot</groupId>??? 
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- 我这里使用mysql作为数据存储 -->
<dependency>??? 
    <groupId>mysql</groupId>??? 
    <artifactId>mysql-connector-java</artifactId>??? 
    <scope>runtime</scope>
</dependency>

<dependency>??? 
    <groupId>org.projectlombok</groupId>??? 
    <artifactId>lombok</artifactId>??? 
    <optional>true</optional>
</dependency>

3.2、定义一个简单实体

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

/** 
  * @author zhoujian 
  */ 
  
@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;??? 
   }??? 
   
   public Long getId() { return id; }??? 
   
   public void setId(Long id) { his.id = id;?}??? 
   
   public String getFirstName() {?return firstName;?}??? 
   
   public String getLastName() {?return lastName;?}??? 
   
   @Override??? 
   public String toString() {??????? 
       return String.format("Customer[id=%d, firstName=‘%s‘, lastName=‘%s‘]", id, firstName, lastName);?
   }
}

3.3、创建查询接口


import org.springframework.data.repository.CrudRepository;

import java.util.List;
/** 
  * {@link Customer}实体的仓库接口 
  * @author zhoujian 
  */
public interface CustomerRepository extends CrudRepository<Customer, Long> {??? 

   /**???? 
     * 根据{@link Customer#lastName}查询数据???? 
     * @param lastName {@link Customer}的属性???? 
     * @return customer list???? 
     */??? 
  List<Customer> findByLastName(String lastName);}

3.4、简单测试

这里只是方便测试,所以直接使用了 CommandLineRunner 进行业务测试,在这里也直接与 Repository 层耦合,也不是通过单元测试,并不推荐这样的做法。

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;

/** 
  * @author zhoujian 
  */
@SpringBootApplication
public class ForTestOrmApplication {??? 
  
   public static void main(String[] args) {???????
      SpringApplication.run(ForTestOrmApplication.class, args);???
   }??? 
  
   private static final Logger LOG = LoggerFactory.getLogger(ForTestOrmApplication.class);??? 

   @Bean??? 
   public CommandLineRunner jpaTestRunner(CustomerRepository customerRepository){??????? 
   
       return (args) -> {???????????
   
           // 插入五条 customer 数据??????????? 
           customerRepository.save(new Customer("Jack", "Liu"));??????????? 
           customerRepository.save(new Customer("Mary", "Liu"));??????????? 
           customerRepository.save(new Customer("Bob", "Huang"));??????????? 
           customerRepository.save(new Customer("Jim", "Chen"));??????????? 
           customerRepository.save(new Customer("David", "Gao"));???????????

           // 获取所有的 customer 数据??????????? 
           LOG.info("pull all customers with findAll():");??????????? 
           LOG.info("---------------------------------");??????????? 
           customerRepository.findAll().forEach(
               customer -> LOG.info("Customer is : {}", customer.toString())
           );??????????? 
   
           // 获取所有的 customer 数据??????????? 
           LOG.info("pull all customers with findByLastName():");??????????? 
           LOG.info("---------------------------------");???????????
   
           customerRepository.findByLastName("Liu").forEach(
               customer -> LOG.info("Customer is : {}", customer.toString())
           );??????? 
       };??? 
   }
}

测试期望如下:

2020-04-20 08:50:01.195  INFO 12016 --- [           main] c.j.for_test_orm.ForTestOrmApplication   : pull all customers with findAll():
2020-04-20 08:50:01.195  INFO 12016 --- [           main] c.j.for_test_orm.ForTestOrmApplication   : ---------------------------------
Hibernate: select customer0_.id as id1_0_, customer0_.first_name as first_na2_0_, customer0_.last_name as last_nam3_0_ from customer customer0_
2020-04-20 08:50:01.293  INFO 12016 --- [           main] c.j.for_test_orm.ForTestOrmApplication   : Customer is : Customer[id=1, firstName=‘Jack‘, lastName=‘Liu‘]
2020-04-20 08:50:01.293  INFO 12016 --- [           main] c.j.for_test_orm.ForTestOrmApplication   : Customer is : Customer[id=2, firstName=‘Mary‘, lastName=‘Liu‘]
2020-04-20 08:50:01.293  INFO 12016 --- [           main] c.j.for_test_orm.ForTestOrmApplication   : Customer is : Customer[id=3, firstName=‘Bob‘, lastName=‘Huang‘]
2020-04-20 08:50:01.293  INFO 12016 --- [           main] c.j.for_test_orm.ForTestOrmApplication   : Customer is : Customer[id=4, firstName=‘Jim‘, lastName=‘Chen‘]
2020-04-20 08:50:01.293  INFO 12016 --- [           main] c.j.for_test_orm.ForTestOrmApplication   : Customer is : Customer[id=5, firstName=‘David‘, lastName=‘Gao‘]
2020-04-20 08:50:01.293  INFO 12016 --- [           main] c.j.for_test_orm.ForTestOrmApplication   : pull all customers with findByLastName():
2020-04-20 08:50:01.293  INFO 12016 --- [           main] c.j.for_test_orm.ForTestOrmApplication   : ---------------------------------
Hibernate: select customer0_.id as id1_0_, customer0_.first_name as first_na2_0_, customer0_.last_name as last_nam3_0_ from customer customer0_ where customer0_.last_name=?
2020-04-20 08:50:01.311  INFO 12016 --- [           main] c.j.for_test_orm.ForTestOrmApplication   : Customer is : Customer[id=1, firstName=‘Jack‘, lastName=‘Liu‘]
2020-04-20 08:50:01.312  INFO 12016 --- [           main] c.j.for_test_orm.ForTestOrmApplication   : Customer is : Customer[id=2, firstName=‘Mary‘, lastName=‘Liu‘]

参考:guides/accessing-data-jpa

Spring Data Jpa(一)使用入门

原文:https://www.cnblogs.com/threadj/p/13301795.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!