查询

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;
    }

}

 

posted on 2013-10-31 00:55  tryango  阅读(236)  评论(0)    收藏  举报

导航