您的位置:

Mybatis批量新增详解

一、mybatis批量新增sql语句

在进行mybatis批量新增时,我们需要先了解mybatis批量新增的sql语句是怎样的。在mybatis中,批量新增使用的是insert标签,其中包含了collection和foreach两个标签。collection用来指定要插入的数据集合,foreach则用于对数据集合进行遍历。

<insert id="insertList">
   insert into table_name(field1,field2,...)
   values
   <foreach collection="list" item="item" separator=",">
     (#{item.field1}, #{item.field2}, ...)
   </foreach>
</insert>

在上面的sql语句中,insertList是新增语句的唯一标识符,list是数据集合的名字,item则是数据集合中的单个数据对象。separator则是数据之间的分隔符,在本例中表示每个数据对象之间使用逗号分隔。

二、mybatis的批量新增

在mybatis中,批量新增数据是非常容易的。只需要在mapper.xml文件中编写批量新增sql语句,并在Mapper接口中定义对应方法即可。

假设我们有一个User实体类,包含id、name、age三个属性。下面是批量新增User的一个简单示例。

//Mapper接口
public interface UserMapper {
    void batchInsert(List<User> userList);
}

//Mapper.xml文件中的sql语句
<insert id="batchInsert">
    insert into user(name,age)
    values
    <foreach collection="list" item="user" separator=",">
        (#{user.name},#{user.age})
    </foreach>
</insert>

在上面的示例中,我们定义了一个批量插入的方法batchInsert,该方法接受一个User列表作为参数,并在Mapper.xml文件中使用foreach语句进行遍历。

三、mybatis批量新增数据太大

在实际开发中,我们可能会遇到批量新增数据量太大的问题。此时,我们可能需要拆分数据,分批进行插入。例如,每次只插入1000条数据。

下面是一个示例,演示了如何分批插入数据。

//Mapper接口
public interface UserMapper {
    void batchInsert(List<User> userList);
}

//Mapper.xml文件中的sql语句
<insert id="batchInsert">
    insert into user(name,age)
    values
    <foreach collection="list" item="user" separator=",">
        (#{user.name},#{user.age})
    </foreach>
</insert>
//Java代码
public static void insertBatchBySqlSessionTemplate(List<User> list, int batchCount) {
    SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
    try {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int batchLastIndex = batchCount;
        for (int index = 0; index < list.size();) {
            if (batchLastIndex > list.size()) {
                batchLastIndex = list.size();
                mapper.batchInsert(list.subList(index, batchLastIndex));
                sqlSession.commit();
                break;
            } else {
                mapper.batchInsert(list.subList(index, batchLastIndex));
                sqlSession.commit();
                index = batchLastIndex;
                batchLastIndex = index + (batchCount - 1);
            }
        }
    } finally {
        sqlSession.close();
    }
}

上面的代码中,我们使用了sqlSession的batch模式进行批量插入。在循环过程中,我们将数据拆分为多个小批次,每个小批次插入batchCount条数据。注意,在循环结束后需要手动提交一次事务。

四、mybatis批量新增报参数没发现

在进行mybatis批量新增时,可能会遇到参数没发现的异常。这通常是由于我们没有正确地配置mybatis的参数类型所造成的。

在mapper.xml文件中,我们需要为insert语句配置参数类型,如果使用了JavaBean进行数据绑定,则可以使用parameterType属性指定JavaBean的全路径。

<insert id="batchInsert" parameterType="com.xxx.User">
    insert into user(name,age)
    values
    <foreach collection="list" item="user" separator=",">
        (#{user.name},#{user.age})
    </foreach>
</insert>

五、mybatis批量新增数据

mybatis批量新增数据的效率是非常高的,因为它是通过SQL的批量操作实现的,而非循环的单个操作。下面是一个简单的数据对比,展示了批量插入和单个插入所需时间的差别。

//单个插入
for (int i = 0; i < 10000; i++) {
    User user = new User();
    user.setName("user" + i);
    user.setAge(i);
    userMapper.insert(user);
}

//批量插入
List<User> userList = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
    User user = new User();
    user.setName("user" + i);
    user.setAge(i);
    userList.add(user);
}
userMapper.batchInsert(userList);

在上面的示例中,我们分别进行了单个插入和批量插入操作。结果表明,批量插入所需的时间仅为单个插入所需时间的1/4。

六、mybatis批量新增效率

mybatis批量新增的效率非常高,这也是它受到普及的原因之一。因为批量操作可以一次性将多条数据插入到数据库中,同时只需要建立一次连接,相对于循环单个插入而言,大大提高了系统的整体性能。

为了进一步提高mybatis批量新增的效率,我们可以在开发中注意以下几点:

  1. 尽量减少数据库IO操作。
  2. 尽量使用in批量操作,减少数据库查询次数。
  3. 尽量使用纯SQL操作,避免使用ORM框架等。
  4. 使用缓存,避免重复查询。

七、mybatis批量新增一万条数据

mybatis批量新增一万条数据,实际上也是非常容易的。只需要编写一个新增方法,同时将数据拆分为多个小批次插入数据库即可。

//新增方法
public void batchInsert(List<User> userList) {
    int times = userList.size() % 5000 == 0 ? userList.size() / 5000 : userList.size() / 5000 + 1;
    for (int i = 0; i < times; i++) {
        int fromIndex = i * 5000;
        int toIndex = (i + 1) * 5000;
        if (toIndex > userList.size()) {
            toIndex = userList.size();
        }
        List<User> subList = userList.subList(fromIndex, toIndex);
        userMapper.batchInsert(subList);
    }
}

在上面的代码中,我们将数据拆分为多个小批次,每个小批次插入5000条数据。由于批量插入的效率非常高,因此不必担心性能问题。

八、mybatis批量新增修改

mybatis批量新增修改也非常容易。在mapper.xml文件中,我们只需要编写一条新增修改的sql语句,同时在Mapper接口中定义对应的方法即可。

//Mapper接口
public interface UserMapper {
    void batchInsertOrUpdate(List<User> userList);
}

//Mapper.xml文件中的sql语句
<insert id="batchInsertOrUpdate">
    insert into user(name,age,phone)
    values
    <foreach collection="list" item="user" separator=",">
        (#{user.name},#{user.age},#{user.phone})
        on duplicate key update
        name = values(name), age = values(age), phone = values(phone)
    </foreach>
</insert>

在上面的代码中,我们将新增修改的sql语句中添加了一个on duplicate key update子句,用于在有重复数据时执行修改操作。

九、mybatis批量新增sql

mybatis的批量新增操作使用的是insert标签,同时还需要使用foreach标签对数据集合进行遍历。下面是一个简单的例子,演示了mybatis批量新增sql语句的写法。

<insert id="batchInsert">
    insert into user(name,age)
    values
    <foreach collection="list" item="user" separator=",">
        (#{user.name},#{user.age})
    </foreach>
</insert>

在上面的代码中,我们定义了一个批量新增的sql语句batchInsert,使用了foreach标签对user列表进行遍历,并进行数据插入。在新增数据时,采用了#{user.name}的方式进行数据绑定。

十、总结

通过本文的批量新增详解,我们了解了mybatis批量新增的sql语句、批量新增数据太大、报参数未发现、批量新增效率等方面的内容。同时,本文还给出了多个实例,示范了如何编写mybatis批量新增的sql语句、如何根据数据量进行数据拆分、如何使用批量新增修改等操作。