Org.oproject.framework簡要說明
一、Oproject動態生成DAO接口實現類框架
用途/好處
通過動態字節碼生成技術,我們只需根據預定的規則定義我們的DAO接口,框架將在spring容器加載bean定義時爲我們自動生成DAO接口的實現類,並將實現類注入到spring容器中。省去了我們自己編寫DAO接口實現類的工作,節約時間,提高開發效率。
既然是由框架來生成接口實現類,就必須按框架定義的規則來定義我們的DAO接口。
框架原理簡要說明
在spring 加載時,掃描指定的類路徑的類文件,對每個類文件做如下處理
1、 判斷是否爲接口且接口標註爲 @DynamicIbatisDAO (動態Ibatis DAO接口),
是則進行下面步驟;
2、 從接口的 @DynamicIbatisDAO 註解中獲取指定的用於實現類的bean id,如
在 @DynamicIbatisDAO 中未指定,則從
@Component("constantTypeDAO")註解中獲取。如仍未指定則拋出異常;
3、 從接口的 @DynamicIbatisDAO 註解中獲取sqlMapClientTemplate 的
bean id。如未指定sqlMapClientTemplate 的bean id,拋出異常;
4、 採用ASM動態字節碼生成技術生成DAO接口的實現類;
5、 以指定的bean id 將實現類注入到spring容器中。
框架使用規定
SQL Mapper的要求:
1、 對應的SQL Mapper的 namespace 爲DAO接口的短名去掉DAO三個字符的剩
餘部分。如 com.wzh.dao.UserDAO 則 namespace應爲 User。
2、 SQL Mapper 中的操作語句與DAO接口方法是一一對應的,SQL操作語句以方法名爲id。
3、 分頁查詢中的獲取總記錄數的語句的id 爲方法名+Count。
爲什麼這麼規定?
解釋:框架在自動生成DAO的實現類時,內部代碼是以DAO接口名(去掉DAO三個字符)爲名稱空間,以方法名爲語句id,來獲取對應的語句。
接口申明要求:
1、DAO接口聲明必須定義 @DynamicIbatisDAO 註解,可以通過如下方式指定自動生成的實現類的bean id和sqlMapClientTemplate 的bean id。
@DynamicIbatisDAO(value=”yourBeanId",sqlMapClientTemplate=”sqlMapClientTemplate”)
Value的默認值爲”” ,sqlMapClientTemplate的默認值爲 “sqlMapClientTemplate”。
如果未採用上面的方式指定value值(實現類的bean id),框架默認從如下註解獲取id。
@Component("")
如獲不到id,將拋出異常。
2、必須指定sqlMapClientTemplate 的 bean id(通過@DynamicIbatisDAO),
其默認值爲sqlMapClientTemplate,如果和默認值一致,當然不需再顯式指定。
3、必須爲接口。
接口中方法聲明的要求:
1、 查詢只返回一個對象的方法
方法名要求:以 load、get、select、read開頭,如User getUserById(int id)
方法參數要求:一個參數(查詢條件)
返回值:和SQL Mapper中對應的語句的returnType一致。
說明:實際調用的是SqlMapClientTemplate.queryForObject方法。
2、 查詢返回多個對象的List的方法
方法名要求:以 query 開頭,ForList 結尾,如 ListqueryUserForList(String name)
方法參數要求:一個(查詢條件)或三個參數(第一個爲查詢條件,第二、三個爲
int型的分頁參數:起始行、行數)
返回值:List
說明:其實際調用的是 SqlMapClientTemplate的如下兩個方法。
List queryForList(final String statementName, final Object
parameterObject)
List queryForList(
final String statementName, final ObjectparameterObject, finalint skipResults, finalint maxResults)
3、 分頁查詢
方法名要求:以query開頭,ForPageResult結尾,
如 PageResultqueryUserForPageResult(String name,int startRow,int fetchsize)
方法參數要求:兩個或三個
兩個:int 類型,pageNumber、pageSize。
三個:第一個爲條件參數,後兩個爲pageNumber、pageSize。
返回值:PageResult
說明:其實現爲,先通過SqlMapClientTemplate.queryForObject獲得符合條件的總
記錄行數,計算出起始行,
然後通過SqlMapClientTemplate.queryForList方法獲得對應的記錄。
4、 單個Insert方法
方法名要求:以save、insert、add 開頭,如 intaddUser(User user)
參數要求:一個參數(要寫入的對象)
返回值:
說明:其實現調用的是SqlMapClientTemplate的
Object insert(final String statementName, final ObjectparameterObject)
方法。
5、 批量insert
方法名要求:以batchSave、batchInsert、batchAdd開頭,如 void batchSaveUsers(List userList)
方法參數要求:一個,集合(要批量insert的對象集合)
返回值:void
說明:其實現是調用了 BatchExecuteUtils.batchInsert方法。BatchInsert方法調用SqlMapClientTemplate.execute,通過SqlMapExecutor 的批量方法實現批量寫入。
6、 單個update
方法名要求:以update開頭,如 intupdateUser(User user)
方法參數要求: 一個,要update的對象類型。
返回值:當方法返回值定義爲 int 時將返回操作影響的行數。如爲其他類型將得不到值。
說明:其實現調用的是SqlMapClientTemplate.update(string,Object)方法。
7、 批量update
方法名要求:以batchUpdate開頭,如 void batchUpdateUsers(ListuserList)
方法參數要求:一個,集合(要批量update的對象集合)
返回值:void
說明:其實現是調用了 BatchExecuteUtils.batchUpdate方法。BatchInsert方法調用SqlMapClientTemplate.execute,通過SqlMapExecutor 的批量方法實現批量寫入。
8、 單個delete
方法名要求:以delete、remove、del開頭,如 intdeleteUser(User user)
方法參數要求:一個,要刪除的對象或條件
返回值:當方法返回值定義爲 int 時將返回操作影響的行數。如爲其他類型將得不到值。
說明:其實現調用的是SqlMapClientTemplate.delete(string,Object)方法。
9、 批量delete
方法名要求:以batchDelete、batchRemove、batchDel開頭,
如 void batchDeleteUsers(List userList)
方法參數要求:一個,集合(要批量delete的對象集合)
返回值:void
說明:其實現是調用了 BatchExecuteUtils.batchUpdate方法。BatchInsert方法調用SqlMapClientTemplate.execute,通過SqlMapExecutor 的批量方法實現批量寫入。