美文网首页
Spring Data JPA 简介

Spring Data JPA 简介

作者: Huld多 | 来源:发表于2019-03-21 23:29 被阅读0次

    什么是Spring Data JPA?

    Spring Data JPA是Spring Data系列中的重要一员,他帮助我们能够更简单的实现基于JPA的数据访问。免去写CRUD的痛苦。

    还记得当年写hibernate的CRUD吗?

    public class AppTest {
    
        private static final String PERSISTENCE_UNIT_NAME = "psunit1";
        private static EntityManagerFactory factory;
    
        public static void main(String[] args) {
            factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
            EntityManager em = factory.createEntityManager();
    
            em.getTransaction().begin();
            
            Product product = new Product();
            product.setProductName("JPA 2.1 Book");
            product.setProductDescription("This is the latest book on JPA 2.1");
            product.setStockQty(100.00);
            product.setPrice(95.99);
            em.persist(product);
            em.getTransaction().commit();
            em.close();
            
        }
    }
    

    如果换成JPA呢?

    interface PersonRepository extends CrudRepository<User, Long> {
    
     Person save(Person person);
    }
    

    简单到想哭 (T T)

    只要继承Spring Data JPA的Repository,然后按照Spring Data JPA的要求写方法名,一切都妥妥的了。

    Keyword 例子 sql
    And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
    Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
    Is,Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
    Between findByStartDateBetween … where x.startDate between ?1 and ?2
    LessThan findByAgeLessThan … where x.age < ?1
    LessThanEqual findByAgeLessThanEqual … where x.age <= ?1
    GreaterThan findByAgeGreaterThan … where x.age > ?1
    GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
    After findByStartDateAfter … where x.startDate > ?1
    Before findByStartDateBefore … where x.startDate < ?1
    IsNull findByAgeIsNull … where x.age is null
    IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
    Like findByFirstnameLike … where x.firstname like ?1
    NotLike findByFirstnameNotLike … where x.firstname not like ?1
    StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
    EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
    Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
    OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
    Not findByLastnameNot … where x.lastname <> ?1
    In findByAgeIn(Collection<Age> ages) … where x.age in ?1
    NotIn findByAgeNotIn(Collection<Age> ages) … where x.age not in ?1
    True findByActiveTrue() … where x.active = true
    False findByActiveFalse() … where x.active = false
    IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

    Spring Data JPA除了能够支持方法名的方式,还可以通过加注解的方式来实现。

    • 使用HQL
    public interface UserRepository extends JpaRepository<User, Long> {
    
      @Query("select u from User u where u.emailAddress = ?1")
      User findByEmailAddress(String emailAddress);
    }
    
    • 使用native(SQL)
    public interface UserRepository extends JpaRepository<User, Long> {
    
      @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
        countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
        nativeQuery = true)
      Page<User> findByLastname(String lastname, Pageable pageable);
    }
    

    Transactional

    Spring有自己的事务注解。

    @Transactional(readOnly = true)
    public interface UserRepository extends JpaRepository<User, Long> {
    
      List<User> findByLastname(String lastname);
    
      @Modifying
      @Transactional
      @Query("delete from User u where u.active = false")
      void deleteInactiveUsers();
    }
    

    Transectional 注解主要有4个重要的属性

    • Isolation
    • Propagation
    • Timeout
    • Read-only状态

    相关文章

      网友评论

          本文标题:Spring Data JPA 简介

          本文链接:https://www.haomeiwen.com/subject/ojtkvqtx.html