zoukankan      html  css  js  c++  java
  • MyBatis批量新增和更新

    之前有开发任务一个接口里面有大量的数据新增和更新操作,导致十分缓慢。使用了批量操作之后速度有明显提升,几乎百倍千倍的速度提升。

    博主之前统计过,通过普通接口一次数据库插入大概需要200ms,对于大量新增或更新操作的情况,数据库批量操作是十分有必要的。废话不多说,直接上代码。

    博主的resultMap如下:

    <resultMap id="BaseResultMap" type="com.luo.domain.Words" >
        <id column="word_no" property="wordNo" jdbcType="BIGINT" />
        <result column="value" property="value" jdbcType="VARCHAR" />
        <result column="filed_class" property="filedClass" jdbcType="VARCHAR" />
        <result column="pinyin" property="pinyin" jdbcType="VARCHAR" />
        <result column="synonym" property="synonym" jdbcType="VARCHAR" />
        <result column="create_date" property="createDate" jdbcType="TIMESTAMP" />
        <result column="update_date" property="updateDate" jdbcType="TIMESTAMP" />
        <result column="operator_no" property="operatorNo" jdbcType="VARCHAR" />
        <result column="src_channel" property="srcChannel" jdbcType="VARCHAR" />
        <result column="latest_operation" property="latestOperation" jdbcType="VARCHAR" />
        <result column="versions" property="versions" jdbcType="BIGINT" />
        <result column="file_index" property="fileIndex" jdbcType="BIGINT" />
        <result column="charac_class" property="characClass" jdbcType="VARCHAR" />
        <result column="weight" property="weight" jdbcType="INTEGER" />
    </resultMap>

    批量新增

    <insert id="addWordsByList" parameterType="java.util.List">
        insert into words (word_no, value, filed_class, 
          pinyin, synonym, create_date, 
          update_date, operator_no, src_channel, 
          latest_operation, versions, file_index, 
          charac_class, weight)
        values 
        <foreach collection="list" item="item" index="index" separator="," >
            (#{item.wordNo},#{item.value},#{item.filedClass},#{item.pinyin},
            #{item.synonym},#{item.createDate},#{item.updateDate},#{item.operatorNo},
            #{item.srcChannel},#{item.latestOperation},#{item.versions},#{item.fileIndex},
            #{item.characClass},#{item.weight})
        </foreach>
    </insert>

    接口:

    public void addWordsByList(List<Words> wordsList);

    批量更新

    批量更新必须在添加如下数据库连接配置:&allowMultiQueries=true,否则会报SQL格式错误

    比如MySQL:

    jdbc:MySQL://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
    <update id="updateWordsByList"  parameterType="java.util.List">  
        <foreach collection="list" item="item" index="index" separator=";">
           update words
           <set >
              <if test="item.value != null" >
                value = #{item.value,jdbcType=VARCHAR},
              </if>
              <if test="item.filedClass != null" >
                filed_class = #{item.filedClass,jdbcType=VARCHAR},
              </if>
              <if test="item.pinyin != null" >
                pinyin = #{item.pinyin,jdbcType=VARCHAR},
              </if>
              <if test="item.synonym != null" >
                synonym = #{item.synonym,jdbcType=VARCHAR},
              </if>
              <if test="item.createDate != null" >
                create_date = #{item.createDate,jdbcType=TIMESTAMP},
              </if>
              <if test="item.updateDate != null" >
                update_date = #{item.updateDate,jdbcType=TIMESTAMP},
              </if>
              <if test="item.operatorNo != null" >
                operator_no = #{item.operatorNo,jdbcType=VARCHAR},
              </if>
              <if test="item.srcChannel != null" >
                src_channel = #{item.srcChannel,jdbcType=VARCHAR},
              </if>
              <if test="item.latestOperation != null" >
                latest_operation = #{item.latestOperation,jdbcType=VARCHAR},
              </if>
              <if test="item.versions != null" >
                versions = #{item.versions,jdbcType=BIGINT},
              </if>
              <if test="item.fileIndex != null" >
                file_index = #{item.fileIndex,jdbcType=BIGINT},
              </if>
              <if test="item.characClass != null" >
                charac_class = #{item.characClass,jdbcType=VARCHAR},
              </if>
              <if test="item.weight != null" >
                weight = #{item.weight,jdbcType=INTEGER},
              </if>
            </set>
            where word_no = #{item.wordNo,jdbcType=BIGINT}
        </foreach>       
    </update>

    接口:

    public void updateWordsByList(List<Words> wordsList);
  • 相关阅读:
    LeetCode T98.Validate Binary Search Tree/验证二叉搜索树
    LeetCode T45.Jump Game Ⅱ/跳跃游戏Ⅱ
    LeetCode T53.Maximum Subarray/最大子序和
    LeetCode T3.Longest Substring Without Repeating Characters/无重复最长子串
    LeetCode T21.Merge Two Sorted Lists/合并两个有序链表
    LeetCode T202.Happy Number/寻找快乐数
    LeetCode T1095.Find in Mountain Array/山脉数组中查找目标值
    XCTF-WEB—i-got-id-200:perl网页文件+ARGV上传造成任意文件读取
    思维导图爆破
    UNCTF2020-Reverse:re_checkin
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154516.html
Copyright © 2011-2022 走看看