首頁 > 軟體

MyBatis傳入List集合查詢資料問題

2023-02-09 06:01:22

MyBatis傳入List集合查詢資料

使用的是SSM框架,資料庫是MySQL,做查詢的時候傳入List集合,使用SQL語句的in方式查詢資料

主要有兩點問題

我的List集合是利用的另外一個語句查詢出來的,傳入引數是int型別,返回值是int型別的List集合:

List<Integer> select(Integer id);
<select id="select" resultType="java.util.List"
    parameterType="java.lang.Integer">
    select id
    from section
    where status='A'
    and unit_id=#{id,jdbcType=INTEGER}
</select>

這是我第一次的時候使用的返回值型別(java.util.List),這種情況下在我執行的時候會報錯:java.lang.UnsupportedOperationException

其實這裡如果我們是要返回指定型別的集合直接寫java.lang.Integer(int型別)java.lang.String(字串)等等就可以了,當然也可以自定義一個resultMap

<select id="select" resultType="java.lang.Integer"
    parameterType="java.lang.Integer">
    select id
    from section
    where status='A'
    and unit_id=#{id,jdbcType=INTEGER}
</select>

上面是通過一個id查詢出List集合,下面是將查到的這個List集合放入查詢條件中:

List<Test> selectById(List<Integer> id);
<select id="selectById" parameterType="java.util.List"
    resultMap="BaseResultMap">
    select * from test
    where status = 'A'
    and id in
    <foreach collection="list" index="index" item="item" open="("
        separator="," close=")">
        #{item}
    </foreach>
</select>

上述的查詢語句可以整合在一個sql語句中,這裡為了創造list資料所以分開了。

使用foreach 語句迴圈集合中的資料,item就是迴圈到的資料,如果你是一個複雜型別的資料做批次插入的話可以使用item.屬性名 的方式獲取對應值,類似於java的foreach迴圈語句,某些時候可能傳入的是Array陣列,畢竟都說Array比List效率高,這種時候和上述方法類似,也是foreach語句。具體的分析後續更新。

MyBatis傳入List集合批次刪除

Model

public class FastDFSModel {
    private String pathId;
    private String modelId;
    private String csvpath;
    private String resultpath;
    private String updatetime;
    }

Dao

import org.apache.ibatis.annotations.Param;
 void deleteDateById(@Param("list") List<FastDFSModel> deleteList);

mapper

其中parameterType寫為list

foreach 中的collection寫為"list"

item 為遍歷的每一項,代表著model

在變數中用#{item.pathId}來獲取值

此業務為通過id進行刪除

其中open="(" separator="," close=")"為拼接的in查詢,把id用逗號拼接起來

 <delete id="deleteDateById" parameterType="java.util.List">
        delete from T_FASTDFS_PATH t where t.path_id in
        <foreach item="item" collection="list" open="(" separator="," close=")">
            #{item.pathId,jdbcType=VARCHAR}
        </foreach>
    </delete>

控制檯列印如下

delete from T_FASTDFS_PATH t where t.path_id in ( ? , ? , ? ) 
 PreparedStatement - ==> Parameters: 2(String), 1(String), 3(String)

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com