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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。