關於ibatis批量問題-我們到底能走多遠系列(26)

來源:互聯網
上載者:User
我們到底能走多遠系列(26)

推薦:

    推薦使用 evernote 或其他類似工具瀏覽網頁,現如今,我們大多數的閱讀都是通過現實屏作為視窗實現的,記筆記或者再要一下是非常必要的尤其是看那些技術類的文章時,最近使用 evernote後,發現很不錯,可以在瀏覽器上裝一個外掛程式,遇到好文,就可以方便的記錄下來,然後同步到自己的行動裝置上去,evernote沒有免費 的離線,如果不想用流量,可以在wifi的情況下,點開那些文章,載入完畢後關閉,晚上回家就可以離線查看啦!

主題:

關於一些基礎的東西,記錄一下:

1,java中list遍曆時刪除問題:

簡化的for-each迴圈只是一個文法糖,等價於如下代碼:

for( Iterator<ComType> iter = ComList.iterator(); iter.hasNext();){    ComType com = iter.next();    if ( !com.getName().contains("abc")){        ComList.remove(com);    }}

但是同時遍曆和刪除一個特list,是不被支援的。

解決辦法:

使用Iterator遍曆,使用Iterator.remove()刪除你想刪除的元素。

 

for( Iterator<ComType> iter = ComList.iterator(); iter.hasNext();){    ComType com = iter.next();    if ( !com.getName().contains("abc")){        iter.remove();    }}

2,關於map遍曆操作問題

反面教材代碼:

        for (Long id : userAlbumMap.keySet()) {            if (userAlbumMap.get(id) > 0) {//遍曆了一遍map                UserAndJourneyDO userAndJourney = userMap.get(id);                userAndJourney.setAlbum(1);            }        }

注意注釋部分,以上代碼,我覺得至少遍曆了兩遍map。

改進:

        for(Map.Entry<Long, Integer> entry : userAlbumMap.entrySet()){               if (entry.getValue() > 0) {//現成使用,不需要遍曆map                   UserAndJourneyDO userAndJourney = userMap.get(entry.getKey());                   userAndJourney.setAlbum(1);               }        }

 

3,關於iBatis批量處理的問題

問題是這樣出現的:為了提高執行的效率,我們需要在與資料庫建立串連時一次性做竟可能多的事。

為什麼要這樣呢? 只要設想一下如果資料庫是分布式部署的話,那麼每次串連都要建立socket,這樣的開銷就大了。

比如:我麼遇到根據多個使用者id查詢資料時,我們考慮 用sql的in文法來取得全部需要查詢的資訊。

ibatis中迴圈的使用:

    <select id="SELECT_PROFILE_BY_UIDS" parameterClass="java.util.List" resultMap="userProfileResult">            SELECT * FROM tb_user_profile WHERE user_id in             <iterate open="(" close=")" conjunction=",">#userIds[]#</iterate>    </select>

 用sql文法能解決一些問題。

看看單個插入:

    public Long addAlbum(AlbumDO album) {        return (Long) this.getSqlMapClientTemplate().insert("INSERT_ALBUM",                album);    }

sqlmap:

    <insert id="INSERT_ALBUM" parameterClass="album">        insert into tb_user_album (user_id, url, status, create_time,        edit_time)        values (#userId#, #url#, #status#, now(), now())        <selectKey resultClass="java.lang.Long" keyProperty="id">            SELECT LAST_INSERT_ID() as id        </selectKey>    </insert>

改成批量插入:利用sping,注意傳入參數需要final修飾

    public void batchAddAlbum(final List<AlbumDO> list) {if (list != null) {            this.getSqlMapClientTemplate().execute(new SqlMapClientCallback() {                @Override                public Object doInSqlMapClient(SqlMapExecutor executor)                        throws SQLException {                    executor.startBatch();                    for (int i = 0, n = list.size(); i < n; i++) {                        executor.insert("INSERT_ALBUM", list.get(i));                    }                    executor.executeBatch();                    return null;                }            });        }    }

建議可以看一下org.springframework.orm.ibatis.SqlMapClientTemplate源碼,更容易理解。

 

4,關於spring手動控制事務

雖然推薦時配置控制事務,但有時候總有呢麼幾個變態需求或情境需要手動控制事務,想利用spring。

代碼模型如下:

// 開啟事務        DefaultTransactionDefinition def = new DefaultTransactionDefinition();        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);        TransactionStatus status = transactionManager.getTransaction(def); // 獲得事務狀態        boolean rollbackFlg = true;        try {            //資料庫處理1             //資料庫處理2                transactionManager.commit(status);//提交                rollbackFlg = false;//標記位            }        } catch (Exception e) {            logger.error("insert table error : " + e);            // 復原事務            transactionManager.rollback(status);            rollbackFlg = true;        } finally {        }        // 資料被復原        if (rollbackFlg) {                    } else {                                 }

 

 

讓我們繼續前行

----------------------------------------------------------------------

努力不一定成功,但不努力肯定不會成功。
共勉。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.