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

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

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

    Terry.Li-彬

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

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

    很多時候我們需要執(zhí)行select語句對應的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語句的復雜程度完善,這里給出的是最簡單的實現(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)計嗎?它們是共用一條查詢語句?我試了試不行哦。不知你那里有沒有好的建議沒,有,請回復。多謝!  回復  更多評論
      

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

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

    主站蜘蛛池模板: 最近高清中文字幕免费| 久久丫精品国产亚洲av不卡| 人禽杂交18禁网站免费| a级毛片免费完整视频| 亚洲AV无码国产一区二区三区| 久久久亚洲欧洲日产国码是AV| 国产av无码专区亚洲av果冻传媒| 国产色爽免费视频| 18禁成年无码免费网站无遮挡| 13一14周岁毛片免费| 久久精品私人影院免费看| 国产成人精品免费大全| 香蕉视频亚洲一级| 亚洲久热无码av中文字幕| 亚洲小说图片视频| 色播亚洲视频在线观看| 亚洲国产精品无码AAA片| 久久综合亚洲色HEZYO国产| 四虎影永久在线高清免费| 成人片黄网站A毛片免费| 日韩欧毛片免费视频| 91精品手机国产免费| 四虎影视在线影院在线观看免费视频| 一级毛片试看60分钟免费播放| 黄色a级免费网站| 黄页网站在线免费观看| 国产精品亚洲专一区二区三区| 国产精品观看在线亚洲人成网| 亚洲AV一区二区三区四区| 亚洲av无码专区青青草原| 亚洲爆乳精品无码一区二区| 亚洲国产av玩弄放荡人妇| 亚洲AV无码专区亚洲AV桃| 亚洲AV香蕉一区区二区三区| 亚洲AV无码专区亚洲AV桃| 香蕉视频免费在线播放| 国产精品午夜免费观看网站| 日韩精品无码免费专区午夜不卡| 久久久久久国产a免费观看不卡| 天堂在线免费观看| 无码av免费一区二区三区|