美文网首页
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