文歡歡 劉振宇 吳霖
摘要:基于J2EE的數(shù)據(jù)持久化框架已經(jīng)成為WEB開發(fā)的主流技術(shù),而分頁查詢在與數(shù)據(jù)庫交互中是必不可少的一項(xiàng)。數(shù)據(jù)查詢分頁的方式有很多,從傳統(tǒng)的JDBC分頁查詢到現(xiàn)代ORM框架的分頁查詢,但這些分頁查詢方法中或多或少會出現(xiàn)一些問題,例如JDBC實(shí)現(xiàn)物理分頁會導(dǎo)致復(fù)雜化編程、高耦合、性能差、代碼復(fù)用度低、復(fù)雜度高等。應(yīng)用Mybatis來進(jìn)行分頁實(shí)現(xiàn)了松散耦合,能極大地提高開發(fā)效率,使系統(tǒng)更具維護(hù)性和可擴(kuò)展性。
關(guān)鍵詞:Mybatis;持久化;ORM;分頁
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2015)25-0165-03
在實(shí)際的開發(fā)中,開戶者通常會對數(shù)據(jù)信息進(jìn)行過濾選擇,進(jìn)而分頁展示到自身或用戶的視野中。如果采用通用的JDBC物理分頁的方式,也能實(shí)現(xiàn)分頁的效果,但實(shí)現(xiàn)過程中會相對繁瑣,分頁性能比較低,可移植性較差。如果采用新型ORM框架Mybatis和JDBC改良的分頁方式處理,效果能更加清晰明了的實(shí)現(xiàn),數(shù)據(jù)也能更具穩(wěn)定性。此種方式具有較好的可用性、靈活性、交互性,也具備更強(qiáng)的移植性。
1 Mybatis和JDBC介紹
JDBC(Java Data Base Connectivity)全稱是java數(shù)據(jù)庫連接,是一種用來執(zhí)行SQL數(shù)據(jù)庫語句的Java API,可以向多種關(guān)系數(shù)據(jù)庫數(shù)據(jù)提供統(tǒng)一訪問,它是由一組由Java語言編寫的類和接口組成的。JDBC提供了一種標(biāo)準(zhǔn),提供構(gòu)建更高級的工具和接口,使開發(fā)人員能更好地編寫數(shù)據(jù)庫應(yīng)用程序[1]。
Mybatis原來是阿帕奇公司(即Apache公司)的一個(gè)面向廣大用戶和企業(yè)而研究的開源項(xiàng)目“ibatis”[2]。隨著開發(fā)團(tuán)隊(duì)加入Google Code旗下,ibatis3.X正式更名為Mybatis。其本意是Internet和abatis兩個(gè)單詞的組合,是提供給用戶一個(gè)持久層框架。Mybatis框架集合了多種操作型的關(guān)系數(shù)據(jù)概念與方法。它是一個(gè)強(qiáng)大有效的數(shù)據(jù)訪問工具,主要包含DAO組件和SQL Map組件兩大類,其構(gòu)架圖,如圖1所示[3]:
圖1 Mybatis構(gòu)架圖
Mybatis的ORM自動(dòng)生成方式代替了幾乎所有的JDBC代碼和屬性進(jìn)行配置,直接生成接口類和JAVA Bean對象的數(shù)據(jù)庫表或?qū)?shù)據(jù)庫表直接反向生成接口類和JAVA Model類。Mybatis主要由三層主要功能組成:
1) API接口層:自動(dòng)生成JDBC封裝代碼給生成類以外的類提供接口,程序員可以通過本地API對數(shù)據(jù)庫直接進(jìn)行操作和處理。
2) 數(shù)據(jù)處理層:擁有具體的JDBC代碼,是接口的具體實(shí)例化代碼,包括具體的SQL查找、文件解析、程序執(zhí)行與執(zhí)行結(jié)果處理等功能。它的主要目的是根據(jù)調(diào)用的API請求轉(zhuǎn)化成具體代碼,而后由代碼完成一次數(shù)據(jù)庫數(shù)據(jù)處理操作。
3) 基礎(chǔ)支撐層:負(fù)責(zé)于框架最基礎(chǔ)的管理功能,包括數(shù)據(jù)庫連接、數(shù)據(jù)庫事務(wù)管理、數(shù)據(jù)庫加載配置和數(shù)據(jù)庫緩存處理等,將他們組合成一個(gè)最基本的組件,為上層提供服務(wù)。
2 Mybatis和JDBC分頁方法實(shí)現(xiàn)
要實(shí)現(xiàn)分頁方法,需要完成以下工作。
1)在Mybatis的實(shí)體類T的TMapper.xml文件中添加兩個(gè)方法映射(這里將兩個(gè)映射的id命名為queryByCountCondition和queryByCondition),一個(gè)是返回查詢記錄的數(shù)量的方法映射,另一個(gè)是進(jìn)行條件查詢分頁的方法映射,然后在Dao層添加queryByCountCondition和queryByCondition方法,并在Dao的實(shí)現(xiàn)層對著兩個(gè)方法進(jìn)行實(shí)現(xiàn)。Mybatis根據(jù)TMapper.xml中namespace的類名映射Dao層中的類,Service層通過Dao層的實(shí)現(xiàn)類反向調(diào)用Dao層接口,通過TMapper.xml文件映射SQl操作,進(jìn)而完成整個(gè)操作。主要實(shí)現(xiàn)代碼如:TMapper.xml文件代碼:
…
TDaoImp.java文件代碼:
public class TDaoImp implements TDao {
private static final String NAMESPACE = "com.dao.TDao";
…
public List
SqlSession session = null;
List
try {
session = GetSession.initSession();
list = session.selectList(NAMESPACE + ".queryByCondition",model);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("系統(tǒng)出錯(cuò) :"+e.getMessage());
}finally{
session.close();
}
return list;
}
public int queryCountByCondition(TModel model) throws Exception {
SqlSession session = null;
Integer count = null;
try {
session = GetSession.initSession();
Count=(Integer)session.selectOne(NAMESPACE + ".queryCountByCondition",model);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("系統(tǒng)出錯(cuò) :"+e.getMessage());
}finally{
session.close();
}
return count;
}
2)創(chuàng)建Page類和PageModel類,在其中建立起始頁、每頁記錄數(shù)、總頁數(shù)、總記錄數(shù)、當(dāng)前頁記錄等。在Dao層建立BaseDao接口,里面只有queryByPage一個(gè)方法,返回Page并在其實(shí)現(xiàn)類BaseDaoImp實(shí)現(xiàn)。實(shí)現(xiàn)類內(nèi)部代碼大致如下:
public Page queryByPage(Page page) throws Exception {
SqlSession session = null;
List
try {
session = GetSession.initSession();
pageList=session.selectList(page.getNameSpace()+ page.getMethod(), page.getParams());
Integer totalRecords = (Integer) session.selectOne(page.getNameSpace() + page.getMethodCount(), page.getParams().get("modelCondition"));
page.setTotalRecord(totalRecords);
page.setResults(pageList);
} catch (Exception e) {
throw new RuntimeException("系統(tǒng)出錯(cuò) :"+e.getMessage());
}finally{
session.close();
}
return page;
}
3)在util包中建立PageDao類用來中間調(diào)用BaseDaoImp的內(nèi)部方法,并加以封裝。其內(nèi)部代碼大致如下:
public static PageModel pageInation(Object object,Page page) throws Exception{
PageModel pageModel = new PageModel();
BaseDaoImp baseDaoImp = new BaseDaoImp();
try {
page.getParams().put("modelCondition",object );
page.getParams().put("start",page.getStart());
page.getParams().put("pageSize",page.getPageSize());
page = baseDaoImp.queryByPage(page);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("分頁出錯(cuò) :"+e.getMessage());
}
pageModel.setStart(page.getStart());
pageModel.setPageNo(page.getPageNo());
pageModel.setPageSize(page.getPageSize());
pageModel.setResults(page.getResults());
pageModel.setTotalRecords(page.getTotalRecords());
pageModel.setTotalPage(page.getTotalPage());
page=null;
return pageModel;
4)在util包中建立QureyPage類與上層相契合,作為通用分頁類,其內(nèi)部代碼大致如下:
public static PageModel getPageResult(BaseModel model,String nameSpace,Integer start, Integer pageNo, Integer pageSize) throws Exception{
Page page = new Page();
PageModel pageModel = new PageModel();
if (pageSize != null && pageSize > 0) {
page.setPageSize(pageSize);
}
if (pageNo != null && pageSize > 0) {
page.setPageNo(pageNo);
}
page.setStart(start);
page.setNameSpace(nameSpace);
pageModel = PageDao.pageInation(model, page);
return pageModel;
}
至此,大致的Mybatis和JDBC結(jié)合分頁的大致流程基本完成。
3 結(jié)束語
文中對Mybatis和JDBC進(jìn)行了簡要的介紹,對基于Myatbis和JDBC相結(jié)合的分頁方式進(jìn)行了分析,設(shè)計(jì)并實(shí)現(xiàn)了通用頁面信息映射類和實(shí)現(xiàn)類,同時(shí)在效的整合了Mybatis和JDBC的基礎(chǔ)上,設(shè)計(jì)出一種通用的分頁查詢方法,最后通過具體代碼實(shí)現(xiàn)了整個(gè)過程。
該方法通過配置文件中的自動(dòng)映射,提高了代碼的可靠性和有效性,降低了編程的耦合度,使得分頁查詢更易于實(shí)現(xiàn)。
參考文獻(xiàn):
[1] 李德水, 陰國富. JDBC體系結(jié)構(gòu)分析[J]. 電腦開發(fā)與應(yīng)用, 2006(10).
[2] 夏汛, 陳玲. 基于Spring MVC和Mybatis的動(dòng)態(tài)表單設(shè)計(jì)[J]. 計(jì)算機(jī)光盤軟件和應(yīng)用, 2012(20).
[3] 徐雯, 高建華. 基于Spring MVC及Mybatis的Web應(yīng)用框架研究[J]. 微型電腦應(yīng)用, 2012(7).