<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Terry.Li-彬

    虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
    下面的內(nèi)容是基于ibatis2.2,以后的版本是否提供了類似功能不太清楚,甚至這個版本是否提供也沒有細究(好像沒有)。

    很多時候我們需要執(zhí)行select語句對應(yīng)的count語句,例如分頁查詢時要得到結(jié)果的記錄數(shù),但在ibatis的映射文件中我們只想寫一條select語句,而count語句直接由這條語句生成,這可以省去很多不必要的語句關(guān)聯(lián),下面的代碼可以實現(xiàn)這一點。

    CountStatementUtil.java

    java 代碼
    package com.aladdin.dao.ibatis.ext;

    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.List;

    import com.aladdin.util.ReflectUtil;
    import com.ibatis.common.jdbc.exception.NestedSQLException;
    import com.ibatis.sqlmap.client.event.RowHandler;
    import com.ibatis.sqlmap.engine.impl.ExtendedSqlMapClient;
    import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap;
    import com.ibatis.sqlmap.engine.mapping.result.AutoResultMap;
    import com.ibatis.sqlmap.engine.mapping.result.BasicResultMap;
    import com.ibatis.sqlmap.engine.mapping.result.ResultMap;
    import com.ibatis.sqlmap.engine.mapping.sql.Sql;
    import com.ibatis.sqlmap.engine.mapping.statement.ExecuteListener;
    import com.ibatis.sqlmap.engine.mapping.statement.MappedStatement;
    import com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback;
    import com.ibatis.sqlmap.engine.mapping.statement.SelectStatement;
    import com.ibatis.sqlmap.engine.scope.ErrorContext;
    import com.ibatis.sqlmap.engine.scope.RequestScope;

    public class CountStatementUtil {

    public static MappedStatement createCountStatement(MappedStatement selectStatement) {
    return new CountStatement((SelectStatement) selectStatement);
    }

    public static String getCountStatementId(String selectStatementId) {
    return "__" + selectStatementId + "Count__";
    }

    }

    class CountStatement extends SelectStatement {

    public CountStatement(SelectStatement selectStatement) {
    super();
    setId(CountStatementUtil.getCountStatementId(selectStatement
    .getId()));
    setResultSetType(selectStatement.getResultSetType());
    setFetchSize(1);
    setParameterMap(selectStatement.getParameterMap());
    setParameterClass(selectStatement.getParameterClass());
    setSql(selectStatement.getSql());
    setResource(selectStatement.getResource());
    setSqlMapClient(selectStatement.getSqlMapClient());
    setTimeout(selectStatement.getTimeout());
    List executeListeners = (List) ReflectUtil.getFieldValue(
    selectStatement, "executeListeners", List.class);
    if (executeListeners != null) {
    for (Object listener : executeListeners) {
    addExecuteListener((ExecuteListener) listener);
    }
    }
    BasicResultMap resultMap = new AutoResultMap(
    ((ExtendedSqlMapClient) getSqlMapClient()).getDelegate(), false);
    resultMap.setId(getId() + "-AutoResultMap");
    resultMap.setResultClass(Long.class);
    resultMap.setResource(getResource());
    setResultMap(resultMap);

    }

    protected void executeQueryWithCallback(RequestScope request,
    Connection conn, Object parameterObject, Object resultObject,
    RowHandler rowHandler, int skipResults, int maxResults)
    throws SQLException {
    ErrorContext errorContext = request.getErrorContext();
    errorContext
    .setActivity("preparing the mapped statement for execution");
    errorContext.setObjectId(this.getId());
    errorContext.setResource(this.getResource());

    try {
    parameterObject = validateParameter(parameterObject);

    Sql sql = getSql();

    errorContext.setMoreInfo("Check the parameter map.");
    ParameterMap parameterMap = sql.getParameterMap(request,
    parameterObject);

    errorContext.setMoreInfo("Check the result map.");
    ResultMap resultMap = getResultMap(request, parameterObject, sql);

    request.setResultMap(resultMap);
    request.setParameterMap(parameterMap);

    errorContext.setMoreInfo("Check the parameter map.");
    Object[] parameters = parameterMap.getParameterObjectValues(
    request, parameterObject);

    errorContext.setMoreInfo("Check the SQL statement.");
    String sqlString = getSqlString(request, parameterObject, sql);

    errorContext.setActivity("executing mapped statement");
    errorContext
    .setMoreInfo("Check the SQL statement or the result map.");
    RowHandlerCallback callback = new RowHandlerCallback(resultMap,
    resultObject, rowHandler);
    sqlExecuteQuery(request, conn, sqlString, parameters, skipResults,
    maxResults, callback);

    errorContext.setMoreInfo("Check the output parameters.");
    if (parameterObject != null) {
    postProcessParameterObject(request, parameterObject, parameters);
    }

    errorContext.reset();
    sql.cleanup(request);
    notifyListeners();
    } catch (SQLException e) {
    errorContext.setCause(e);
    throw new NestedSQLException(errorContext.toString(), e
    .getSQLState(), e.getErrorCode(), e);
    } catch (Exception e) {
    errorContext.setCause(e);
    throw new NestedSQLException(errorContext.toString(), e);
    }
    }

    private String getSqlString(RequestScope request, Object parameterObject,
    Sql sql) {
    String sqlString = sql.getSql(request, parameterObject);
    int start = sqlString.toLowerCase().indexOf("from");
    if (start >= 0) {
    sqlString = "SELECT COUNT(*) AS c " + sqlString.substring(start);
    }
    return sqlString;
    }

    private ResultMap getResultMap(RequestScope request,
    Object parameterObject, Sql sql) {
    return getResultMap();
    }

    }

    上面代碼中的getSqlString方法可以根據(jù)自己系統(tǒng)select語句的復(fù)雜程度完善,這里給出的是最簡單的實現(xiàn)。

    使用上面的類即可由select語句生成count語句,下面是通過spring使用的代碼:

    BaseDaoiBatis.java

    java 代碼
    //...
    public abstract class BaseDaoiBatis extends SqlMapClientDaoSupport {

    //...

    protected long getObjectTotal(String selectQuery, Object parameterObject) {
    prepareCountQuery(selectQuery);
    //...
    return (Long) getSqlMapClientTemplate().queryForObject(
    CountStatementUtil.getCountStatementId(selectQuery),
    parameterObject);
    }

    protected void prepareCountQuery(String selectQuery) {

    String countQuery = CountStatementUtil.getCountStatementId(selectQuery);
    if (logger.isDebugEnabled()) {
    logger.debug("Convert " + selectQuery + " to " + countQuery);
    }
    SqlMapClient sqlMapClient = getSqlMapClientTemplate().getSqlMapClient();
    if (sqlMapClient instanceof ExtendedSqlMapClient) {
    SqlMapExecutorDelegate delegate = ((ExtendedSqlMapClient) sqlMapClient)
    .getDelegate();
    try {
    delegate.getMappedStatement(countQuery);
    } catch (SqlMapException e) {
    delegate.addMappedStatement(CountStatementUtil
    .createCountStatement(delegate
    .getMappedStatement(selectQuery)));
    }

    }
    }

    //...
    }
    posted on 2008-05-03 00:31 禮物 閱讀(4798) 評論(3)  編輯  收藏 所屬分類: ibatis + spring

    評論

    # re: ibatis中由SELECT語句自動生成COUNT語句 2011-01-13 12:18 tylerLimin
    Hi Terry.
    按你上面寫的那樣可以實現(xiàn)分頁條件中的 resultCount(記錄數(shù))統(tǒng)計嗎?它們是共用一條查詢語句?我試了試不行哦。不知你那里有沒有好的建議沒,有,請回復(fù)。多謝!  回復(fù)  更多評論
      

    # re: ibatis中由SELECT語句自動生成COUNT語句 2011-01-17 13:44 禮物
    可以實現(xiàn)count查詢,原則上會生成兩條sql語句,一條是count一條是具體分頁的,這個代碼已經(jīng)寫了很早了,你最好進行debug跟蹤一下就可以知道了  回復(fù)  更多評論
      

    # re: ibatis中由SELECT語句自動生成COUNT語句 2011-04-25 19:29 joliny
    有沒有通用的呀!!如果sql中包含子查詢就不好用了  回復(fù)  更多評論
      

    主站蜘蛛池模板: 久视频精品免费观看99| 色视频在线观看免费| 久久久亚洲欧洲日产国码aⅴ| 亚洲熟妇无码另类久久久| 亚洲日韩小电影在线观看| 亚洲人成网7777777国产| 亚洲午夜国产精品无码| 亚洲狠狠婷婷综合久久久久 | 一级白嫩美女毛片免费| 日本高清不卡中文字幕免费| 日本特黄特色AAA大片免费| 男女猛烈激情xx00免费视频| 一本到卡二卡三卡免费高| 国产人成网在线播放VA免费| 成人爽a毛片免费| 免费人成在线观看网站品爱网| 99热在线观看免费| 69天堂人成无码麻豆免费视频| 成人免费一级毛片在线播放视频| 成人无码区免费A片视频WWW | 成人免费区一区二区三区 | 猫咪免费人成网站在线观看入口| 黄色毛片免费观看| a级毛片免费完整视频| 免费国产黄网站在线观看可以下载| 亚洲黄色免费观看| 午夜免费福利影院| jlzzjlzz亚洲乱熟在线播放| 国产亚洲一区二区三区在线| 亚洲人成7777影视在线观看| 美女羞羞免费视频网站| 最近免费中文字幕中文高清| 国产92成人精品视频免费| 在线日韩av永久免费观看| 久99精品视频在线观看婷亚洲片国产一区一级在线| 国产成人精品亚洲精品| 亚洲高清不卡视频| 亚洲AV网一区二区三区| 在线看片免费人成视频福利| 一个人免费观看视频www | 久久免费观看国产精品88av|