之前做批量插入SQL时都是用的<foreach>
标签,但有时需要插入成千上万条语句,此时用<foreach>
标签拼接的SQL就会非常大,有时数据库识别不了。<foreach>
标签作用组成一个非常大的批量插入SQL语句,让不同数据库去支持执行非常大的SQL语句;而mybatis本身设计了批量执行SQL的方法,让数据库一条一条的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();
}
执行上述方法,数据库中批量插入语数据
其中id为自动增长的主键,7-14中缺失的部分数据,是因为之前出入数据时没有执行commit,所以没有插入到数据库中。
注意:
如果在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();
}