springboot之jpa详解
1.jpa介绍
(1)jpa(java persistence Api) 是sun官方提出的java持久化规范,作为开发人员提供的一种对象/关联映射工具来管理java应用中的关系数据
(2)简化现有持久化开发工作和整合ORM技术
2.使用
2.1 spring data默认基础实现,即预先生成方法
继承JpaRepository
public interface UserRepository extends JpaRepository<User, Long> {
}
使用预先生成默认方法
@Test
public void testBaseQuery() throws Exception {
User user=new User();
userRepository.findAll();
userRepository.findOne(1l);
userRepository.save(user);
userRepository.delete(user);
userRepository.count();
userRepository.exists(1l);
// ...
}
2.2 根据查询方法自动解析成sql
(1)自定义的简单查询是根据方法名来自动生成SQL,主要的语法是findPersonByxxx,readAllBy,queryXXBy,countXXBy, getXXBy后面跟属性名称
语法还是比较丰富的…
User findUserByUserName(String userName);
(2) 也可以加一些关键字 and or
User findByUserNameOrEmail(String username, String email);
(3) 修改、删除、统计也是类似语法
Long deleteById(Long id);
Long countByUserName(String userName)
(4) 基本上 SQL 体系中的关键词都可以使用,例如: LIKE 、 IgnoreCase、 OrderBy
List<User> findByEmailLike(String email);
User findByUserNameIgnoreCase(String userName);
List<User> findByUserNameOrderByEmailDesc(String email);
3. 复杂查询
在实际的应用中,经常需要用到分页、筛选、多表连接查询等
3.1 分页查询
在spring boot的jpa中已经实现了分页的功能,在查询的方法中,需要传入参数pageable,当查询中有多个参数时,建议pageable作为最后一个参数
//分页查询,page参数指定查询哪一页
@RequestMapping("/find3/{page}")
public List<Person> find3(@PathVariable("page") int page){
Pageable pageable = PageRequest.of(page,2, Sort.Direction.DESC, "id");
return personRepository.findAll(pageable).getContent();
}
3.2 自定义sql:@Query
在 SQL 的查询方法上面使用@Query注解,如涉及到删除和修改在需要加上@Modifying,也可以根据需要添加 @Transactional对事物的支持,查询超时的设置等
@Modifying
@Query("update User u set u.userName = ?1 where u.id = ?2")
int modifyByIdAndUserId(String userName, Long id);
@Transactional
@Modifying
@Query("delete from User where id = ?1")
void deleteByUserId(Long id);
@Transactional(timeout = 10)
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);