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語句應該等價於:java

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

批量刪除

一、(使用相似in須要遍歷的)傳數組/或數組/或map(優先使用)

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

<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>

二、(使用相似in須要遍歷的)利用map傳String

傳的仍是map,只不過list拼接成String字符串

由於表中沒有fileIds字段,因此若是傳map進入的話,須要在map中定義該字段數組

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

//美圓符$直接注入(原樣注入)app

<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")code

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);

三、(不僅是遍歷,還有別的參數)多參數批量刪除示例

若是刪除不是以主鍵爲條件,而是多個條件同時成立才能夠刪除  
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>

二、利用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語句以下:orm

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

將mapper.xml中的sql語句改成xml

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'步驟以下:get

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

相關文章
相關標籤/搜索