我們到底能走多遠系列(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 { }
讓我們繼續前行
----------------------------------------------------------------------
努力不一定成功,但不努力肯定不會成功。
共勉。