| 
                         更新操作也要通过 save()方法来实现,比如: 
- Person person = new Person("SnailClimb", 23); 
 -     Person savedPerson = personRepository.save(person); 
 -     // 更新 person 对象的姓名 
 -     savedPerson.setName("UpdatedName"); 
 -     personRepository.save(savedPerson); 
 
  
在这里 save()方法相当于 sql 语句:update person set name="UpdatedName" where id=id 
2) 带条件的查询 
下面这些方法是我们根据 JPA 提供的语法自定义的,你需要将下面这些方法写到 PersonRepository 中。 
假如我们想要根据 Name 来查找 Person ,你可以这样: 
- Optional<Person> findByName(String name); 
 
  
如果你想要找到年龄大于某个值的人,你可以这样: 
- List<Person> findByAgeGreaterThan(int age); 
 
  
4.2 自定义 SQL 语句实战 
很多时候我们自定义 sql 语句会非常有用。 
根据 name 来查找 Person: 
- @Query("select p from Person p where p.name = :name") 
 -     Optional<Person> findByNameCustomeQuery(@Param("name") String name); 
 
  
Person 部分属性查询,避免 select *操作: 
- @Query("select p.name from Person p where p.id = :id") 
 -     String findPersonNameById(@Param("id") Long id); 
 
  
根据 id 更新Person name: 
- @Modifying 
 -     @Transactional 
 -     @Query("update Person p set p.name = ?1 where p.id = ?2") 
 -     void updatePersonNameById(String name, Long id); 
 
  
4.3 创建异步方法 
如果我们需要创建异步方法的话,也比较方便。 
异步方法在调用时立即返回,然后会被提交给TaskExecutor执行。当然你也可以选择得出结果后才返回给客户端。如果对 Spring Boot  异步编程感兴趣的话可以看这篇文章:《新手也能看懂的 SpringBoot 异步编程指南》 。 
- @Async 
 - Future<User> findByName(String name); 
 -  
 - @Async 
 - CompletableFuture<User> findByName(String name); 
 
  
5.测试类和源代码地址 
测试类: 
- @SpringBootTest 
 - @RunWith(SpringRunner.class) 
 - public class PersonRepositoryTest { 
 -     @Autowired 
 -     private PersonRepository personRepository; 
 -     private Long id; 
 -  
 -     /** 
 -      * 保存person到数据库 
 -      */ 
 -     @Before 
 -     public void setUp() { 
 -         assertNotNull(personRepository); 
 -         Person person = new Person("SnailClimb", 23); 
 -         Person savedPerson = personRepository.saveAndFlush(person);// 更新 person 对象的姓名 
 -         savedPerson.setName("UpdatedName"); 
 -         personRepository.save(savedPerson); 
 -  
 -         id = savedPerson.getId(); 
 -     } 
 -  
 -     /** 
 -      * 使用 JPA 自带的方法查找 person 
 -      */ 
 -     @Test 
 -     public void should_get_person() { 
 -         Optional<Person> personOptional = personRepository.findById(id); 
 -         assertTrue(personOptional.isPresent()); 
 -         assertEquals("SnailClimb", personOptional.get().getName()); 
 -         assertEquals(Integer.valueOf(23), personOptional.get().getAge()); 
 -  
 -         List<Person> personList = personRepository.findByAgeGreaterThan(18); 
 -         assertEquals(1, personList.size()); 
 -         // 清空数据库 
 -         personRepository.deleteAll(); 
 -     } 
 -  
 -     /** 
 -      * 自定义 query sql 查询语句查找 person 
 -      */ 
 -  
 -     @Test 
 -     public void should_get_person_use_custom_query() { 
 -         // 查找所有字段 
 -         Optional<Person> personOptional = personRepository.findByNameCustomeQuery("SnailClimb"); 
 -         assertTrue(personOptional.isPresent()); 
 -         assertEquals(Integer.valueOf(23), personOptional.get().getAge()); 
 -         // 查找部分字段 
 -         String personName = personRepository.findPersonNameById(id); 
 -         assertEquals("SnailClimb", personName); 
 -         System.out.println(id); 
 -         // 更新 
 -         personRepository.updatePersonNameById("UpdatedName", id); 
 -         Optional<Person> updatedName = personRepository.findByNameCustomeQuery("UpdatedName"); 
 -         assertTrue(updatedName.isPresent()); 
 -         // 清空数据库 
 -         personRepository.deleteAll(); 
 -     } 
 -  
 - } 
 
  
源代码地址:https://github.com/Snailclimb/springboot-guide/tree/master/source-code/basis/jpa-demo 
6. 总结 
本文主要介绍了 JPA 的基本用法: 
使用 JPA 自带的方法进行增删改查以及条件查询。 
自定义 SQL 语句进行查询或者更新数据库。 
创建异步的方法。 
在下一篇关于 JPA 的文章中我会介绍到非常重要的两个知识点: 
基本分页功能实现 
多表联合查询以及多表联合查询下的分页功能实现。 
二 JPA 连表查询和分页                         (编辑:52站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |