SpringBoot MyBatis Oracle 数据插入

1 XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xu.oracle.StudentMapper">

    <!-- 单条插入(INSERT SINGLE) -->
    <insert id="insertSingle" parameterType="map">
        INSERT INTO ${tableName} (
        <!-- 表字段 -->
        <foreach collection="data.keySet" item="column" separator=",">
            <choose>
                <when test="column == 'NAME'">NAME</when>
                <when test="column == 'AGE'">AGE</when>
                <when test="column == 'ADDRESS'">ADDRESS</when>
                <when test="column == 'PHONE'">PHONE</when>
                <when test="column == 'BIRTHDAY'">BIRTHDAY</when>
            </choose>
        </foreach>
        ) VALUES (
        <foreach collection="data.keySet" item="column" separator=",">
            <choose>
                <when test="column == 'NAME'">#{data.NAME}</when>
                <when test="column == 'AGE'">#{data.AGE}</when>
                <when test="column == 'ADDRESS'">#{data.ADDRESS}</when>
                <when test="column == 'PHONE'">#{data.PHONE}</when>
                <when test="column == 'BIRTHDAY'">#{data.BIRTHDAY}</when>
            </choose>
        </foreach>
        )
    </insert>

    <!-- 批量插入(UNION ALL >1000 行) -->
    <insert id="insertBatchUnion">
        INSERT INTO ${tableName} (
        <!-- 表字段 -->
        <foreach collection="data[0].keySet()" item="column" separator=",">
            <choose>
                <when test="column == 'NAME'">NAME</when>
                <when test="column == 'AGE'">AGE</when>
                <when test="column == 'ADDRESS'">ADDRESS</when>
                <when test="column == 'PHONE'">PHONE</when>
                <when test="column == 'BIRTHDAY'">BIRTHDAY</when>
            </choose>
        </foreach>
        )
        <!-- 表数据 -->
        <foreach collection="data" item="row" index="index" separator="UNION ALL">
            SELECT
            <foreach collection="row.keySet()" item="column" separator=",">
                <choose>
                    <when test="column == 'NAME'">#{row.NAME, jdbcType=VARCHAR}</when>
                    <when test="column == 'AGE'">#{row.AGE, jdbcType=NUMERIC}</when>
                    <when test="column == 'ADDRESS'">#{row.ADDRESS, jdbcType=VARCHAR}</when>
                    <when test="column == 'PHONE'">#{row.PHONE, jdbcType=VARCHAR}</when>
                    <when test="column == 'BIRTHDAY'">#{row.BIRTHDAY, jdbcType=DATE}</when>
                </choose>
            </foreach>
            FROM dual
        </foreach>
    </insert>

    <!-- 批量插入(INSERT ALL <1000 行) -->
    <insert id="insertBatchAll" parameterType="map">
        INSERT ALL
        <foreach collection="data" item="item">
            INTO ${tableName} (
            <!-- 表字段 -->
            <foreach collection="item.keySet()" item="column" separator=",">
                <choose>
                    <when test="column == 'NAME'">NAME</when>
                    <when test="column == 'AGE'">AGE</when>
                    <when test="column == 'ADDRESS'">ADDRESS</when>
                    <when test="column == 'PHONE'">PHONE</when>
                    <when test="column == 'BIRTHDAY'">BIRTHDAY</when>
                </choose>
            </foreach>
            ) VALUES (
            <!-- 表数据 -->
            <foreach collection="item.keySet()" item="column" separator=",">
                <choose>
                    <when test="column == 'NAME'">#{item.NAME, jdbcType=VARCHAR}</when>
                    <when test="column == 'AGE'">#{item.AGE, jdbcType=VARCHAR}</when>
                    <when test="column == 'ADDRESS'">#{item.ADDRESS, jdbcType=VARCHAR}</when>
                    <when test="column == 'PHONE'">#{item.PHONE, jdbcType=VARCHAR}</when>
                    <when test="column == 'BIRTHDAY'">#{item.BIRTHDAY, jdbcType=VARCHAR}</when>
                </choose>
            </foreach>
            )
        </foreach>
        SELECT 1 FROM dual
    </insert>

</mapper>

