MyBatis 批量插入数据实现(MySQL)

假如需要搬一万块砖到楼顶,有一部电梯,电梯一次可以放适量的砖(最多放 500)。可以选择一次运送一块砖,也可以一次运送 500 块砖,哪个时间消耗大?

一、sql 层面实现数据插入

  1. 单条插入数据的写法:
insert into table ([列名],[列名])  values ([列值],[列值]));
或:
insert into table values ([列值],[列值]));
  1. 批量插入
    一种可以在代码中循环执行上面的语句,但是这种效率太差。另一种,可以用MySQL支持的批量插入语句,这种方式更高效。
insert into table  ([列名],[列名]) 
 VALUES
([列值],[列值]),
([列值],[列值]),
([列值],[列值]);

批量的好处:可以避免程序和数据库建立多次连接,增加服务器负荷。

二、MyBatis 层面批量插入数据到数据库

两种方式:xml 文件和注解。使用批量插入执行的 sql 语句应该等价于:

 insert into table (id, name,sex,address)
 values
 (?,?,?,?),(?,?,?,?),(?,?,?,?),(?,?,?,?)

1️⃣xml 配置

最基础的是用 mapping.xml 配置的方式,包括以下两种具体方式:

  1. mapping.xml 中 insert 语句可以写成单条插入,在调用方循环 1000 次
