Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate,TopLink,JDO 等 ORM 框架各自为营的局面。
值得注意的是,Jpa是在充分吸收了现有 Hibernate,TopLink,JDO 等 ORM 框架的基础上发展而来的,具有易于使用,伸缩性强等优点。从目前的开发社区的反应上看,Jpa 受到了极大的支持和赞扬,其中就包括了 Spring 与 EJB3. 0的开发团队。
注意:Jpa 是一套规范,不是一套产品,那么像 Hibernate,TopLink,JDO 他们是一套产品,如果说这些产品实现了这个 Jpa 规范,那么我们就可以叫他们为 Jpa 的实现产品。
Spring Boot Jpa
Spring Boot Jpa 是 Spring 基于 ORM 框架、Jpa 规范的基础上封装的一套 Jpa 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data Jpa 可以极大提高开发效率!
Spring Boot Jpa 让我们解脱了 DAO 层的操作,基本上所有 CRUD 都可以依赖于它来实现
基本查询
基本查询分为两种,一是SpringData默认已经实现了的。第二种是根据方法自动解析查询sql
默认生成一般简单的查询sql
public interface UserRepository extends JpaRepository<User, Long> {}
//简单查询
@Test
public void testBaseQuery() throws Exception {
User User=new User();
//查询所有用户
UserRepository.findAll();
//根据id查询用户
UserRepository.findOne(1l);
//新增用户(id存在,进行修改动作,id不存在,进行新增操作)
UserRepository.save(User);
//删除用户
UserRepository.delete(User);
}//自定义简单查询
自定义的简单查询就是根据方法名来自动生成 SQL,主要的语法是findXXBy,readAXXBy,queryXXBy,countXXBy, getXXBy后面跟属性名称:
例如
User findByUserName(String userName); //select * from User where userName = ?1
And关键字
User findByUserNameAndEmail(String userName,String email);//select * from User where userName = ?1 and email = ? 2
Or关键字
User findByUserNameOrEmail(String userName,String email);//select * from User where userName = ?1 or email = ? 2
Sql其他查询关键字可以使用 例如:Like ,IgnoreCase,OrderBy
Like
List<User> findByEmailLike(String email); //select * from User where email like ?1
IgnoreCase
User findByUserNameIgnoreCase(String userName);//select * from User where upper(userName) = upper(?1)
Desc
List<User> findByUserNameOrderByEmailDesc(String email);//select * from User where userName = ?1 order by email desc
复杂查询
在实际的开发中我们需要用到分页、删选、连表等查询的时候就需要特殊的方法或者自定义 SQL
分页查询
分页查询在实际使用中非常普遍了,Spring Boot Jpa 已经帮我们实现了分页的功能,在查询的方法中,需要传入参数Pageable ,当查询中有多个参数的时候Pageable建议做为最后一个参数传入.
Page<User> findALL(Pageable pageable);
Page<User> findByUserName(String userName,Pageable pageable);
Pageable 是 Spring 封装的分页实现类,使用的时候需要传入页数、每页条数和排序规则
@Test
public void testPageQuery() throws Exception {
int page=1,size=20;
Sort sort = new Sort(Direction.DESC, "userName");
Pageable pageable = new PageRequest(page, size, sort);
UserRepository.findALL(pageable);
UserRepository.findByUserName("张三", pageable);
}
自定义SQL查询
其实 Spring Data 觉大部分的 SQL 都可以根据方法名定义的方式来实现,但是由于某些原因我们想使用自定义的 SQL 来查询,Spring Data 也是完美支持的;在 SQL 的查询方法上面使用@Query注解,如涉及到删除和修改在需要加上@Modifying.也可以根据需要添加 @Transactional对事物的支持,查询超时的设置等
@Modifying
@Query("update User set userName = ?1 where id = ?2")
User updateUserById(String userName,Long id);
下一章 springboot data 动态查询