一种是使用mapper文件中的foreach
标签拼接sql
, 另一种则更使用SqlSession
中的ExecutorType.BATCH
开启批量操作会话
使用foreach
标签拼接
public interface UserDao {
public Integer addUserForeach(List<User> user);
}
mapper
<insert id="addUserForeach" parameterType="learn.mybatis.entity.User">
insert into users(username, password) values
<foreach collection="collection" item="user" separator=",">
(#{user.username}, #{user.password})
</foreach>
</insert>
插入集合类
@Test
public void addUserByBatch() {
SqlSession sqlSession = null;
User user = null;
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> users = new ArrayList<User>();
for (int i = 0; i < 1000; i ++) {
user = new User("user" + i, "hello * " + i);
users.add(user);
}
userDao.addUserForeach(users);
sqlSession.commit();
} catch (IOException e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}
开启ExecutorType.BATCH
会话
dao
层接口
public interface UserDao {
public Integer addUser(User user);
}
mapper
<insert id="addUser" useGeneratedKeys="true" keyProperty="id" keyColumn="id" parameterType="learn.mybatis.entity.User">
insert into users(username, password) values(#{username}, #{password})
</insert>
使用BATCH
会话
@Test
public void addUserByBatch() {
SqlSession sqlSession = null;
User user = null;
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 开启批处理会话
sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserDao userDao = sqlSession.getMapper(UserDao.class);
for (int i = 0; i < 1000; i ++) {
user = new User("user" + i, "hello * " + i);
userDao.addUser(user);
}
sqlSession.commit();
} catch (IOException e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}
个人感觉还是第二种方式更加直观方便一点,况且由于前者渲染的SQL
语句可能会很长,也会增加SQL
语句解析器的负担