精华内容
下载资源
问答
  • 本文实例讲述了Yii2.0实现的批量更新批量插入功能。分享给大家供大家参考,具体如下: 批量更新 方法1 /** * 批量更新循环周期 * @param array $condition * $condition = ['advertise_id' => '','status' => '',...
  • 本篇文章主要介绍了Laravel 批量更新多条数据的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 因为项目是Laravel框架,Laravel有批量插入的方法,却没有批量更新的方法,没办法只能自己实现。 准备 mysql case…when的用法 MySQL 的 case when 的语法有两种: 简单函数 CASE [col_name] WHEN [value1] THEN ...
  • SQL Server批量插入批量更新工具类,SqlBulkCopy,BatchUpdate
  • 批量新增和批量更新

    2020-11-20 16:05:19
    批量新增和批量更新: 如果成功,全成功.如果失败,全失败.

    批量新增和批量更新: 如果成功,全成功.如果失败,全失败.

    展开全文
  • 使用mybatis-plus来进行批量新增更新时,你会发现其实是一条条sql执行,下面进行优化。 1.添加InsertBatchMethod和UpdateBatchMethod类 import com.baomidou.mybatisplus.core.injector.AbstractMethod; import ...

    使用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);
        }
    }
    
    
    

    #@Le.Hao#

    帮助到您请点赞关注收藏谢谢!!

    展开全文
  • 今天,为了更多了解下,mybatis批量新增和批量更新在simple/batch模式 + MySQL的rewriteBatchedStatements下效率有什么区别,做了一次实验。 实验结果,让人意想不到,如果没有亲自测试,可能一直会被网上帖子误导...

    今天,为了更多了解下,mybatis批量新增和批量更新在simple/batch模式 + MySQL的rewriteBatchedStatements下效率有什么区别,做了一次实验。
    实验结果,让人意想不到,如果没有亲自测试,可能一直会被网上帖子误导。

    实验参数

    1. mybatis的执行类型ExecutorType

      • simply模式
      • batch模式
    2. 形成的SQL语句方式

    3. 多少数据拼写成一条语句

      • simply模式下:100条,一条SQL语句时提交 (这个可以自行调整)
      • batch模式:100条, 每100条SQL语句时提交(这个可以自行调整)
    4. Mysql参数rewriteBatchedStatements : true、false

      • allowMultiQueries=true&rewriteBatchedStatements=true
      • allowMultiQueries=true&rewriteBatchedStatements=false

    实验结果:
    运行结果是毫秒单位
    实验结果
    实验结论:

    1. 批量insert时,当rewriteBatchedStatements=true,batch模式最快, 其他情况下simple模式和batch模式都差不多
    2. 批量update(case when) :simple模式和batch模式都差不多
      批量update(foreach) 效率最慢,不可取
    3. 批量insert时,配合rewriteBatchedStatements=true,效率最好,对于批量update稍微有点影响,但是条件允许可以忽略不计
    4. 批量update(case when)时,无论rewriteBatchedStatements=true,simple模式和batch模式效率相差不太大,但是条件允许可以忽略不计

    关于update(foreach)效率问题
    先看这篇文章:mybatis学习之路----批量更新数据两种方法效率对比
    我也对这个进行了实验,发现这个帖子有点误导人,原因如下:

    1. 这个帖子使用 or 方式 拼写条件, 因为使用or 不走索引的,会导致更新效率很慢,让人误导以为case when效率差。 可以参考:mysql关于or的索引问题

      <foreach collection="list" separator="or" item="cus">
               id = #{cus.id}
           </foreach> 
      
    2. 如果使用in方式,批量更新效率会大大提高

          sql.append("WHERE");
           sql.append(" id IN ");
           sql.append("<trim prefix=\"(\" suffix=\")\">");
           sql.append("<foreach collection=\"list\" separator=\", \" item=\"i\" index=\"index\" >");
           sql.append("#{i.id}");
           sql.append("</foreach>");
           sql.append("</trim>");
    
    展开全文
  • 2.多表关联批量更新 3.多表关联批量删除 首先要明白一点,为什么会有批量这一个概念,无非就是数据太多了,在java端把数据查出来然后在按照100-300的批次进行更新太耗性能了,而且写出来的代码会非常的臃肿,所谓好...
  • 一、批量查询 接口 //参数里面的字符串由","进行拼接而成 List<PartyOrganization> getOrgByListId(@Param("listOrgId") String listOrgId); xml <select id="getOrgByListId" resultType=...

    解析:

    foreach的属性

      item:集合中元素迭代时的别名,必填

      index:在list和array中,index是元素的序号;在map中,index是元素的key,可选

      open:foreach代码的开始符号,一般是 ‘(’ 并和 ')' 合用,常用在in(),values()时,可选

      separator:元素之间的分隔符,可选

      close:foreach代码的关闭符号,一般是 ')'  并和 '('合用,常用在in(),values()时,可选

      collection:foreach迭代的对象,作为入参时,List对象默认用 list 代替,数组对象用 array代替。Map对象没有默认的键。

        同时可以在作为入参时使用@param("xxx")来设置键,这时,默认的list、array将会失效。

      官方说明:

      注意 你可以将一个 List 实例或者数组作为参数对象传给 MyBatis,当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以“list”作为键,而数组实例的键将是“array”

     

    一、批量查询

    接口:

    //参数里面的字符串由","进行拼接而成  
    List<PartyOrganization> getOrgByListId(@Param("listOrgId") String listOrgId);

    xml:

     <select id="getOrgByListId" resultType="com.safesoft.domain.partybuilding.entity.PartyOrganization">
            select
            id as id,
            org_name as orgName,
            parent_org_code as parentOrgCode,
            org_code as orgCode,
            org_leavel_type as orgLeavelType from t_zhcx_dj_dw_org
            where
            delete_flag = 0 and  id in
             <foreach collection="areaCodeList" item="item" open="(" close=")" separator=",">
                '${item}'
            </foreach>
        </select>

    二、批量新增

    接口:

    Integer insertByAttachmentList(@Param("attachmentList") List<ActivityMapAttachment> attachmentList);

    xml:

    <insert id="insertByAttachmentList">
            insert into t_xfdj_activity_map_attachment
            (
            activity_id,attachment_id
            ) values
            <foreach collection="attachmentList" item="attachment" separator=",">
                (
                #{attachment.activityId},
                #{attachment.attachmentId}
                )
            </foreach>
        </insert>

    三、批量修改

    接口:

     Integer updateSignStatusByMemberList(@Param("activityId") Long activityI,@Param("memberList") List<Long> memberList);
    

    xml:

    <update id="updateSignStatusByMemberList" parameterType="java.util.List">
            update t_xfdj_activity_map_member set
            sign_in_status = 1
            where activity_id=#{activityId} and member_id in
            <foreach collection="memberList" index="index" item="item" separator="," open="(" close=")">
                #{item}
            </foreach>
        </update>

    四、批量删除(下面的删除只是一个update,改变一个状态,并非是delete)

    接口:

     Integer batchDelproductId(List<Integer> productIds);

    xml:

    <update id="batchDelproductId">
            update application_customer_product set is_delete=true
            where id in
            <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
                #{item}
            </foreach>
    
        </update>

     

    展开全文
  • 以下小编给大家列出了三种实现thinkphp批量更新数据的方法,写的不好还请见谅,有意见欢迎提出,共同学习进步! 方法一: //批量修改 data二维数组 field关键字段 参考ci 批量修改函数 传参方式 function batch_...
  • 主要介绍了Mybatis批量更新报错的问题及解决办法,包括mybatis批量更新的两种方式,需要的的朋友参考下
  • 向postgresql中利用sql批量跟新记录的实现代码。
  • 记得数据源配置allowMultiQueries=true& 不然会报错 -> 添加链接描述 文章目录 举例说明 @Update批量更新 @insert批量新增 举例说明 spring.datasource.url=jdbc:mysql://IP:端口/geespace_bd_platform_dev?...
  • 今天小编就为大家分享一篇关于Mysql Update批量更新的几种方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • J2EE开发人员
  • 已经允许批量更新 filter: wall: config: multi-statement-allow: true #允许一次批量更新操作,会导致SQL注入 Caused by: java.sql.SQLException: sql injection violation, syntax error: syntax error, ...
  • 主要介绍了详解mybatis 批量更新数据两种方法效率对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要介绍了django框架使用orm实现批量更新数据的方法,结合实例形式简单分析了Django基于orm操作数据库更新数据的相关实现技巧,需要的朋友可以参考下
  • 主要介绍了Mysql使用insert插入多条记录批量新增数据,需要的朋友可以参考下
  • 主要介绍了Mybatis批量更新三种方式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 动态组合SQL语句方式实现批量更新的实例,需要的朋友可以参考一下
  • 主要介绍了Mybatis中使用updateBatch进行批量更新的相关资料,有逐条更新,sql批量更新等,具体实例代码大家参考下本
  • 批量更新Outlook联系人

    2020-12-29 09:12:34
    已设置宏,将文档内的联系人清单批量更新到Outlook中
  • 比较集中mysql批量更新的方式,推荐一种效率最高的更新语句写法
  • 方法一(推荐): UPDATE 表2 ...尤其注意最后的外层where条件尤为重要,是锁定其批量更新数据的范围。 方法二: MERGE INTO 表2 USING 表1 ON (表2.A = 表1.A) -- 条件是 A 相同 WHEN MATCHED THEN UP
  • 使用方法请看博客https://blog.csdn.net/bandaotixiruiqiang/article/details/72478361#comments_12931827
  • 今天小编就为大家分享一篇python3实现elasticsearch批量更新数据,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 278,474
精华内容 111,389
关键字:

批量新增