Spring Data JPA(2)

1 Spring Data JPA概述

Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展。

2 JPA、Spring Data JPA、Hibernate之间的关系

JPA是一套规范,内部是有接口和抽象类组成的。Hibernate是一套成熟的ORM框架,而且Hibernate实现了JPA规范,所以也可以称hibernate为JPA的一种实现方式,我们使用JPA的API编程,意味着站在更高的角度上看待问题(面向接口编程);Spring Data JPA是Spring提供的一套对JPA操作更加高级的封装,是在JPA规范下的专门用来进行数据持久化的解决方案。

JPA是一套规范,Hibernate是一套成熟的ORM框架,实现了JPA规范

Spring Data JPA是spring 提供的对JPA操作的更加高级的封装,实际工作的仍然是实现JPA规范的ORM框架

实际开发中,推荐使用Spring Data JPA + ORM(如:hibernate)完成操作,这样在切换不同的ORM框架时提供了极大的方便,同时也使数据库层操作更加简单,方便解耦。

3 Spring Data JPA入门案例

3.1 搭建开发环境

3.1.1 添加Spring Data JPA依赖

pom.xml增加相关依赖jar包坐标


        5.2.1.RELEASE
        5.4.10.Final
        1.6.6
        1.2.12
        0.9.1.2
        5.1.6
    

    
        
        
            junit
            junit
            4.12
            test
        

        
        
            org.aspectj
            aspectjweaver
            1.6.8
        

        
            org.springframework
            spring-aop
            ${spring.version}
        

        
            org.springframework
            spring-context
            ${spring.version}
        

        
            org.springframework
            spring-context-support
            ${spring.version}
        

        
            org.springframework
            spring-orm
            ${spring.version}
        

        
            org.springframework
            spring-beans
            ${spring.version}
        

        
            org.springframework
            spring-core
            ${spring.version}
        

        

        
        
            org.hibernate
            hibernate-core
            ${hibernate.version}
        
        
            org.hibernate
            hibernate-entitymanager
            ${hibernate.version}
        
        
            org.hibernate
            hibernate-validator
            5.2.1.Final
        
        

        
        
            c3p0
            c3p0
            ${c3p0.version}
        
        

        
        
            log4j
            log4j
            ${log4j.version}
        

        
            org.slf4j
            slf4j-api
            ${slf4j.version}
        

        
            org.slf4j
            slf4j-log4j12
            ${slf4j.version}
        
        


        
            mysql
            mysql-connector-java
            ${mysql.version}
        

        
            org.springframework.data
            spring-data-jpa
            1.9.0.RELEASE
        

        
            org.springframework
            spring-test
            ${spring.version}
        

        
        
            javax.el
            javax.el-api
            2.2.4
        

        
            org.glassfish.web
            javax.el
            2.2.4
        
        
    

3.1.2 整合Spring Data JPA和Spring

类路径下,创建applicationContext.xml文件,整合Spring Data JPA和Spring




    
    
        
        
        
        
    

    
    
        
        
        
        
        
            
        
        
        
            
                
                
                
                
                
                
                
                
            
        
        
        
            
        
    


    
    
    
        
    

    
    
    

    
    
        
            
            
            
            
            
            
            
        
    

    
    
        
        
    

    
    

    



3.1.3 使用JPA注解配置映射关系

在实体类对象中,使用@Entity和@Table注解配置映射关系

3.2 使用Spring Data JPA

3.2.1 编写符合Spring Data JPA规范的dao接口

在Spring Data JPA中,对于定义符合规范的Dao层接口,需要遵循以下几点:

  1. 创建一个Dao层接口,并实现JpaRepository和JpaSpecificationExecutor
  2. 提供相应的泛型

JpaRepository<实体类类型,主键类型>:用来完成基本CRUD操作
JpaSpecificationExecutor<实体类类型>:用于复杂查询(分页等查询操作)

3.2.1 实现CRUD操作

通过编写测试类,实现CRUD

  1. findOne:根据ID查询(立即加载)
  2. save:保存或者更新,如果传递的对象存在主键ID,则进行更新;如果没有主键ID则进行保存
  3. delete:删除
  4. findAll:查询所有
  5. count:统计总条数
  6. exists:判断用户是否存在
  7. getOne:根据ID查询(通过em.getReference实现延迟加载)

4 Spring Data JPA的原理

对于我们自定义的Dao接口,由于继承了JpaRepository和JpaSpecificationExecutor,所以即使我们在接口中一个方法都没写也可以使用这两个接口的所有方法

4.1 Spring Data JPA实现过程

  • 通过对测试类中方法的断点调试,可以发现注入的userDao对象,本质上是通过JdkDynamicAopProxy生成的一个代理对象
  • 当程序执行时,会通过JdkDynamicAopProxy的invoke方法,对userDao对象生成动态代理对象SimpleJpaRepository
  • 通过SimpleJpaRepository的源码,它实现了JpaRepository和JpaSpecificationExecutor接口,找到对应的findOne方法,返回em.find();也就是通过EntityManager对象进行查找


    Spring Data JPA调用过程

5 Spring Data JPA的查询方式

5.1 使用Spring Data JPA中接口定义的方法查询

通过JpaRepository继承的方法列表:
JpaRepository方法列表

通过JpaSpecificationExecutor继承方法列表:
JpaSpecificationExecutor方法列表

5.2 使用JPQL的方式查询

使用@Query注解,结合jpql语句方式实现查询
如需进行更新,可以使用@Modifying注解
如:

    @Query(value="from User where id = ?1")
    public User findJpql(Integer id);

    @Query("from User where id = ?1 and username = ?2")
    public User findIdAndName(Integer id, String username);

    @Query("update User set username = ?2 where id = ?1")
    @Modifying
    public void updateUser(Integer id, String username);

注意:

  1. jpql语句存在参数时,需要给参数指定方法中参数的索引,从1开始
  2. 更新方法在使用时,需要增加事务支持,即@Transactional,否则提示no Session异常;同时增加@Rollback(false)注解支持,取消默认回滚

5.3 使用SQL语句查询

使用SQL语句查询同样是使用@Query注解,属性nativeQuery设置为true,即使用sql语句进行查询
如:

    @Query(value = "select * from User where username = ?", nativeQuery = true)
    public List findSql(String username);

5.4 使用方法命名规则查询

方法名的约定:

  1. findBy:查询
  2. 对象中的属性名(首字母大写): 查询的条件

查询方式:Like、IsNull等,默认使用等于的方式查询
多条件查询:findBy + 属性名 + “查询方式” + “多条件的连接符(And|Or)” + 属性名 + “查询方式”

如:

    public User findById(Integer id);

    public List findByUsername(String username);

    public List findByUsernameLikeAndSex(String username, String sex);

你可能感兴趣的:(Spring Data JPA(2))