更新操纵也要通过 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 连表查询和分页 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|