Java实用笔记——mybatis批量导入

写在前面

喜欢的朋友可以关注下专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。

(1.1) 使用Statement 批量插入

public void batchInsertJdbc1() throws Exception
{
    DataSource  ds  = (DataSource) SpringContextHolder.getBean( "dataSource" );
    Connection  conn    = ds.getConnection();
    Statement   st  = conn.createStatement();
    String      sql = "insert into user(userid,username,birthday,salary) values('3000','武二郞',now(),8000);";
    for ( int i = 0; i < 5000; i++ )
    {
        st.addBatch( sql );
    }
    st.executeBatch();
}

(1.2) 使用PreparedStatement 批量插入,速度比1.1快

private void jdbc2() throws Exception
{
    Connection      conn    = DBUtil.getConnection();
    String          sql = "insert into user values (?,?,?,?)";
    PreparedStatement   st  = conn.prepareStatement( sql );
    for ( int i = 0; i < 5000; i++ )
    {
        st.setString( 1, "3001" );
        st.setString( 2, "武二郞" );
        st.setDate( 3, null );
        st.setDouble( 4, 9000 );
        st.addBatch();
    }
    st.executeBatch();
    System.out.println( new Date() );
    st.close();
    conn.close();
}

(1.3) 使用mybatis 批量插入 , 速度超快

分批插入,每批1000行

public void batchInsert( List<UserPO> list )
{
    int len = list.size();
    int mod = 1000;
    int n   = len % mod == 0 ? len / mod : len / mod + 1;
    int start   = 0;
    int pos = 0;
    int k   = mod;
    List    subList = null;
    for ( int i = 0; i < n; i++ )
    {
        if ( len / (i + 1) < mod )
        {
            k = len % mod;
        }
        pos += k;
        subList = list.subList( start, pos );
        userDao.batchInsert( subList );
        start += mod;
    }
}


public void batchInsert( List<UserPO> list )
{
    this.insert( "cn.demo.dao.IUserDao.batchInsert", list );
}


< insert id = "batchInsert" parameterType = "java.util.List" >
                        insert into user( userid, username )
                        values
                        <foreach item = "o" collection = "list" index = "ind" separator = ",">
                        (#
                         {
                             o.userId
                         }, # { o.userName })
                        < / foreach >
                        < / insert>

(1.4) 通过SqlSession批量插入

public void batchInsertJdbc3( List<UserPO> list ) throws Exception
{
    log.info( this.getClass() + " batchInsertJdbc3" );
    /*
     * 新获取一个模式为BATCH,自动提交为false的session
     * 如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出
     */
    SqlSession  session = this.getSqlSessionTemplate().getSqlSessionFactory().openSession( ExecutorType.BATCH, false );
    UserPO      user    = null;
    try{
        for ( int i = 0; i < list.size(); i++ )
        {
            user = list.get( i );
            session.insert( "cn.demo.dao.IUserDao.insertUser", user );
            if ( (i + 1) % 1000 == 0 || i == list.size() - 1 )
            {
                /*
                 * log.info(this.getClass()+" batchInsertJdbc3 commit " + i);
                 * 手动每1000个一提交,提交后无法回滚
                 */
                session.commit();
                /* 清理缓存,防止溢出 */
                session.clearCache();
            }
        }
    }catch ( Exception e ) {
        session.rollback();
        e.printStackTrace();
    }
    finally {
        session.close();
    }
}

喜欢的朋友可以关注下专栏:Java架构技术进阶
如果你是Java程序员,对技术提升很感兴趣,欢迎1~5年的工程师可以加入我的Java进阶之路来交流学习:878249276。里面都是同行,有资源共享,还有大量面试题以及解析。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用”没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

《Java实用笔记——mybatis批量导入》
《Java实用笔记——mybatis批量导入》

    原文作者:慕容千语
    原文地址: https://www.jianshu.com/p/ef100033d7b7
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