MyBatis 批量插入数据的两种方式

一种是使用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语句解析器的负担

猜你喜欢

转载自www.cnblogs.com/esrevinud/p/12303208.html