mybatis開發--總結--簡要說明

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 的批量方法實現批量寫入。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章