• mybatis批量查询-插入-删除


    批量插入

    WaterEleMapper.xml部分代码

    <!--批量增加测试-->
        <insert id="insertList" parameterType="java.util.List">
            insert into t_enterprise_water_ele
            (
            /*方法一*/
            -- WATER_ELE_ID,
            -- ENTERPRISE_ID,
            -- ENTERPRISE_USCC,
            -- ENTERPRISE_NAME,
            -- YEARMONTH,
            -- WATER_SIZE,
            -- WATER_AMOUNT,
            -- ELE_SIZE,
            -- ELE_AMOUNT,
            -- STATUS,
            -- OPERATOR,
            -- OPERATE_TIME
            /*方法二*/
            <include refid="Base_Column_List"/>
            )
            VALUES
            <foreach collection="list" item="item" index="index" separator=",">
                (
                #{item.waterEleId,jdbcType=VARCHAR},
                #{item.enterpriseId,jdbcType=VARCHAR},
                #{item.enterpriseUscc,jdbcType=VARCHAR},
                #{item.enterpriseName,jdbcType=VARCHAR},
                #{item.yearmonth,jdbcType=VARCHAR},
                #{item.waterSize,jdbcType=DECIMAL},
                #{item.waterAmount,jdbcType=VARCHAR},
                #{item.eleSize,jdbcType=DOUBLE},
                #{item.eleAmount,jdbcType=VARCHAR},
                #{item.status,jdbcType=INTEGER},
                #{item.operator,jdbcType=VARCHAR},
                #{item.operateTime,jdbcType=TIMESTAMP}
                )
            </foreach>
        </insert>
    

    xxxMapper部分代码

    int insertList(List<WaterEle> list);
    

    对于foreach标签的解释参考了网上的资料,具体如下:

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
    foreach元素的属性主要有 item,index,collection,open,separator,close。
    item表示集合中每一个元素进行迭代时的别名
    index指定一个名字,用于表示在迭代过程中,每次迭代到的位置
    open表示该语句以什么开始
    separator表示在每次进行迭代之间以什么符号作为分隔 符
    close表示以什么结束
    在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
    1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
    2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
    3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map
    

    使用批量插入执行的SQL语句应该等价于:

    insert into redeem_code (batch_id, code, type, facevalue,create_user,create_time)
    values (?,?,?,?,?,? ),(?,?,?,?,?,? ),(?,?,?,?,?,? ),(?,?,?,?,?,? )
    

    批量删除

    1、(使用类似in需要遍历的)传数组/或数组/或map(优先使用)

    int deleteByBatch(@Param(value = "array")String[] array);
    int deleteByBatch(@Param(value = "list")List list);

    <delete id="deleteByBatch" parameterType="java.lang.String">
        delete from t_enterprise_output_value
        where OUTPUT_ID IN
        <foreach collection="array" item="outputId" open="(" separator="," close=")">
            #{outputId}
        </foreach>
    </delete>
    

    2、(使用类似in需要遍历的)利用map传String

    传的还是map,只不过list拼接成String字符串

    因为表中没有fileIds字段,所以如果传map进入的话,需要在map中定义该字段

    map.put("fileIds","1,2,3");
    

    //美元符$直接注入(原样注入)

    <delete id="deleteByPrimaryKey" parameterType="java.util.Map">
        DELETE FROM t_attachment WHERE FILE_ID  IN (${fileIds})
    </delete>
    

    完整的sql语句是:

    DELETE FROM t_attachment WHERE FILE_ID IN (1,2,3)
    适用于表中该字段是int或者bigint类型,不适用于varchar。

    如果该字段是varchar类型,则正确的sql语句应该是:

    DELETE FROM t_attachment WHERE FILE_ID IN ("1","2","3")

    map中就应该这样定义了:

    数组/集合 -->(1,2,3,4)
     String userIdList = formData.get("userIdList");
     String[] users = userIdList.split(",");
     String str = "";
     for (String user : users) {
         str += """ + user + """ + ",";
     }
     String substring = str.substring(0, str.lastIndexOf(","));
     System.out.println(substring);
    

    3、(不只是遍历,还有别的参数)多参数批量删除示例

    如果删除不是以主键为条件,而是多个条件同时成立才可以删除  
    userIds可以是数组或者list或者map
    上面的SYSCODE和ROLE_ID,可以直接传递
    int deleteByUserIdSysRoleBatch(@Param(value="sysCode") String sysCode,@Param(value="roleId") String roleId,@Param(value="userIds")int[] userIds);
    int deleteByUserIdSysRoleBatch(@Param(value="sysCode") String sysCode,@Param(value="roleId") String roleId,@Param(value="userIds")List<Integer> userIds);
    
    <delete id="deleteByUserIdSysRoleBatch">
        delete from t_user_role
        where SYSCODE = #{sysCode,jdbcType=VARCHAR} AND ROLE_ID = #{roleId,jdbcType=VARCHAR} 
        AND USER_ID IN
        <foreach collection="userIds" item="item" index="index" open="(" separator="," close=")">
            #{item}
        </foreach>
    </delete>
    

    4.利用map传递多个参数

    <delete id="deleteByRole" parameterType="java.util.Map">
        DELETE
        FROM
        t_user_role
        <where>
            <if test="userIdList != null">
                USER_ID IN (#{userIdList,jdbcType=VARCHAR})
            </if>
            <if test="roleId != null">
                AND ROLE_ID=#{roleId,jdbcType=VARCHAR}
            </if>
            <if test="sysCode != null">
                AND SYSCODE=#{sysCode}
            </if>
        </where>
    </delete>
    

    批量查询

    1.传入list/数组/map(优先使用)

    <select id="selectOrder" parameterType="java.util.Map" resultMap="OrderMap">
        SELECT * FROM t_ WHERE 
        ORDER_ID in
        <foreach collection="list" item="item" index="index" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>
    

    2、利用map将拼接的String传入

    <select id="selectOrder" parameterType="java.util.Map" resultMap="OrderMap">
        SELECT * FROM t_ WHERE ORDER_ID in (${orderList})
    </select>
    

    ①对于表中的主键是bigint / int

    ==>  Preparing: SELECT * FROM t_order WHERE ORDER_ID in (?) 
    ==> Parameters: 1,2,5(String)
    <==    Columns: ORDER_ID, GOODS_ID, UNIT_PRICE, SOLD_NUM, ORDER_STATUS, OPERATOR, OPERATE_TIME
    <==        Row: 1, 356346093, 43.00, 3, 109002, yyadmin, 2017-12-16 21:01:20.0
    <==      Total: 1
    

    注意"1,2,5"传过来的是String类型,实际sql语句如下:

    SELECT * FROM t_order WHERE ORDER_ID in (#{orderList})
    SELECT * FROM t_order WHERE ORDER_ID in ('1,2,5')只能查到一条
    

    将mapper.xml中的sql语句改为

    SELECT * FROM t_order WHERE ORDER_ID in (${orderList})
    SELECT * FROM t_order WHERE ORDER_ID in (1,2,5)就可以全部查到。
    

    ②对于表中的主键是varchar

    SELECT * FROM t_order WHERE ORDER_ID in (#{orderList})
    SELECT * FROM t_order WHERE ORDER_ID in ('1,2,5')查询不到
    

    将mapper.xml中的sql语句改为

    SELECT * FROM t_order WHERE ORDER_ID in (${orderList})
    SELECT * FROM t_order WHERE ORDER_ID in ('1','2','5')就可以全部
    

    '1,2,5'转为'1','2','5'步骤如下:

    String categoryIdList = (String) formData.get("categoryIdList");
    if (!StringUtils.isEmpty(categoryIdList)) {
        String[] split = categoryIdList.split(",");
        String sqlParamter = "";
        for (String s : split) {
            sqlParamter += "'" + s + "',";
        }
        String substring = sqlParamter.substring(0, sqlParamter.length() - 1);
        formData.put("categoryIdList", substring);
    }
    

    站在巨人的肩膀上摘苹果:

    链接:https://www.jianshu.com/p/041bec8ae6d3

  • 相关阅读:
    Python调用C++的DLL
    Go-map
    Go-切片
    Go-数组
    Go-流程控制
    Go-运算符
    Go-变量和常量
    Go-VS Code配置Go语言开发环境
    Go-跨平台编译
    Go-从零开始搭建Go语言开发环境
  • 原文地址:https://www.cnblogs.com/personsiglewine/p/12890536.html
Copyright © 2020-2023  润新知