基于Mybatis和JDBC的分页查询研究

2015-12-08 12:13文欢欢刘振宇吴霖
电脑知识与技术 2015年25期

文欢欢 刘振宇 吴霖

摘要:基于J2EE的数据持久化框架已经成为WEB开发的主流技术,而分页查询在与数据库交互中是必不可少的一项。数据查询分页的方式有很多,从传统的JDBC分页查询到现代ORM框架的分页查询,但这些分页查询方法中或多或少会出现一些问题,例如JDBC实现物理分页会导致复杂化编程、高耦合、性能差、代码复用度低、复杂度高等。应用Mybatis来进行分页实现了松散耦合,能极大地提高开发效率,使系统更具维护性和可扩展性。

关键词:Mybatis;持久化;ORM;分页

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)25-0165-03

在实际的开发中,开户者通常会对数据信息进行过滤选择,进而分页展示到自身或用户的视野中。如果采用通用的JDBC物理分頁的方式,也能实现分页的效果,但实现过程中会相对繁琐,分页性能比较低,可移植性较差。如果采用新型ORM框架Mybatis和JDBC改良的分页方式处理,效果能更加清晰明了的实现,数据也能更具稳定性。此种方式具有较好的可用性、灵活性、交互性,也具备更强的移植性。

1 Mybatis和JDBC介绍

JDBC(Java Data Base Connectivity)全称是java数据库连接,是一种用来执行SQL数据库语句的Java API,可以向多种关系数据库数据提供统一访问,它是由一组由Java语言编写的类和接口组成的。JDBC提供了一种标准,提供构建更高级的工具和接口,使开发人员能更好地编写数据库应用程序[1]。

Mybatis原来是阿帕奇公司(即Apache公司)的一个面向广大用户和企业而研究的开源项目“ibatis”[2]。随着开发团队加入Google Code旗下,ibatis3.X正式更名为Mybatis。其本意是Internet和abatis两个单词的组合,是提供给用户一个持久层框架。Mybatis框架集合了多种操作型的关系数据概念与方法。它是一个强大有效的数据访问工具,主要包含DAO组件和SQL Map组件两大类,其构架图,如图1所示[3]:

图1 Mybatis构架图

Mybatis的ORM自动生成方式代替了几乎所有的JDBC代码和属性进行配置,直接生成接口类和JAVA Bean对象的数据库表或将数据库表直接反向生成接口类和JAVA Model类。Mybatis主要由三层主要功能组成:

1) API接口层:自动生成JDBC封装代码给生成类以外的类提供接口,程序员可以通过本地API对数据库直接进行操作和处理。

2) 数据处理层:拥有具体的JDBC代码,是接口的具体实例化代码,包括具体的SQL查找、文件解析、程序执行与执行结果处理等功能。它的主要目的是根据调用的API请求转化成具体代码,而后由代码完成一次数据库数据处理操作。

3) 基础支撑层:负责于框架最基础的管理功能,包括数据库连接、数据库事务管理、数据库加载配置和数据库缓存处理等,将他们组合成一个最基本的组件,为上层提供服务。

2 Mybatis和JDBC分页方法实现

要实现分页方法,需要完成以下工作。

1)在Mybatis的实体类T的TMapper.xml文件中添加两个方法映射(这里将两个映射的id命名为queryByCountCondition和queryByCondition),一个是返回查询记录的数量的方法映射,另一个是进行条件查询分页的方法映射,然后在Dao层添加queryByCountCondition和queryByCondition方法,并在Dao的实现层对着两个方法进行实现。Mybatis根据TMapper.xml中namespace的类名映射Dao层中的类,Service层通过Dao层的实现类反向调用Dao层接口,通过TMapper.xml文件映射SQl操作,进而完成整个操作。主要实现代码如:TMapper.xml文件代码:

TDaoImp.java文件代码:

public class TDaoImp implements TDao {

private static final String NAMESPACE = "com.dao.TDao";

public List queryByCondition(TModel model) throws Exception {

SqlSession session = null;

List list = null;

try {

session = GetSession.initSession();

list = session.selectList(NAMESPACE + ".queryByCondition",model);

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException("系统出错 :"+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("系统出错 :"+e.getMessage());

}finally{

session.close();

}

return count;

}

2)创建Page类和PageModel类,在其中建立起始页、每页记录数、总页数、总记录数、当前页记录等。在Dao层建立BaseDao接口,里面只有queryByPage一个方法,返回Page并在其实现类BaseDaoImp实现。实现类内部代码大致如下:

public Page queryByPage(Page page) throws Exception {

SqlSession session = null;

List pageList = null;

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("系統出错 :"+e.getMessage());

}finally{

session.close();

}

return page;

}

3)在util包中建立PageDao类用来中间调用BaseDaoImp的内部方法,并加以封装。其内部代码大致如下:

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("分页出错 :"+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类与上层相契合,作为通用分页类,其内部代码大致如下:

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結合分页的大致流程基本完成。

3 结束语

文中对Mybatis和JDBC进行了简要的介绍,对基于Myatbis和JDBC相结合的分页方式进行了分析,设计并实现了通用页面信息映射类和实现类,同时在效的整合了Mybatis和JDBC的基础上,设计出一种通用的分页查询方法,最后通过具体代码实现了整个过程。

该方法通过配置文件中的自动映射,提高了代码的可靠性和有效性,降低了编程的耦合度,使得分页查询更易于实现。

参考文献:

[1] 李德水, 阴国富. JDBC体系结构分析[J]. 电脑开发与应用, 2006(10).

[2] 夏汛, 陈玲. 基于Spring MVC和Mybatis的动态表单设计[J]. 计算机光盘软件和应用, 2012(20).

[3] 徐雯, 高建华. 基于Spring MVC及Mybatis的Web应用框架研究[J]. 微型电脑应用, 2012(7).