1. 程式人生 > >JPA註解專案開發總結

JPA註解專案開發總結

1.jpa開發,只要dao層繼承JpaRepository介面,xml檔案配置jpa註解驅動,spring會自動把實現此介面的類註冊為一個bean物件。

2.使用者下線,清除session,由於session中也可能存在其它物件,所以直接使用invalidate方法使用session失效

3.註解開發的時候,攔截器返回login方法,必須要配置全域性結果集。
4.返回json結果集時,有自定義攔截器,package要繼承json-default,在action中使用自定義的名字,因為要使用包中自定義的攔截器功能。
5.jpa屬性查詢需要符合一定的規則(findby方法)。query註解查詢可以自定義查詢語句,但是必須要加上modifying註解,因為實現類預設是隻讀的。

6.JpaRepository介面底層真正的實現類是SimpleJpaRepository,預設是隻讀。只需要在service層開啟註解@Transactional即可。

底層原理:

@Transactional(readOnly = true)

public class SimpleJpaRepository<T, ID extends Serializable> implements JpaRepository<T, ID>

7.如果修改單個屬性比如使用者密碼或者使用者名稱,有兩種方法。
①快照更新:快照更新先查詢變成持久態,然後設定屬性

②query註解查詢:實現JpaRepository介面,在方法上增加查詢語句(即更新語句),語句可以使用jpa佔位符(1,2等,注意引數的順序)

Query註解編寫語句,其引數是JPQL語句。(類似與Hibernate的HQL或SQL)。

8.web層action註解:

①交給spring管理:註冊為bean物件 @Controller(名稱)

        ②繼承包名@ParentPackage("自定義包名) 

③名稱空間@Namespace("/") 

④多例@Scope("prototype")

9.在oracle中null的值會引發一些不必要的問題儘量避免。專案中的狀態值可以直接在實體類設定初始化值(0或者1)


10.web層開發步驟(這些步驟是死的):
①接收引數(模型驅動或者屬性驅動來封裝,所以只剩下兩步)
②呼叫業務層處理業務(呼叫service層處理,封裝資料...)
③響應頁面(返回結果集)

11.ctrl+t或者F4快速檢視繼承關係,提高開發效率

12.jpa註解分頁:直接呼叫底層的public Page<T> findAll(Pageable pageable) 方法,只需要在action中傳入介面實現類即可。

Pageable pageable=new PageRequest(page-1, rows);

注意jpa中的page是從0開始的,page指的是當前頁,rows指的是每頁顯示的最大記錄數,PageRequest是實現類。

只需要接收頁面的兩個引數即可,一個是當前頁,一個是每頁顯示的最大數。


getTotalElements()方法:獲取總的記錄數
List<T> getContent()方法:獲取當前頁的資料列表。

分頁都需要查詢兩次,一次是總記錄數,一次是結果集。只不過底層封裝了,所以只需要查詢一次即可。

13.返回json結果集方法:
①業務處理
②封裝json資料
③壓入棧頂
④響應頁面

每個json物件就是一條記錄。

14.jpa的save方法有儲存和修改的方法。如果有id的話,就查詢資料,沒有id那麼就新增資料。(id很重要,當後臺沒有id的時候需要自己手動加上隱藏域,這個可以通過debug和fireBug進行除錯)

15.js拼接字串進行批量修改:
var arry=new Array();
//row是一個字串陣列
$(rows).each(function(){
//push方法是 向陣列的末尾新增一個或更多元素
arry.push(this.id);
})
//join方法是把陣列轉換成一個字串
var ids=arry.join();

16.獲取頁面引數方法

①屬性驅動獲取,設定set方法

②傳統方式:servletActionContext.getRequest.getParameter("引數")獲取

17.懶載入的問題解決方法:在不需要查詢的實體類的get方法上加上註解@JSON(serialize=false)進行排除或者在xml中配置OpenSessionInView。(存在效率問題)

OpenSessionInView機制:讓會話在請求結束之後關閉,延遲了session關閉,需要在web.xml中配置。

在request過程中維持session。延遲session的關閉,直到request結束,再自動關閉session,也就是說,直到表現層的資料全部載入完畢,再關閉Session。
注意(副作用): 如果沒有被事務管理的方法, OpenSessionInViewFilter 會將這些方法的事務變為 readOnly 的 !
如果要做新增功能,按道理它是可寫的方法,但是這裡只會readOnly只讀的。

18.jquery的form表單沒有reset方法,需要呼叫Form表單的reset( )方法,$("#表單id").get(0).reset();

19.Oracle語句優化:

1.儘量避免使用*號,*號是全欄位掃描,查詢效率低。
SQL優化:(where條件特別多的情況下,就有效果了)
對於and,應該儘量把假的放到右邊。
對於or,應該儘量把真的放到右邊。
SELECT COUNT(1) FROM xxx;
統計的是字元是1的這一列,效率高(原因,這一列只有一個字元,運算的時候,資料流很小,而且是固定列)

20.專案優化:
①action的常量:可以直接優化為SUCCESS,LOGIN等,因為字串會在常量池中佔用,並不會銷燬。比如json的常量可以抽取到BaseAction中自定義常量來使用。

②公共程式碼直接抽取