前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java实用笔记——mybatis批量导入

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

作者头像
慕容千语
发布2019-06-11 23:34:23
1.1K0
发布2019-06-11 23:34:23
举报

(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();
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.03.25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (1.1) 使用Statement 批量插入
  • (1.2) 使用PreparedStatement 批量插入,速度比1.1快
  • (1.3) 使用mybatis 批量插入 , 速度超快
  • (1.4) 通过SqlSession批量插入
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档