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

作者: 程序员北游 | 来源:发表于2019-03-25 17:12 被阅读48次

    写在前面

    喜欢的朋友可以关注下专栏: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批量导入

        本文链接:https://www.haomeiwen.com/subject/lxybvqtx.html