Spring Data JPA(1)--Repository和CrudRepository介面
阿新 • • 發佈:2019-02-01
最近在學習Spring Data JPA的相關知識,感覺還是很不錯的,提供了很多方法,包括CRUD和分頁排序,基本能夠滿足現實的功能需求.
它一共提供了四個介面:
Repository: 僅僅是一個標識,表明任何繼承它的均為倉庫介面類,方便Spring自動掃描識別
CrudRepository: 繼承Repository,實現了一組CRUD相關的方法
PagingAndSortingRepository: 繼承CrudRepository,實現了一組分頁排序相關的方法
JpaRepository: 繼承PagingAndSortingRepository,實現一組JPA規範相關的方法
JpaSpecificationExecutor: 比較特殊,不屬於Repository體系,實現一組JPA Criteria查詢相關的方法
我寫的例項:
/* * @RepositoryDefinition(domainClass = User.class,idClass = Integer.class)//使用該註解可以替代extends Repository */ public interface UserRepository extends CrudRepository<User, Integer>{ /* * Repository介面,他是一個空介面,僅僅是一個標識 */ //hql操作的是物件,而sql操作的是表,所以這裡的User指的是類 //可以直接使用Repository提供的一些方法,但是必須方法的命名要遵守一定的規則,例如findByXx,findByXxLike,findByXxStartingWith... public User findByUname(String uname); //使用@Query註解來解決定義規則的麻煩和實現複雜查詢,工作中用的比較多 @Query("select o from User o") public List<User> showUsers(); @Query("select o from User o where o.uno = ?1 and o.uname = ?2") public User findUser(int uno,String uname); //配合@Modifying註解和事務,可以完成更新和刪除的操作,jpql不支援增加的操作 @Modifying @Query("delete from User where uno=:uno") public void delUser(@Param("uno")int uno); @Modifying @Query("update User o set o.uname = :uname where uno = :uno") public void updUser(@Param("uno")int uno,@Param("uname")String uname); /* * CrudRepository介面繼承Repository,提供了一組CRUD相關的方法,直接在測試類中測試findOne方法 */ }
CrudRepository介面 原始碼所提供的方法:
<S extends T> S save(S entity); <S extends T> Iterable<S> save(Iterable<S> entities); T findOne(ID id); boolean exists(ID id); Iterable<T> findAll(); Iterable<T> findAll(Iterable<ID> ids); long count(); void delete(ID id); void delete(T entity); void delete(Iterable<? extends T> entities); void deleteAll();
以findOne()方法為例,在單元測試中進行測試
public class UserRepositoryTest {
private ApplicationContext ctx = null;
private UserRepository userRepository = null;
@Before
public void setUp(){
ctx = new ClassPathXmlApplicationContext("beans.xml");
userRepository = ctx.getBean(UserRepository.class);
System.out.println("setup");
}
@After
public void tearDown(){
ctx = null;
System.out.println("teardown");
}
@Test
public void testQuery3(){
System.out.println("start");
User user = userRepository.findOne(1);
System.out.println(user.toString());
System.out.println("started");
}
}