我们到底能走多远系列(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 { }
让我们继续前行
----------------------------------------------------------------------
努力不一定成功,但不努力肯定不会成功。
共勉。