1. 程式人生 > >Spring Data JPA(1)--Repository和CrudRepository介面

Spring Data JPA(1)--Repository和CrudRepository介面

最近在學習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");
	}
}