<!-- 在外部for循环调用1000次 -->
<insert id="insert" parameterType="com.xxp.mybatis.Person">
    insert into person (id, name,sex,address)
    values 
    (#{id,jdbcType=INTEGER},#{name,jdbcType=VARCHAR},
    #{sex,jdbcType=VARCHAR},#{address,jdbcType=VARCHAR})
</insert>
  1. mapping.xml 中 insert 语句写成一次性插入一个 1000 的 list
<insert id="insertBatch" >
    insert into person ( <include refid="Base_Column_List" /> ) 
    values 
    <foreach collection="list" item="item" index="index" separator=",">
        (null,#{item.name},#{item.sex},#{item.address})
    </foreach>
</insert>

参数解释
foreach 的主要作用在构建 in 条件中,它可以在 sql 语句中进行迭代一个集合。foreach 元素的属性主要有 collection,item,separator,index,open,close。

  1. collection:指定要遍历的集合。表示传入过来的参数的数据类型。该属性是必须指定的,要做 foreach 的对象。在使用 foreach 的时候最关键的也是最容易出错的就是 collection 属性。在不同情况 下,该属性的值是不一样的,主要有一下 3 种情况:
    a. 如果传入的是单参数且参数类型是一个 List 的时候,collection 属性值为 list。
    b. 如果传入的是单参数且参数类型是一个数组的时候,collection 的属性值为 array。
    c. 如果传入的参数是多个的时候,就需要把它们封装成 Map,当然单参数也可以封装成 Map。Map 对象没有默认的键。

  2. item:表示集合中每一个元素进行迭代时的别名。将当前遍历出的元素赋值给指定的变量,然后用#{变量名},就能取出变量的值,也就是当前遍历出的元素。

  3. separator:表示在每次进行迭代之间以什么符号作为分隔符。select * from tab where id in(1,2,3)相当于1,2,3之间的","

  4. index:索引。index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置。遍历 list 的时候 index 就是索引,遍历 map 的时候 index 表示的就是 map 的 key,item 就是 map 的值。

  5. open/close:表示该语句以什么开始/结束。

mapper 接口中的使用:

public interface TabMapper {
    public List<Tab> getTabsByConditionLike(@Param("list")List<Integer> ids);
}

2️⃣注解

MyBatis 提供用于插入数据的注解有两个:@insert,@InsertProvider。类似还有:@DeleteProvider、@UpdateProvider和@SelectProvider。
作用:
用来在实体类的 Mapper 类里注解保存方法的 sql 语句。
区别:
@Insert 是直接配置 sql 语句,而 @InsertProvider 则是通过 sql 工厂类及对应的方法生产 sql 语句,这种方法的好处在于,可以根据不同的需求生产出不同的 sql,适用性更好。
使用:

@Insert("insert into blog(blogId,title,author) values(#blogId,#title,#author)"public boolean saveBlog(Blog blog);
@InsertProvider
在 mapper 接口中的方法上使用 @InsertProvider 注解:

参数解释:
type 为工厂类的类对象,
method 为对应的工厂类中的方法,方法中的 @Param(“list”) 是因为批量插入传入的是一个 list,但是 Mybatis 会将其包装成一个 map。其中 map 的 key 为“list”,value为传入的 list。

三、xml/注解两种方式的区别

1️⃣foreach 相当语句逐条 insert 语句执行,将出现如下问题:

  1. mapper 接口的 insert 方法返回值将是最后一条 insert 语句的操作成功的记录数目(就是0或1),而不是所有 insert 语句的操作成功的总记录数目;
  2. 当其中一条不成功时,不会进行整体回滚。

2️⃣注解方式:当有一条插入不成功时,会整体回滚。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Mybatis可以通过使用批量插入的方式来提高数据插入的效率。具体步骤如下: 1. 在Mapper.xml文件中编写批量插入的SQL语句,例如: ``` <insert id="batchInsert" parameterType="java.util.List"> insert into user (name, age) values <foreach collection="list" item="item" separator=","> (#{item.name}, #{item.age}) </foreach> </insert> ``` 2. 在Java代码中调用Mapper接口的批量插入方法,例如: ``` List<User> userList = new ArrayList<>(); // 添加多个User对象到userList中 userMapper.batchInsert(userList); ``` 3. 在Mybatis的配置文件中开启批量插入的支持,例如: ``` <configuration> <settings> <setting name="jdbc.batch_size" value="100"/> </settings> </configuration> ``` 其中,jdbc.batch_size表示每次批量插入数据量,可以根据实际情况进行调整。 以上就是使用Mybatis批量插入数据MySQL的方法。 ### 回答2: Mybatis是一款优秀的ORM框架,通过Mybatis我们可以很方便地进行数据的CRUD操作。 在实际开发中,有时我们需要批量插入数据MySQL数据库中,Mybatis也提供了非常方便的解决方案。 Mybatis批量插入数据MySQL的具体实现方式如下: 1. 创建一个DAO对象,用于与Mapper文件进行交互。 2. 在Mapper文件中定义一个批量插入数据的SQL语句,并使用foreach标签进行遍历。 3. 在DAO对象中调用mybatis提供的批量执行SQL语句的方法。 下面我们详细介绍一下这三个步骤的实现细节: 1. 创建一个DAO对象 创建DAO对象的过程和Mybatis普通操作数据库是相同的。在Spring框架中,我们可以通过注入SqlSession对象来操作数据库。具体如下: // 定义DAO对象 @Repository public class UserDaoImpl implements UserDao { // 注入SqlSession对象 @Autowired private SqlSession sqlSession; // 批量插入数据方法 public void batchInsert(List<User> userList) { // 调用Mapper文件中定义的SQL语句 sqlSession.insert("UserMapper.batchInsert", userList); } } 2. 定义批量插入SQL语句 在Mapper文件中定义一个批量插入的SQL语句,并使用foreach标签进行遍历。具体如下: <!-- 批量插入用户数据 --> <insert id="batchInsert" parameterType="java.util.List"> insert into user (username, age, gender) values <foreach collection="list" item="user" separator=","> (#{user.username}, #{user.age}, #{user.gender}) </foreach> </insert> 上述SQL语句中,我们使用了foreach标签进行遍历,并使用separator属性指定了每一条SQL语句之间的分隔符。 3. 调用批量执行SQL语句的方法 调用Mybatis提供的批量执行SQL语句的方法,具体如下: // 使用SqlSession批量执行SQL语句 sqlSession.flushStatements(); 注意,如果要进行批量操作,我们需要将所有SQL语句的执行结果全部缓存起来,然后一次性将缓存的数据提交至MySQL数据库中。上述代码中的flushStatements()方法就是将缓存的数据提交至MySQL数据库中。 通过以上三个步骤,我们就可以在Mybatis中完成数据批量插入操作了。此方法不仅提高了代码执行效率,而且减少了与MySQL之间的IO开销,从而有效的提高了系统的性能。 ### 回答3: Mybatis 是一款流行的 Java 持久化框架,它提供了一种简单的方式来访问和操作数据库。在大量数据插入的情况下,Mybatis批量插入功能能够显著提高插入性能。 在 Mybatis 中,批量插入数据MySQL 可以通过 SQL 批量执行来实现。以下是实现批量插入数据的步骤: 1. 创建一个数据源和一个 SqlSessionFactory 对象。数据源是连接数据库的关键。SqlSessionFactory 实例化后用来创建 SqlSession。 2. 创建一个 SqlSession 对象。SqlSession 是与数据库交互的主要对象。 3. 批量插入前,需要准备好要插入数据。可以通过编写一个循环,或者使用工具类来读取数据源,把数据封装到一个对象列表中。 4. 在 Mybatis 的 Mapper XML 文件中,编写插入数据的 SQL 语句。通过使用 INSERT INTO VALUES 语法,可以实现批量插入数据。其中,VALUES 后面跟的是插入值的列表,每个列表代表一行。 5. 调用 SqlSession 的批处理方法,将插入 SQL 和数据列表传递给它。 6. 执行 SQL 批处理方法。Mybatis 会将 SQL 语句和参数封装到批处理对象中,并使用 JDBC 批量更新函数执行批量插入。 7. 最后,关闭 SqlSession 对象和数据库连接。 总之,Mybatis批量插入功能非常方便、高效,可以显著提高数据插入的性能。在实际项目中,我们可以根据具体需求选择合适的批处理方式,来实现高效的数据插入操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值