Mybatis如何動態生成插入的列及批次插入值

钟小嘿發表於2024-08-15

有時會遇到根據特定的情況動態建立表,並對錶進行批次插入,對於Mybatis來說,也是非常簡單的。

先看dao層

void insertBatch(@Param("tableName") String tableName, @Param("dbColumns") List<String> dbColumns,@Param("dbValues") List<LinkedHashMap> dbValues);

注:這裡的值dbValues必須使用LinkedHashMap型別,因為其內部元素是有序的,否則會導致插入列不對應。

sql語句(mapper.xml)

    <!--批次插入values-->
    <sql id="values">
        <foreach item="item" collection="dbValues" separator=",">
            <foreach collection="item" item="detailItem" index="index" open="(" close=")" separator=",">
                #{detailItem}
            </foreach>
        </foreach>
    </sql>

    <!--批次插入-->
    <insert id="insertBatch">
        insert into ${tableName} (
        <foreach collection="dbColumns" item="columnItem" separator=",">
            ${columnItem}
        </foreach>
        )
        values <include refid="values"/>
    </insert>

實際上是對欄位進行進一步迴圈。

測試方法

List<String> cols = new ArrayList<>(Arrays.asList("name", "sex", "age"));
        List<LinkedHashMap> data = new ArrayList<>();
        LinkedHashMap hashMap = new LinkedHashMap();
        hashMap.put("name", "張三");
        hashMap.put("sex", "");
        hashMap.put("age", "12");
        LinkedHashMap hashMap2 = new LinkedHashMap();
        hashMap2.put("name", "張三");
        hashMap2.put("sex", "");
        hashMap2.put("age", "12");
        data.add(hashMap);
        data.add(hashMap2);
        userDao.insertBatch("t_user_001", cols, data);

這個測試方法只是為了演示,實際場景可能不止如此,主要為了展示xml的寫法。

相關文章