Mybatis如何动态生成插入的列及批量插入值

有时会遇到根据特定的情况动态创建表,并对表进行批量插入,对于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的写法。

posted @ 2024-08-15 08:33  钟小嘿  阅读(163)  评论(0编辑  收藏  举报