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 动态查询