Spring如何集成ibatis项目并实现dao层基类封装
ApacheiBatis(现已迁至GoogleCode下发展,更名为MyBatis)是当前IT项目中使用很广泛的一个半自动ORM框架,区别于Hibernate之类的全自动框架,iBatis对数据库的操作拥有更加灵活的控制,对于那些经常需要调用本地数据库函数自定义SQL语句,或是喜欢自己优化SQL执行效率的开发者来说,iBatis是一个非常不错的选择。
而得到广泛应用的开源企业架构SpringFramework,也很好的将其进行了集成,使得iBatis在SpringFramework中的使用更加便利、快捷。开发者所要做的就是继承SpringFramework中提供的SqlMapClientDaoSupport类即可。下面将简单介绍使用spring中集成的ibatis进行项目中dao层基类封装,以方便开发。
1、SqlMapClientFactoryBean的装配
SqlMapClientFactoryBean是SqlMapClientTemplate使用的基础,如果在SpringFramework应用中没有装配SqlMapClientFactoryBean,那么SqlMapClientTemplate将不可用,报空指针错误。其配置信息如下:
/WEB-INF/classes/org/bussiness/config/ibatis/SqlMapConfig.xml 
2、继承使用SqlMapClientDaoSupport类
2.1)首先定义一个IBaseDao接口提供各种场景的查询、修改、删除、分页查询的各种抽象功能方法
packageorg.biframework.dao.ibatis;
importcom.ibatis.common.util.PaginatedList;
importjava.util.List;
importorg.biframework.exception.DaoException;
publicabstractinterfaceIBaseDao
{
publicabstractObjectgetObject(StringparamString,ObjectparamObject)
throwsDaoException;
@SuppressWarnings("unchecked")
publicabstractListgetList(StringparamString,ObjectparamObject)
throwsDaoException;
publicabstractPaginatedListgetPgntList(StringparamString1,ObjectparamObject,StringparamString2)
throwsDaoException;
publicabstractPaginatedListgetPgntList(StringparamString1,ObjectparamObject,StringparamString2,intparamInt)
throwsDaoException;
@SuppressWarnings("unchecked")
publicabstractListgetListUseSameStmt(StringparamString,Object[]paramArrayOfObject)
throwsDaoException;
publicabstractintupdate(StringparamString,ObjectparamObject)
throwsDaoException;
publicabstractinttransUpdateSameOpt(StringparamString,Object[]paramArrayOfObject)
throwsDaoException;
publicabstractinttransUpdate(Object[][]paramArrayOfObject)
throwsDaoException;
@SuppressWarnings("unchecked")
publicListgetList(StringstatementName,ObjectparameterObject,
intskipResults,intmaxResults)throwsDaoException;
}
备注:该层也可以不写
2.2)继承使用SqlMapClientDaoSupport类并实现IBaseDao接口
packageorg.biframework.dao.ibatis;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.commons.logging.Log;
importorg.apache.commons.logging.LogFactory;
importorg.biframework.exception.DaoException;
importorg.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
importcom.ibatis.common.util.PaginatedList;
publicclassBaseDaoextendsSqlMapClientDaoSupportimplementsIBaseDao{
@SuppressWarnings("unused")
privatestaticLoglog;
protectedstaticfinalintPAGE_SIZE=15;
@SuppressWarnings("unchecked")
staticClassclass$0;/*syntheticfield*/
publicBaseDao(){
}
/*
使用spring中集成的ibatis实现数据的查询、修改、删除
1)当请求参数被封装为一个普通对象,查询结果为List集合:
使用queryForList返回List源码方法如下:getSqlMapClientTemplate(),获取SqlMapClientTemplate对象,
参数说明:a、statementNamesql声明;b、parameterObject请求参数对象queryForList方法源码如下
publicListqueryForList(StringstatementName,ObjectparameterObject)
throwsDataAccessException
{
executeWithListResult(newSqlMapClientCallback()
{
privatefinalStringval$statementName;
privatefinalObjectval$parameterObject;
publicObjectdoInSqlMapClient(SqlMapExecutorexecutor)
throwsSQLException
{
returnexecutor.queryForList(this.val$statementName,this.val$parameterObject);
}
});
}
*/
@SuppressWarnings("unchecked")
publicListgetList(StringstatementName,ObjectparameterObject)
throwsDaoException{
Listlist=getSqlMapClientTemplate().queryForList(statementName,
parameterObject);
returnlist;
}
/*
2)当请求参数被封装为一个数组对象时:
即使用数组存放多个传参对象(obj1、obj2...)而后使用相同sql,进行多次查询,将多次查询的结果list1、list2...放到结果集List中)
使用queryForList返回List封装的方法如下:
*/
@SuppressWarnings("unchecked")
publicListgetListUseSameStmt(StringstatementName,ObjectobjectParam[])
throwsDaoException{
Listlist=null;
Listtemp=null;
if(statementName==null||objectParam==null||objectParam.length==0){
returnlist;
}else{
for(inti=0;i0){
result=list.get(0);
}
returnresult;
}
/*
4)ibatis-common-2.jar、使用ibatis自身封装的PaginatedList工具类进行分页查询,每页15条数据。
publicPaginatedListqueryForPaginatedList(StringstatementName,ObjectparameterObject,intpageSize)
throwsDataAccessException
{
if(((this.sqlMapClientinstanceofExtendedSqlMapClient))&&(((ExtendedSqlMapClient)this.sqlMapClient).getDelegate().getTxManager()==null)){
thrownewInvalidDataAccessApiUsageException("SqlMapClientneedstohaveDataSourcetoallowforlazyloading-specifySqlMapClientFactoryBean's'dataSource'property");
}
(PaginatedList)execute(newSqlMapClientCallback()
{
privatefinalStringval$statementName;
privatefinalObjectval$parameterObject;
privatefinalintval$pageSize;
publicObjectdoInSqlMapClient(SqlMapExecutorexecutor)
throwsSQLException
{
returnexecutor.queryForPaginatedList(this.val$statementName,this.val$parameterObject,this.val$pageSize);
}
});
}
*/
publicPaginatedListgetPgntList(StringstatementName,
ObjectparameterObject,StringpageDirection)throwsDaoException{
PaginatedListlist=getSqlMapClientTemplate().queryForPaginatedList(
statementName,parameterObject,15);
if("next".equals(pageDirection))
list.nextPage();
elseif("previous".equals(pageDirection))
list.previousPage();
elseif("first".equals(pageDirection))
list.isFirstPage();
elseif("last".equals(pageDirection))
list.isLastPage();
returnlist;
}
/*
4)自己指定分页查询的数量
*/
publicPaginatedListgetPgntList(StringstatementName,
ObjectparameterObject,StringpageDirection,intpageSize)
throwsDaoException{
PaginatedListlist=getSqlMapClientTemplate().queryForPaginatedList(
statementName,parameterObject,pageSize);
if("next".equals(pageDirection)){
System.out.println("下一页");
list.nextPage();
}elseif("previous".equals(pageDirection)){
System.out.println("上一页");
list.previousPage();
}elseif("first".equals(pageDirection)){
System.out.println("首页");
list.isFirstPage();
}elseif("last".equals(pageDirection)){
System.out.println("末页");
list.isLastPage();
}
returnlist;
}
/*
5)该方法暂时未理解其主要是处于何种场景使用
*/
publicintupdate(StringstatementName,ObjectparameterObject)
throwsDataAccessException
{
Integerresult=(Integer)execute(newSqlMapClientCallback()
{
privatefinalStringval$statementName;
privatefinalObjectval$parameterObject;
publicObjectdoInSqlMapClient(SqlMapExecutorexecutor)
throwsSQLException
{
returnnewInteger(executor.update(this.val$statementName,this.val$parameterObject));
}
});
returnresult.intValue();
}
*/
publicinttransUpdate(ObjectstatementAndparameter[][])
throwsDaoException{
Objectstatements[]=statementAndparameter[0];
Objectparameters[]=statementAndparameter[1];
intresult=0;
for(inti=0;i
3、进行dao层配置,并进行查询等操作
3.1)所有的dao层都继承BaseDao类
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.util.List;
importorg.apache.commons.logging.Log;
importorg.apache.commons.logging.LogFactory;
importorg.biframework.dao.ibatis.BaseDao;
importorg.biframework.exception.DaoException;
importorg.bussiness.product.detailquery.bo.StPolicyBean;
publicclassStPolicyDaoextendsBaseDao{
protectedstaticLoglog=LogFactory.getLog(StPolicyDao.class);
@SuppressWarnings("unchecked")
publicListgetStPerm(StPBeanparam)throwsDaoException{
returnsuper.getList("getShortPrem",param);
}
publicObjectgetStPermCount(StPBeanparam)throwsDaoException{
returnsuper.getObject("getShortPremCount",param);
}
}
}
3.2)进行dao装配detailQuery-applicationContext.xml
   
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
  