import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import com.ibatis.sqlmap.engine.impl.ExtendedSqlMapClient;
import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;
import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap;
import com.ibatis.sqlmap.engine.mapping.sql.Sql;
import com.ibatis.sqlmap.engine.mapping.statement.MappedStatement;
import com.ibatis.sqlmap.engine.scope.RequestScope;
import com.sdb.dto.PageDto;
import com.sdb.exception.DaoException;import com.sdb.util.string.StringUtil;
public class BaseSqlMapDao extends SqlMapClientDaoSupport implements PageDao {
protected final Log log = LogFactory.getLog(getClass());
/**
* 根据分页数据对象执行分页查询
*
* @param countSqlKey
* 计算符合查询条件数据总数key
* @param selectSqlKey
* 分页查询语句key
* @param pageDto
* 分页数据对象
* @return 执行查询之后的分页数据对象
* @throws DaoException
*/
public PageDto selectByMapForPage(String countSqlKey, String selectSqlKey,
Map paraMap) throws DaoException {
PageDto pageDto = getPageDto(paraMap);
pageDto.setParamMap(paraMap);
log.info("分页查询pageDto:" + pageDto);
try {
if (pageDto.getCount() == 0) {
Integer count = (Integer) getSqlMapClient().queryForObject(
countSqlKey, pageDto.getParamMap());
pageDto.setCount(count.intValue());
}
List result=getSqlMapClient().queryForList(selectSqlKey,
pageDto.getParamMap());
paraMap.put(MetaConstant.PAGE_NUM, pageDto.getPages());
paraMap.put(MetaConstant.RECORD_NUM, result.size());
paraMap.put(MetaConstant.PAGE_ID, pageDto.getCurrentPage());
pageDto.setParamMap(paraMap);
pageDto.setPageList(result);
pageDto.setSql(getSql(selectSqlKey, pageDto.getParamMap()));
pageDto.setCurrentCount(result == null ? 0 : result.size());
} catch (Exception e) {
log.error("执行分页查询异常:",e);
throw new DaoException("执行分页查询异常:" + e.getMessage());
}
return pageDto;
}
/**
* 根据查询条件中生成分页数据对象
*
* @param condition
* 查询条件
* @return 分数据对象
*/
protected PageDto getPageDto(Map condition) {
Integer count = condition.get(MetaConstant.RECORD_COUNT)==null ? null : Integer.valueOf(StringUtil.trim((String)condition.get(MetaConstant.RECORD_COUNT)));// 记录总数
Integer currentPage = condition.get(MetaConstant.PAGE_ID)==null? null : Integer.valueOf(StringUtil.trim((String)condition.get(MetaConstant.PAGE_ID)));// 请求查询的页面(当前页)
Integer pageSize = condition.get(MetaConstant.PAGE_SIZE) == null ? null : Integer.valueOf(StringUtil.trim((String)condition.get(MetaConstant.PAGE_SIZE)));// 每页记录数
if (pageSize == null) {
return new PageDto(count == null ? 0 : count.intValue(),
currentPage == null ? 1 : currentPage.intValue());
}
return new PageDto(pageSize.intValue(), count == null ? 0 : count
.intValue(), currentPage == null ? 1 : currentPage.intValue());
}
/**
* 获取ibatis sql 语句
*
* @param sqlKey
* @param obj 输入参数
* @return
*/
public String getSql(String sqlKey, Object obj) {
SqlMapExecutorDelegate delegate = ((ExtendedSqlMapClient) (getSqlMapClientTemplate()
.getSqlMapClient())).getDelegate();
// 这个类用来存放某个id名的Statement信息,如这个当中的getProduct就是一条语句的配置id名
MappedStatement ms = delegate.getMappedStatement(sqlKey);
RequestScope requestScope = new RequestScope();
ms.initRequest(requestScope);
Sql sql = ms.getSql();
String result = sql.getSql(requestScope, obj);
log.info("sql语句==" + result);
ParameterMap parameterMap = sql.getParameterMap(requestScope, obj);
requestScope.setParameterMap(parameterMap);
Object[] parameterArr = parameterMap.getParameterObjectValues(
requestScope, obj); //查询参数全部放在了parameterArr这个对象数组里
for (Object o : parameterArr) {
log.info("参数==" + o);
}
return result;
}
}