1 通用XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xu.oracle.OracleInsertMapper">


    <!-- 单条插入(INSERT SINGLE) -->
    <insert id="insertSingle" parameterType="map">
        INSERT INTO ${tableName} (
        <!-- 表字段 -->
        <foreach collection="data.keySet" item="column" separator=",">
            <choose>
                <when test="column == 'GGUID'">GGUID</when>
                <when test="column == 'GMARKET'">GMARKET</when>
                <when test="column == 'GCHANGEUNEFFDATE'">GCHANGEUNEFFDATE</when>
            </choose>
        </foreach>
        )
        VALUES
        (
        <foreach collection="data.keySet" item="column" separator=",">
            <choose>
                <when test="column == 'GGUID'">#{data.GGUID}</when>
                <when test="column == 'GMARKET'">#{data.GMARKET}</when>
                <when test="column == 'GCHANGEUNEFFDATE'">#{data.GCHANGEUNEFFDATE}</when>
            </choose>
        </foreach>
        )
    </insert>

    <!-- 批量插入(UNION ALL >1000 行) -->
    <insert id="insertBatchUnion">
        INSERT INTO ${tableName} (
        <!-- 表字段 -->
        <foreach collection="data[0].keySet()" item="column" separator=",">
            <choose>
                <when test="column == 'GGUID'">GGUID</when>
                <when test="column == 'GMARKET'">GMARKET</when>
                <when test="column == 'GCHANGEUNEFFDATE'">GCHANGEUNEFFDATE</when>
            </choose>
        </foreach>
        )
        <!-- 表数据 -->
        <foreach collection="data" item="row" index="index" separator="UNION ALL">
            SELECT
            <foreach collection="row.keySet()" item="column" separator=",">
                <choose>
                    <when test="column == 'GGUID'">#{row.GGUID}</when>
                    <when test="column == 'GMARKET'">#{row.GMARKET}</when>
                    <when test="column == 'GCHANGEUNEFFDATE'">#{row.GCHANGEUNEFFDATE}</when>
                </choose>
            </foreach>
            FROM dual
        </foreach>
    </insert>

    <!-- 批量插入(INSERT ALL <1000 行) -->
    <insert id="insertBatchAll" parameterType="map">
        INSERT ALL
        <foreach collection="data" item="item">
            INTO ${tableName} (
            <!-- 表字段 -->
            <foreach collection="item.keySet()" item="col" separator=",">
                <choose>
                    <when test="col == 'GGUID'">GGUID</when>
                    <when test="col == 'GMARKET'">GMARKET</when>
                    <when test="col == 'GCHANGEUNEFFDATE'">GCHANGEUNEFFDATE</when>
                </choose>
            </foreach>
            ) VALUES (
            <!-- 表数据 -->
            <foreach collection="item.keySet()" item="col" separator=",">
                <choose>
                    <when test="col == 'GGUID'">#{item.GGUID, jdbcType=VARCHAR}</when>
                    <when test="col == 'GMARKET'">#{item.GMARKET, jdbcType=VARCHAR}</when>
                    <when test="col == 'GCHANGEUNEFFDATE'">#{item.GCHANGEUNEFFDATE, jdbcType=VARCHAR}</when>
                </choose>
            </foreach>
            )
        </foreach>
        SELECT 1 FROM dual
    </insert>

</mapper>

2 通用Mapper

package com.xu.oracle;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.LinkedHashMap;
import java.util.LinkedList;

@Mapper
public interface TestMapper {

    /**
     * 单个插入数据(SINGLE)
     *
     * @param tableName 数据表名
     * @param data      数据
     * @return 插入数量
     */
    int insertSingle(@Param("tableName") String tableName,
                     @Param("data") LinkedHashMap<String, Object> data);

    /**
     * 批量插入数据(UNION ALL)
     *
     * @param tableName 数据表名
     * @param data      数据
     * @return 插入数量
     */
    int insertBatchUnion(@Param("tableName") String tableName,
                         @Param("data") LinkedList<LinkedHashMap<String, Object>> data);

    /**
     * 批量插入数据(ALL)
     *
     * @param tableName 数据表名
     * @param data      数据
     * @return 插入数量
     */
    int insertBatchAll(@Param("tableName") String tableName,
                       @Param("data") LinkedList<LinkedHashMap<String, Object>> data);

}

2 Mapper

package com.xu.oracle;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.Map;

