SpringBoot MyBatis Oracle 数据插入
·
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]

更多推荐


所有评论(0)