精华内容
下载资源
问答
  • MybatisPlus批量更新

    千次阅读 2020-12-08 10:28:43
    MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。 UPDATE course SET name = CASE id WHEN 1 THEN 'name1' WHEN 2 THEN 'name2' WHEN 3 THEN 'name3' END, title = CASE id...
    在这里插一条记录update一次,性能比较差,容易造成阻塞。
    
    MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。
    UPDATE course
        SET name = CASE id 
            WHEN 1 THEN 'name1'
            WHEN 2 THEN 'name2'
            WHEN 3 THEN 'name3'
        END, 
        title = CASE id 
            WHEN 1 THEN 'New Title 1'
            WHEN 2 THEN 'New Title 2'
            WHEN 3 THEN 'New Title 3'
        END
    WHERE id IN (1,2,3)
    这条sql的意思是,如果id为1,则name的值为name1,title的值为New Title1;依此类推。
    
    在Mybatis中的配置则如下:
    <update id="updateBatch" parameterType="list">
                update course
                <trim prefix="set" suffixOverrides=",">
                 <trim prefix="peopleId =case" suffix="end,">
                     <foreach collection="list" item="i" index="index">
                             <if test="i.peopleId!=null">
                              when id=#{i.id} then #{i.peopleId}
                             </if>
                     </foreach>
                  </trim>
                  <trim prefix=" roadgridid =case" suffix="end,">
                     <foreach collection="list" item="i" index="index">
                             <if test="i.roadgridid!=null">
                              when id=#{i.id} then #{i.roadgridid}
                             </if>
                     </foreach>
                  </trim>
                  
                  <trim prefix="type =case" suffix="end," >
                     <foreach collection="list" item="i" index="index">
                             <if test="i.type!=null">
                              when id=#{i.id} then #{i.type}
                             </if>
                     </foreach>
                  </trim>
         		<trim prefix="unitsid =case" suffix="end," >
                      <foreach collection="list" item="i" index="index">
                              <if test="i.unitsid!=null">
                               when id=#{i.id} then #{i.unitsid}
                              </if>
                      </foreach>
               </trim>
                 </trim>
                where
                <foreach collection="list" separator="or" item="i" index="index" >
                  id=#{i.id}
              </foreach>
    </update>
    
    展开全文
  • 主要介绍了Mybatis批量更新三种方式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要介绍了Mybatis中使用updateBatch进行批量更新的相关资料,有逐条更新,sql批量更新等,具体实例代码大家参考下本
  • 测试在单元测试中
  • MybatisPlus实现批量插入更新数据库

    千次阅读 2020-12-13 19:10:27
    文章目录MybatisPlus实现批量插入更新数据库 MybatisPlus实现批量插入更新数据库 <insert id="batchSaveOrUpdate" parameterType="java.util.List"> INSERT INTO user (<include refid="field" />) ...

    MybatisPlus实现批量插入更新数据库
     <insert id="batchSaveOrUpdate" parameterType="java.util.List">
            INSERT INTO
            user (<include refid="field" />)
            <
    展开全文
  • 数据为多条数据,根据特定字段,做插入更新,即数据库有数据就更新(update);没有数据则执行insert操作; mybatisplus有没有合适的方法,或者原生mybatis方法
  • MP的BaseMapper没有提供批量的DML操作。 但是在IService接口中却定义了这些常用操作 定义一个接口 import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.stereotype.Service; ...

    MP的BaseMapper没有提供批量的DML操作。

    但是在IService接口中却定义了这些常用操作

    定义一个接口
    import com.baomidou.mybatisplus.extension.service.IService;
    import org.springframework.stereotype.Service;
    import top.yumbo.springcloud.car.entity.Car;// 自定义的实体
    
    @Service
    public  interface  TCarIService extends IService<Car> {
    }
    
    定义接口实现类
    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import org.springframework.stereotype.Service;
    import top.yumbo.springcloud.car.dao.TCarDao;
    import top.yumbo.springcloud.car.entity.Car;
    
    @Service
    public class TCarIServiceImpl extends ServiceImpl<TCarDao, Car> implements TCarIService{
    }
    

    同时需要有Dao层的那个接口

    dao层接口的定义
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import org.apache.ibatis.annotations.Mapper;
    import org.springframework.stereotype.Component;
    import top.yumbo.springcloud.car.entity.Car;
    
    @Mapper
    @Component
    public interface TCarDao extends BaseMapper<Car> {
    
    }
    

    实体Car的配置参考例子,使用了lombok所以代码如下

    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    import lombok.*;
    
    import java.io.Serializable;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Getter
    @Setter
    @TableName(value = "t_car")
    public class Car implements Serializable {
      @TableId
      private long carId;
      private String carType;
      private String carBrand;
      private String carColor;
      private double carPrice;
      private String carDescription;
      private String carInfo;
      private String carArea;
      private String carImage;
      private String carRegtime;
      private String carMileage;
      private String carStatus;
    }
    

    yml配置

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/mp?useSSL=false&serverTimezone=GMT%2B8
        username: root
        password: 123456
    mybatis-plus:
      configuration:
        map-underscore-to-camel-case: true  # 开启驼峰命名
    

    更详细的项目搭建参考我之前发布的博客:mybatis-plus入门

    展开全文
  • 这篇文章主要介绍mybatisplus添加真正的批量新增、批量更新的实现方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 使用mybatis-plus来进行批量新增和更新时,你会发现其实是一条条sql...

    这篇文章主要介绍mybatisplus添加真正的批量新增、批量更新的实现方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

    使用mybatis-plus来进行批量新增和更新时,你会发现其实是一条条sql执行,下面进行优化。

    1.添加InsertBatchMethod和UpdateBatchMethod类

    import com.baomidou.mybatisplus.core.injector.AbstractMethod;
    import com.baomidou.mybatisplus.core.metadata.TableInfo;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.ibatis.executor.keygen.NoKeyGenerator;
    import org.apache.ibatis.mapping.MappedStatement;
    import org.apache.ibatis.mapping.SqlSource;
     
    /**
     * 批量插入方法实现
     */
    @Slf4j
    public class InsertBatchMethod extends AbstractMethod {
      @Override
      public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        final String sql = "<script>insert into %s %s values %s</script>";
        final String fieldSql = prepareFieldSql(tableInfo);
        final String valueSql = prepareValuesSql(tableInfo);
        final String sqlResult = String.format(sql, tableInfo.getTableName(), fieldSql, valueSql);
        //log.debug("sqlResult----->{}", sqlResult);
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
        return this.addInsertMappedStatement(mapperClass, modelClass, "insertBatch", sqlSource, new NoKeyGenerator(), null, null);
      }
     
      private String prepareFieldSql(TableInfo tableInfo) {
        StringBuilder fieldSql = new StringBuilder();
        fieldSql.append(tableInfo.getKeyColumn()).append(",");
        tableInfo.getFieldList().forEach(x -> fieldSql.append(x.getColumn()).append(","));
        fieldSql.delete(fieldSql.length() - 1, fieldSql.length());
        fieldSql.insert(0, "(");
        fieldSql.append(")");
        return fieldSql.toString();
      }
     
      private String prepareValuesSql(TableInfo tableInfo) {
        final StringBuilder valueSql = new StringBuilder();
        valueSql.append("<foreach collection=\"list\" item=\"item\" index=\"index\" open=\"(\" separator=\"),(\" close=\")\">");
        valueSql.append("#{item.").append(tableInfo.getKeyProperty()).append("},");
        tableInfo.getFieldList().forEach(x -> valueSql.append("#{item.").append(x.getProperty()).append("},"));
        valueSql.delete(valueSql.length() - 1, valueSql.length());
        valueSql.append("</foreach>");
        return valueSql.toString();
      }
    }
    
    import com.baomidou.mybatisplus.core.injector.AbstractMethod;
    import com.baomidou.mybatisplus.core.metadata.TableInfo;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.ibatis.mapping.MappedStatement;
    import org.apache.ibatis.mapping.SqlSource;
     
    /**
     * 批量更新方法实现,条件为主键,选择性更新
     */
    @Slf4j
    public class UpdateBatchMethod extends AbstractMethod {
      @Override
      public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        String sql = "<script>\n<foreach collection=\"list\" item=\"item\" separator=\";\">\nupdate %s %s where %s=#{%s} %s\n</foreach>\n</script>";
        String additional = tableInfo.isWithVersion() ? tableInfo.getVersionFieldInfo().getVersionOli("item", "item.") : "" + tableInfo.getLogicDeleteSql(true, true);
        String setSql = sqlSet(tableInfo.isWithLogicDelete(), false, tableInfo, false, "item", "item.");
        String sqlResult = String.format(sql, tableInfo.getTableName(), setSql, tableInfo.getKeyColumn(), "item." + tableInfo.getKeyProperty(), additional);
        //log.debug("sqlResult----->{}", sqlResult);
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
        // 第三个参数必须和RootMapper的自定义方法名一致
        return this.addUpdateMappedStatement(mapperClass, modelClass, "updateBatch", sqlSource);
      } 
    }
    

    2.添加自定义方法SQL注入器

    import com.baomidou.mybatisplus.core.injector.AbstractMethod;
    import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
     
    import java.util.List;
     
    public class CustomizedSqlInjector extends DefaultSqlInjector {
      /**
       * 如果只需增加方法,保留mybatis plus自带方法,
       * 可以先获取super.getMethodList(),再添加add
       */
      @Override
      public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        methodList.add(new InsertBatchMethod());
        methodList.add(new UpdateBatchMethod());
        return methodList;
      }
    }
    

    3.注入配置

    @MapperScan("com.xxx.mapper")
    @Configuration
    public class MyBatisPlusConfig {
      @Bean
      public CustomizedSqlInjector customizedSqlInjector() {
        return new CustomizedSqlInjector();
      }
    }
    

    4.添加通用mapper

    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import org.apache.ibatis.annotations.Param;
     
    import java.util.List;
     
    /**
     * 根Mapper,给表Mapper继承用的,可以自定义通用方法
     * {@link com.baomidou.mybatisplus.core.mapper.BaseMapper}
     * {@link com.baomidou.mybatisplus.extension.service.IService}
     * {@link com.baomidou.mybatisplus.extension.service.impl.ServiceImpl}
     */
    public interface RootMapper<T> extends BaseMapper<T> {
     
      /**
       * 自定义批量插入
       * 如果要自动填充,@Param(xx) xx参数名必须是 list/collection/array 3个的其中之一
       */
      int insertBatch(@Param("list") List<T> list);
     
      /**
       * 自定义批量更新,条件为主键
       * 如果要自动填充,@Param(xx) xx参数名必须是 list/collection/array 3个的其中之一
       */
      int updateBatch(@Param("list") List<T> list);
    }
    

    5.如何使用

    @Repository
    public interface UserInfoMapper extends RootMapper<UserInfo> {
    } 
     
    public interface UserInfoService extends IService<UserInfo> { 
      int saveAll(); 
      int updateAll();
    }
     
    @Service
    public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements UserInfoService{
     
      @Override
      public int saveAll() {
        List<UserInfo> list = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
          UserInfo userInfo = new UserInfo();
          userInfo.setUserName("厉害" + i);
          userInfo.setSalt(RandomStringUtils.randomAlphabetic(6));
          userInfo.setPassword(SecureUtil.sha256("123456" + userInfo.getSalt()));
          userInfo.setSex(0);
          userInfo.setAvatar(LoginServiceImpl.AVATAR);
          list.add(userInfo);
        }
        return baseMapper.insertBatch(list);
      }
     
      @Override
      public int updateAll() {
        List<UserInfo> userInfos = baseMapper.selectList(Wrappers.<UserInfo>lambdaQuery().between(BaseEntity::getId, 43, 62));
        userInfos.forEach(userInfo -> {
          userInfo.setUserName("更新了" + IdUtil.simpleUUID());
        });
        return baseMapper.updateBatch(userInfos);
      }
    }
    

    以上是“mybatisplus添加真正的批量新增、批量更新的实现方法”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识!

    展开全文
  • 使用MybatisPlus批量更新数据库时抛异常:java.sql.SQLException: sql injection violation, multi-statement 找到报错的sql: <select id="batchUpdateCategory"> <foreach collection="list" item=...
  • 使用mybatis-plus来进行批量新增和更新时,你会发现其实是一条条sql执行,下面进行优化。 1.添加InsertBatchMethod和UpdateBatchMethod类 import com.baomidou.mybatisplus.core.injector.AbstractMethod; import ...
  • Mybatis中实现批量更新的几种姿势,总有一款适合你一、概述mybatis中实现批量插入是很简单的,相比大家都知道,这里就不赘述,本文主要讲述如何实现批量更新。下面介绍本文要讲的几种方式主要是在xml中实现,不包含...
  • 现在是在 ClientUserServiceImpl 的某个方法调用 updateBatchById 的批量更新方法,会报空指针。 经过调试发现底层有段代码 问题就出现上面这张图的代码里面,mybatis 会从调用的类 拿到super父类,然后拿...
  • mybatis-plus真正批量新增和更新

    千次阅读 2021-01-15 12:25:39
    使用mybatis-plus来进行批量新增和更新时,你会发现其实是一条条sql执行,下面进行优化。1.添加InsertBatchMethod和UpdateBatchMethod类import com.baomidou.mybatisplus.core.injector.AbstractMethod;import ...
  • mybatis+mysql批量插入和批量更新一、批量插入批量插入数据使用的sql语句是:insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo,oo,oo)mybatis中mapper.xml的代码如下:useGeneratedKeys="true">...
  • 那我有一个问题,我更新操作的时候,我循环更新. 和使用 saveOrUpdateBatch 除了io变成一次之外,sql语句上有什么区别? 他也会生成一条update语句么? 但是用一条update语句,我手写sql也不知道怎么写啊. 请高人指点. PS...
  • 定义方法 @Slf4j public class InsertBatchMethod extends AbstractMethod { @Override public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo ...
  • 项目场景: 根据业务使用mybatisPlus,将原先的数据删除,添加新的数据 问题描述: 从数据库中获取数据,进行...2、mybatisPlus 批量插入,只要有一条插入失败就会全部数据回滚 https://my.oschina.net/zjllovecod
  • MyBatisPlus批量导入与高效SQL批量导入

    千次阅读 2020-05-21 21:38:05
    在使用MyBatisPlus批量导入功能,发现数据量较大时比较慢,进入源码大体看了下,MyBatisPlus是一1000条数据为一批次,一批次执行这一批次数据的SQL语句,而且每个语句都是执行一条数据的存储,在SQL语句中存储语句...
  • Mybatis plus多筛选条件批量更新

    万次阅读 2020-07-27 09:47:51
    mybatis plus 自带的updateBatchById方法很6,可以支持使用key批量更新数据。不过因需求要求,现遇需根据多栏位筛选批量更新,很是伤感(吃现成的最开心了)。 源码: public boolean updateBatchById(Collection<...
  • 我们都知道MyBatis是将sql语句与代码...我这里说批量更新是因为,在上面的更新方法大家可能觉得是对某一条做的操作但是实际上是会对满足where的条件满足的都进行更新操作,所以这里不分批量还是单一一条数据的更新!
  • @ApiOperation("修改员工报名") @PutMapping public R update(@RequestParam("ids") String ids, @RequestParam("staus") Integer staus) { if(StringUtils.isBlank(ids)){ return R.failed("传入的id为空");...
  • SQL:mybatisPlus批量插入,重复时候更新一、建表sql二、mybatisplus插入 一、建表sql CREATE TABLE IF NOT EXISTS `testTable` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id', `az_id` text NOT ...
  • mybatis-plus有按主键批量更新的api,有按queryWrapper条件更新的api,但没有按queryWrapper条件批量更新的api,因此采用xml方式在不能使用api或跨表场景。 问题及解决 问题 报错如下: Error updating database. ...
  • 根据ids批量查找数据 List ids = Arrays.asList( 1087982257332887553L, 1094590409767661570L, 1094592041087729666L ); List list = userMapper.selectBatchIds(ids); list.forEach(System.out::println); SELECT ...
  • 对于mybatis-plus的批量操作,一句话:少量数据可以使用,大量数据建议手写sql。 不建议使用mybatis-plus批量操作,也是循环一条一条操作。废话不多说上demo。 1.导入依赖 <dependency> <groupId>...
  • mybatis批量更新及其效率问题 一:背景 注意: 第一种: 第二种: 二:批量更新的方式总结: 第一种: 第二种: 三:总结: 最近,负责公司一些旧数据的批量整理和清洗...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,636
精华内容 1,854
关键字:

mybatisplus批量更新