@Mapper
public interface StudentMapper {

    /**
     * 单个插入数据(INSERT SINGLE = 1 行)
     *
     * @param tableName 数据表名
     * @param data      数据
     * @return 插入数量
     */
    int insertSingle(@Param("tableName") String tableName,
                     @Param("data") Map<String, Object> data);

    /**
     * 批量插入数据(UNION ALL >1000 行)
     *
     * @param tableName 数据表名
     * @param data      数据
     * @return 插入数量
     */
    int insertBatchUnion(@Param("tableName") String tableName,
                         @Param("data") Collection<Map<String, Object>> data);

    /**
     * 批量插入数据(INSERT ALL <1000 行)
     *
     * @param tableName 数据表名
     * @param data      数据
     * @return 插入数量
     */
    int insertBatchAll(@Param("tableName") String tableName,
                       @Param("data") Collection<Map<String, Object>> data);

}

3 Test

package com.xu.oracle;

import cn.hutool.core.date.DateUtil;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.*;

@SpringBootTest
public class StudentMapperTest {


    @Autowired
    private StudentMapper mapper;

    @Test
    void test1() {
        Map<String, Object> map1 = new HashMap<>();
        map1.put("NAME", "张三");
        map1.put("AGE", 22);
        map1.put("ADDRESS", "广东省 广州市");
        map1.put("PHONE", "123456789");
        map1.put("BIRTHDAY", new Date());

        Map<String, Object> map2 = new HashMap<>();
        map2.put("NAME", "李四");
        map2.put("AGE", 18);
        map2.put("ADDRESS", "广东省 深圳市");
        map2.put("PHONE", "123456");
        map2.put("BIRTHDAY", new Date());

        List<Map<String, Object>> list = new ArrayList<>();
        list.add(map1);
        list.add(map2);

        //mapper.insertSingle("STUDENT", map1);
        mapper.insertBatchUnion("STUDENT", list);
        mapper.insertBatchAll("STUDENT", list);

    }

}
Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build what is described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#0.3
WARNING: A Java agent has been loaded dynamically (D:\Maven\Repository\net\bytebuddy\byte-buddy-agent\1.15.11\byte-buddy-agent-1.15.11.jar)
WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
WARNING: Dynamic loading of agents will be disallowed by default in a future release
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7a522157] was not registered for synchronization because synchronization is not active
2025-09-18T11:36:47.398+08:00  INFO 17060 --- [java-spring] [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2025-09-18T11:36:48.164+08:00  INFO 17060 --- [java-spring] [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection oracle.jdbc.driver.T4CConnection@73a1a1b4
2025-09-18T11:36:48.165+08:00  INFO 17060 --- [java-spring] [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
JDBC Connection [HikariProxyConnection@1421436947 wrapping oracle.jdbc.driver.T4CConnection@73a1a1b4] will not be managed by Spring
==>  Preparing: INSERT INTO STUDENT ( ADDRESS , PHONE , BIRTHDAY , NAME , AGE ) SELECT ? , ? , ? , ? , ? FROM dual UNION ALL SELECT ? , ? , ? , ? , ? FROM dual
==> Parameters: 广东省 广州市(String), 123456789(String), 2025-09-18(Date), 张三(String), 22(Integer), 广东省 深圳市(String), 123456(String), 2025-09-18(Date), 李四(String), 18(Integer)
<==    Updates: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7a522157]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7c0a6f62] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@563749379 wrapping oracle.jdbc.driver.T4CConnection@73a1a1b4] will not be managed by Spring
==>  Preparing: INSERT ALL INTO STUDENT ( ADDRESS , PHONE , BIRTHDAY , NAME , AGE ) VALUES ( ? , ? , ? , ? , ? ) INTO STUDENT ( ADDRESS , PHONE , BIRTHDAY , NAME , AGE ) VALUES ( ? , ? , ? , ? , ? ) SELECT 1 FROM dual
==> Parameters: 广东省 广州市(String), 123456789(String), 2025-09-18 11:36:47.346(Timestamp), 张三(String), 22(Integer), 广东省 深圳市(String), 123456(String), 2025-09-18 11:36:47.346(Timestamp), 李四(String), 18(Integer)
<==    Updates: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7c0a6f62]

在这里插入图片描述

更多推荐