您的位置:首页 > 数据库

Mybatis之批量执行SQL语句

2018-01-28 16:04 387 查看
之前做批量插入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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: