关于ibatis批量问题

我们到底能走多远系列(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 {
                 
                }

 

 

让我们继续前行

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值