mybatis 插入大量數據效率對比,foreach插入、SqlSession批量插入、sql插入

使用mybatis插入數據執行效率對比,對比三種方式,

1 使用 SqlSessionFactory,每1000條數據執行一次提交

2 使用mybatis-plus框架的insert方法,for循環,每次執行一次插入

3 使用ibatis,純sql插入

先貼出執行效果(數字代表執行的時間,單位毫秒):

 

測試代碼:

//測試類
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class Test1 {

    @Autowired
    UsersMapper usersMapper;

    @Autowired
    SqlSessionFactory sqlSessionFactory;
    public List<Users> list = new ArrayList<>();

    @Before
    public void  getList() {
        long start = System.currentTimeMillis();
        Users user;
        for (int i = 1; i <=50000 ; i++) {
            user = new Users();
            user.setId(i);
            user.setName("java");
            user.setAge(200);
            user.setManagerId(222);
            list.add(user);
        }
        System.out.println("拼裝數據 耗時:"+(System.currentTimeMillis()-start));
        System.out.println(list.size());
    }


    @Test
    public void batchInsert() {
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
        UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
        System.out.println("batchInsert 插入開始========");
        long start = System.currentTimeMillis();
        for (int i = 0; i < list.size(); i++) {
            mapper.insert(list.get(i));
            if (i%5000==4999) {
                sqlSession.flushStatements();
//                sqlSession.commit();
//                sqlSession.clearCache();
            }
        }
//        sqlSession.commit();
//        sqlSession.clearCache();
        sqlSession.flushStatements();
        System.out.println("SqlSession 批量插入耗時:"+(System.currentTimeMillis()-start));
    }

    @Test
    public void forEachInsert() {
        System.out.println("forEachInsert 插入開始========");
        long start = System.currentTimeMillis();
        for (int i = 0; i < list.size(); i++) {
            usersMapper.insert(list.get(i));
        }
        System.out.println("foreach 插入耗時:"+(System.currentTimeMillis()-start));
    }

    @Test
    public void sqlInsert() {
        System.out.println("sql 插入開始========");
        long start = System.currentTimeMillis();
        usersMapper.sqlInsert(list);
        System.out.println("sql 插入耗時:"+(System.currentTimeMillis()-start));
    }

}

//sql插入相關類
@Repository
public interface UsersMapper extends BaseMapper<Users> {

    @InsertProvider(type = UsersProvider.class, method = "insertListSql")
    public void sqlInsert(List<Users> list);
}

public class UsersProvider {

    public String insertListSql(List<Users> list) {
        StringBuffer sqlList = new StringBuffer();

        sqlList.append(" INSERT INTO users(id,name,age,manager_id)  VALUES ");
        for (int i = 0; i < list.size() ; i++) {
            Users user = list.get(i);
            sqlList.append(" (").append(user.getId()).append(",").append("'").append(user.getName()).append("',").append(user.getAge())
                    .append(",").append(user.getManagerId()).append(")");
            if (i < list.size()-1) {
                sqlList.append(",");
            }
        }
        return sqlList.toString();
    }
}

總結:

sql插入的效率最高,sqlsession次之,mybatis框架foreach插入效率最低。

執行效率echar圖:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章