Mybatis从入门到精通——批量操作(11)

一、批量操作

在某些场景下需要进行批量操作,如批量插入多少条数据等,在Mybatis中共有两种方式进行批量操作,第一种是使用foreach标签一次性插入多条;第二种是使用BATCH执行器,每次提交一条,到达一定数量后手动一次性提交。

 

二、foreach批量操作

mapper文件:

    <insert id="insertPersonList" >
        insert into person(id,name,age,sex,address,telephone)
        values
        <foreach collection="list" separator="," item="person">
            (
                #{person.id},
                #{person.name},
                #{person.age},
                #{person.sex},
                #{person.address},
                #{person.telephone}
            )
        </foreach>
    </insert>

测试代码:

public class MybatisTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void init() throws IOException {
        String resource = "mybatis-config.xml";
        //1.使用mybatis的工具读取配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //2.创建sqlSessionFactory
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        inputStream.close();
    }


    /**
     * 测试 foreach标签
     */
    @Test
    public void testForeach() {
        //3.获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.获取mapper接口实现类
        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
        //5.调用方法
        List<Person> personList = new ArrayList<Person>();
        for (int j = 0; j < 1000; j++) {
            Person person = new Person();
            person.setTelephone("123111");
            person.setAge(18);
            person.setAddress("test");
            person.setSex("男");
            person.setName("foreach" + j);
            personList.add(person);
        }
        personMapper.insertList(personList);
        //6.释放资源
        sqlSession.close();
    }

}

 

三、BATCH执行器

mapper文件:

    <insert id="insert" parameterType="com.my.entity.Person" keyProperty="id" useGeneratedKeys="true">
        insert into person(id,name,sex,telephone,address,age)
        values(#{id},#{name},#{sex},#{telephone},#{address},#{age})
    </insert>

测试代码:

public class MybatisTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void init() throws IOException {
        String resource = "mybatis-config.xml";
        //1.使用mybatis的工具读取配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //2.创建sqlSessionFactory
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        inputStream.close();
    }


    /**
     * 测试Batch执行器
     */
    @Test
    public void testBatch() {
        //3.获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
        //4.获取mapper接口实现类
        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
        //5.调用方法
        List<Person> personList = new ArrayList<Person>();
        for (int j = 0; j < 1000; j++) {
            Person person = new Person();
            person.setTelephone("123111");
            person.setAge(18);
            person.setAddress("test");
            person.setSex("男");
            person.setName("batch" + j);
            personList.add(person);
            personMapper.insert(person);
        }
        sqlSession.commit();
        //6.释放资源
        sqlSession.close();
    }

}

四、补充说明

1.性能对比:在经过多次测试后,使用foreach标签的效率比Batch执行器高一些。

2.两者都不适合一次性提交几万条,如果对于大数据量,最好进行分批操作,每次提交几千条。

3.对于批量更新操作的话,还需要在Mybatis数据源的配置url上添加 allowMultiQueries=true

发布了61 篇原创文章 · 获赞 81 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/m0_37914588/article/details/104741093