亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

jdbc和mybatis的流式查詢怎么用

發布時間:2021-11-01 17:47:50 來源:億速云 閱讀:301 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關jdbc和mybatis的流式查詢怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

jdbc流式查詢:

jdbc的流式查詢需要在生成PreparedStatement的時候設置三個參數。如下:

PreparedStatement stmt = jdbcTemplate.getDataSource().getConnection().prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

主要使用到的是java.sql.Connection的prepareStatement方法。

PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException;

resultSetType和resultSetConcurrency我們要分別設置為ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY。

還有就是fetchSize設置為Integer.MIN_VALUE,一開始比較疑惑為啥是這個值。后來發現代碼里面對這個值其實是有特殊處理的。

這個是com.mysql.cj.jdbc.StatementImpl的setFetchSize方法。

@Override
   public void setFetchSize(int rows) throws SQLException {
       synchronized (checkClosed().getConnectionMutex()) {
           if (((rows < 0) && (rows != Integer.MIN_VALUE)) || ((this.maxRows > 0) && (rows > this.getMaxRows()))) {
               throw SQLError.createSQLException(Messages.getString("Statement.7"), MysqlErrorNumbers.SQL_STATE_ILLcom.mysql.cj.jdbc.StatementImpl的方法EGAL_ARGUMENT, getExceptionInterceptor());
           }

           this.query.setResultFetchSize(rows);
       }
   }

resultSetType,有以下三種

/**
     * The constant indicating the type for a <code>ResultSet</code> object
     * whose cursor may move only forward.
     * @since 1.2
     */
    int TYPE_FORWARD_ONLY = 1003;

    /**
     * The constant indicating the type for a <code>ResultSet</code> object
     * that is scrollable but generally not sensitive to changes to the data
     * that underlies the <code>ResultSet</code>.
     * @since 1.2
     */
    int TYPE_SCROLL_INSENSITIVE = 1004;

    /**
     * The constant indicating the type for a <code>ResultSet</code> object
     * that is scrollable and generally sensitive to changes to the data
     * that underlies the <code>ResultSet</code>.
     * @since 1.2
     */
    int TYPE_SCROLL_SENSITIVE = 1005;
stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

resultSetConcurrency有以下兩種,流式查詢要設置為只讀的,數據不會被更新。

/**
     * The constant indicating the concurrency mode for a
     * <code>ResultSet</code> object that may NOT be updated.
     * @since 1.2
     */
    int CONCUR_READ_ONLY = 1007;

    /**
     * The constant indicating the concurrency mode for a
     * <code>ResultSet</code> object that may be updated.
     * @since 1.2
     */
    int CONCUR_UPDATABLE = 1008;

mybatis流式查詢:

mapper中的代碼:

@Select("select * from xxx order by xx desc")
@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = Integer.MIN_VALUE)
@ResultType(XxxObject.class)
void queryStreamResult(ResultHandler<XxxObject> handler);

在查詢方法上加入注解@Options和@ResultType。設置參數不用多說和上面jdbc的底層是一樣的,參數值也一樣。

只不過設置了@ResultType告訴程序應該要返回什么類型的對象。還有這個ResultHandler其實就是Consumer的函數式接口用來處理每一條返回的數據。

具體方法中的代碼:

@Override
   public Boolean dealDataList() {
       mapper.queryStreamResult(resultContext -> {
           dealSingleData(resultContext.getResultObject().getUid());
       });
       return true;
   }

這里怎么使用每一條返回的數據只要在resultContext使用ResultObject就可以拿到上面mapper設置的XxxObject對象進行操作了。

關于“jdbc和mybatis的流式查詢怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

山东| 项城市| 永寿县| 秦安县| 无极县| 鄂尔多斯市| 上饶市| 天津市| 屏边| 邵东县| 汝州市| 镶黄旗| 靖远县| 临沭县| 嘉峪关市| 沂南县| 广汉市| 阳原县| 陆丰市| 梁河县| 兰坪| 克拉玛依市| 阿鲁科尔沁旗| 尼木县| 灵川县| 咸丰县| 阳信县| 大同市| 东乌| 阳江市| 元氏县| 伊金霍洛旗| 巨鹿县| 交口县| 桃江县| 莲花县| 仲巴县| 突泉县| 巨野县| 留坝县| 达尔|