加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

一文搞懂如安在Spring Boot正确中行使JPA

发布时间:2019-10-19 14:13:27 所属栏目:建站 来源:SnailClimb
导读:JPA 这部门内容上手很轻易,可是涉及到的对象照旧挺多的,网上大部门关于 JPA 的资料都不是出格一切,大部门用的版本也是较量落伍的。其它,我下面讲到了的内容也不行能涵盖全部 JPA 相干内容,我只是把本身认为较量重要的常识点总结在了下面。许多处所我

更新操纵也要通过 save()要领来实现,好比:

  1. Person person = new Person("SnailClimb", 23); 
  2.     Person savedPerson = personRepository.save(person); 
  3.     // 更新 person 工具的姓名 
  4.     savedPerson.setName("UpdatedName"); 
  5.     personRepository.save(savedPerson); 

在这里 save()要领相等于 sql 语句:update person set name="UpdatedName" where id=id

2) 带前提的查询

下面这些要领是我们按照 JPA 提供的语法自界说的,你必要将下面这些要领写到 PersonRepository 中。

若是我们想要按照 Name 来查找 Person ,你可以这样:

  1. Optional<Person> findByName(String name); 

假如你想要找到年数大于某个值的人,你可以这样:

  1. List<Person> findByAgeGreaterThan(int age); 

4.2 自界说 SQL 语句拭魅战

许多时辰我们自界说 sql 语句会很是有效。

按照 name 来查找 Person:

  1. @Query("select p from Person p where p.name = :name") 
  2.     Optional<Person> findByNameCustomeQuery(@Param("name") String name); 

Person 部门属性查询,停止 select *操纵:

  1. @Query("select p.name from Person p where p.id = :id") 
  2.     String findPersonNameById(@Param("id") Long id); 

按照 id 更新Person name:

  1. @Modifying 
  2.     @Transactional 
  3.     @Query("update Person p set p.name = ?1 where p.id = ?2") 
  4.     void updatePersonNameById(String name, Long id); 

4.3 建设异步要领

假如我们必要建设异步要领的话,也较量利便。

异步要领在挪用时当即返回,然后会被提交给TaskExecutor执行。虽然你也可以选择得出功效后才返回给客户端。假如对 Spring Boot 异步编程感乐趣的话可以看这篇文章:《新手也能看懂的 SpringBoot 异步编程指南》 。

  1. @Async 
  2. Future<User> findByName(String name); 
  3.  
  4. @Async 
  5. CompletableFuture<User> findByName(String name); 

5.测试类和源代码地点

测试类:

  1. @SpringBootTest 
  2. @RunWith(SpringRunner.class) 
  3. public class PersonRepositoryTest { 
  4.     @Autowired 
  5.     private PersonRepository personRepository; 
  6.     private Long id; 
  7.  
  8.     /** 
  9.      * 生涯person到数据库 
  10.      */ 
  11.     @Before 
  12.     public void setUp() { 
  13.         assertNotNull(personRepository); 
  14.         Person person = new Person("SnailClimb", 23); 
  15.         Person savedPerson = personRepository.saveAndFlush(person);// 更新 person 工具的姓名 
  16.         savedPerson.setName("UpdatedName"); 
  17.         personRepository.save(savedPerson); 
  18.  
  19.         id = savedPerson.getId(); 
  20.     } 
  21.  
  22.     /** 
  23.      * 行使 JPA 自带的要领查找 person 
  24.      */ 
  25.     @Test 
  26.     public void should_get_person() { 
  27.         Optional<Person> personOptional = personRepository.findById(id); 
  28.         assertTrue(personOptional.isPresent()); 
  29.         assertEquals("SnailClimb", personOptional.get().getName()); 
  30.         assertEquals(Integer.valueOf(23), personOptional.get().getAge()); 
  31.  
  32.         List<Person> personList = personRepository.findByAgeGreaterThan(18); 
  33.         assertEquals(1, personList.size()); 
  34.         // 清空数据库 
  35.         personRepository.deleteAll(); 
  36.     } 
  37.  
  38.     /** 
  39.      * 自界说 query sql 查询语句查找 person 
  40.      */ 
  41.  
  42.     @Test 
  43.     public void should_get_person_use_custom_query() { 
  44.         // 查找全部字段 
  45.         Optional<Person> personOptional = personRepository.findByNameCustomeQuery("SnailClimb"); 
  46.         assertTrue(personOptional.isPresent()); 
  47.         assertEquals(Integer.valueOf(23), personOptional.get().getAge()); 
  48.         // 查找部门字段 
  49.         String personName = personRepository.findPersonNameById(id); 
  50.         assertEquals("SnailClimb", personName); 
  51.         System.out.println(id); 
  52.         // 更新 
  53.         personRepository.updatePersonNameById("UpdatedName", id); 
  54.         Optional<Person> updatedName = personRepository.findByNameCustomeQuery("UpdatedName"); 
  55.         assertTrue(updatedName.isPresent()); 
  56.         // 清空数据库 
  57.         personRepository.deleteAll(); 
  58.     } 
  59.  

源代码地点:https://github.com/Snailclimb/springboot-guide/tree/master/source-code/basis/jpa-demo

6. 总结

本文首要先容了 JPA 的根基用法:

行使 JPA 自带的要领举办增编削查以及前提查询。

自界说 SQL 语句举办查询可能更新数据库。

建设异步的要领。

在下一篇关于 JPA 的文章中我会先容到很是重要的两个常识点:

基天职页成果实现

多表连系查询以及多表连系查询下的分页成果实现。

二 JPA 连表查询和分页

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读