一、批量操作
在某些场景下需要进行批量操作,如批量插入多少条数据等,在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
扫描二维码关注公众号,回复:
9698621 查看本文章