之前做批量插入SQL时都是用的<foreach>标签,但有时需要插入成千上万条语句,此时用<foreach>标签拼接的SQL就会非常大,有时数据库识别不了。<foreach> 标签作用组成一个非常大的批量插入SQL语句,让不同数据库去支持执行非常大的SQL语句;而mybatis本身设计了批量执行SQL的方法,让数据库一条一条的SQL语句执行,但不是每执行一条连接一次数据库,而是连接一次数据库,然后依次执行每条数据库。

一、批量插入SQL

目前数据库中数据如下

mysqlclient 批量执行sql 批量执行sql语句_数据库

执行批量插入数据如下

public static void testGetUserMap(){
        String resource = "conf.xml";
        InputStream in = MybaitsTest.class.getClassLoader().getResourceAsStream(resource);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);   
        /*获得session时,传入批量执行器ExecutorType.BATCH*/
        SqlSession session = factory.openSession(ExecutorType.BATCH);
        UserDao userDao = session.getMapper(UserDao.class);
        User user = new User(0, "wanger", 25);
        for(int i=0; i<10; i++){
            userDao.addUsers(user);
        }
        /*一定要执行commit,否则数据库中不会插入数据*/
        session.commit();
    }

执行上述方法,数据库中批量插入语数据

mysqlclient 批量执行sql 批量执行sql语句_SQL_02


其中id为自动增长的主键,7-14中缺失的部分数据,是因为之前出入数据时没有执行commit,所以没有插入到数据库中。注意:

mysqlclient 批量执行sql 批量执行sql语句_sql_03


如果在mybatis的配置位置xml文件中没有配置defaultExecutorType默认执行器的话,mybatis默认执行简单SQL语句,即一次数据库连接只发送一条SQL语句,此时要做批量执行需要用<foreach> 标签拼接成一个大SQL语句,然后一次执行完毕。或者用上述批量插入方法,在获得session时设置批量执行器。

默认配置如下

<settings>
        <setting name="defaultExecutorType" value="SIMPLE"/>
    </settings>

当然也可以在配置文件中设置批量执行,在执行SQL语句时就不需要再设置批量执行器了ExecutorType.BATCH,整个工程中的所有SQL语句都会使用批量执行的方式。

<settings>
        <setting name="defaultExecutorType" value="BATCH"/>
    </settings>

此种方法不可取,还是采用上面的默认配置方式,然后在获取session时设置批量执行器。

二、spring集成mybatis时批量执行

需要在spring的配置xml文件中加入下面的配置

<!--配置一个可以进行批量执行的sqlSession  -->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryBean"></constructor-arg>
        <constructor-arg name="executorType" value="BATCH"></constructor-arg>
    </bean>

然后在做批量执行的时候,获得这个session就可以

@Autowired
    private SqlSession sqlSession;

    public List<User> getUsers(){
        UserDao userDao= sqlSession.getMapper(UserDao .class);
        return userDao.getUsers();
    }