关于ibatis批量题目-我们到底能走多远系列(26)

    添加时间:2013-5-3 点击量:

    我们到底能走多远系列(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中轮回的应用:



        < 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>
    </>




     用sql语法能解决一些题目。


    看看单个插入:



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


    sqlmap:



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


    改成批量插入:哄骗sping,重视传入参数须要final润饰



        public void batchAddAlbum(final List<AlbumDO> list) {if (list != null) {
    
    this.getSqlMapClientTemplate().execute(new SqlMapClientCallback() {
    @Override
    public Object doInSqlMapClient(SqlMaputor executor)
    throws SQLException {
    executor.startBatch();
    forint i = 0, n = list.size(); i < n; i++) {
    executor.(
    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(
    table error : + e);
    // 回滚事务
    transactionManager.rollback(status);
    rollbackFlg
    = true;

    }
    finally {

    }
    // 数据被回滚
    if (rollbackFlg) {

    }
    else {

    }




    让我们持续前行


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


    尽力不必然成功,但不尽力必然不会成功。
    共勉。

    无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
    分享到: