mybatis(6)—实现批量操作allowMultiQueries=true配置

mybatis&&数据库优化&&缓存目录

数据准备

CREATE TABLE `user_t` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(10) CHARACTER SET latin1 DEFAULT NULL,
  `password` varchar(10) CHARACTER SET latin1 DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=128 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
@RestController
public class TransactionController {
    @Resource
    private UserTMapper userTMapper;
    private List userTList;
    private List updateList;
    {
        userTList = new ArrayList<>();
        userTList.add(new UserT("LiBai", "123", 14));
        userTList.add(new UserT("Tom", "124", 13));
        userTList.add(new UserT("Tonny", "12", 11));
        userTList.add(new UserT("Unix", "13", 10));
    }
    {
        updateList = new ArrayList<>();
        updateList.add(new UserT(128, "Tom_2"));
        //更新这个参数时会发生异常。但是之前操作并不会回滚。
        updateList.add(new UserT(129, "1111111111111111111111111111111adsdsadsadsadas"));
        updateList.add(new UserT(130, "uninx_2"));
    }
    /**
     * 批量插入数据
     *
     * @return
     */
    @RequestMapping("/listUser")
    public List insertUser2() {
        userTMapper.batchSave(userTList);
        return userTList;
    }

    /**
     * 批量更新数据
     *
     * @return
     */
    @RequestMapping("/listUpdate")
    public List updateUser2() {
        userTMapper.batchUpdate(updateList);
        return userTList;
    }
}
public interface UserTMapper {
    void batchSave(@Param(value = "list") List userTList);
    void batchUpdate(@Param(value = "list") List userTList);
}



    
        insert into user_t (user_name, password,
        age)
        VALUES
        
            (
            #{item.userName,jdbcType=VARCHAR},
            #{item.password,jdbcType=VARCHAR},
            #{item.age,jdbcType=INTEGER}
            )
        
    
    
        
            UPDATE user_t
            SET user_name = #{item.userName}
            WHERE  id= #{item.id}
        
    

批量插入时,可以构建多个value()。最终与数据库执行时只是一条sql语句。

但是在xml中进行批量更新时,会执行多条sql语句。但mybatis会抛出异常,即不允许多条语句同时执行。

实现批量操作:

在url后面增加allowMultiQueries=true配置。

spring:
  datasource:
    name: mysql_test
    type: com.alibaba.druid.pool.DruidDataSource
    #druid相关配置
    druid:
      url: jdbc:mysql://localhost:3306/test_db?allowMultiQueries=true
#      url: jdbc:mysql://localhost:3306/test_db
      username: root
      password: 123qwe

但是需要注意:该批量操作的sql语句并未在一个commit中,效果等同于代码中使用for循环去更新sql。

你可能感兴趣的:(mybatis(6)—实现批量操作allowMultiQueries=true配置)