【实践】mybatis批量插入map

需求

近期项目在测试上出了些问题,主要原因是我们项目中使用的Doris,然后线上和测试环境隔离,线上有数据,Doris没数据,需要将线上数据往测试环境弄一部分,所以写了个小程序导入了一下

思路

因为不止一张表,所以想着写个通用的代码,把表的部分传进来就可以同步,这样的话,就绝对不能用实体类来传输数据,所以用map,
用map还有一个问题是之前没写过map的批量插入,所以稍微查了查,这里做个记录,大家可以看一下

首先是从线上查询的部分,如下:

    <select id="search" resultType="java.util.Map">
        select * from  ${tableName}
        order by ${orderBy} desc
        limit #{pageNo},#{pageSize}
    </select>

然后是插入的部分,如下

<insert id="insert" parameterType="java.util.Map">
        insert into ${tableName}
        (
        <foreach collection="columnMap" item="value" index="key" separator=",">
            `${key}`
        </foreach>
        )
        values
        <foreach collection="mapList" item="columnMap" separator=",">
            (
            <foreach collection="columnMap" item="value" index="key" separator=",">
                #{value}
            </foreach>
            )
        </foreach>

    </insert>

最后是程序的部分,如下:

    public Result index(String tableName, String orderBy,Integer pageNo,Integer pageSize) {
        List<Map<String,Object>> resultList= dorisSearchMapper.search(tableName,orderBy,pageNo,pageSize);
        Map<String,Object> map=resultList.get(0);
        dorisTestMapper.insert(tableName,map,resultList);

        return ResultBuilder.success();
    }

注意

注意一下,dorisSearchMapper和dorisTestMapper是两个源
还有一点需要注意的地方,使用map接收返回值,有可能出现字段丢失的情况,一般出现在值为NULL的时候,此时请在mybatis的配置文件里面加上如下配置

        <setting name="callSettersOnNulls" value="true"/>

以上,主要是自己做个记录,希望顺便帮到大家。

### MyBatis 中实现批量查询的 SQL 方法 在 MyBatis 中,可以通过 `foreach` 标签来实现批量查询功能。以下是具体的实现方式: #### 使用 `foreach` 实现批量查询 当需要根据多个条件进行批量查询时,可以利用 MyBatis 的 `<foreach>` 标签动态拼接 SQL 查询语句中的 IN 条件。 ```xml <select id="batchQueryByIds" parameterType="list" resultType="com.example.User"> SELECT * FROM user WHERE id IN <foreach collection="list" item="id" open="(" separator="," close=")"> #{id} </foreach> </select> ``` 上述代码片段中,通过传递一个 List 参数给 Mapper 接口的方法,在 XML 配置文件中使用 `<foreach>` 动态生成 SQL 的 IN 子句[^1]。 #### 动态构建多条件查询 对于更复杂的场景,比如涉及多种字段组合的情况,可以根据实际需求动态调整查询条件。例如: ```xml <select id="dynamicBatchQuery" parameterType="map" resultType="com.example.Order"> SELECT * FROM orders <where> <if test="orderIds != null and orderIds.size > 0"> AND id IN <foreach collection="orderIds" item="orderId" open="(" separator="," close=")"> #{orderId} </foreach> </if> <if test="statusList != null and statusList.size > 0"> AND status IN <foreach collection="statusList" item="status" open="(" separator="," close=")"> #{status} </foreach> </if> </where> </select> ``` 在此示例中,`<where>` 和 `<if>` 结合使用,能够灵活处理不同情况下的查询逻辑[^2]。 #### Oracle 数据库环境下的批量插入与查询 如果是针对 Oracle 数据库的操作,也可以采用类似的方式完成批量查询。需要注意的是,Oracle 支持通过子查询形式实现数据加载或筛选。例如: ```xml <select id="oracleBatchSelect" parameterType="list" resultType="com.example.Employee"> SELECT * FROM employees e WHERE (e.id, e.department_id) IN ( <foreach collection="employeePairs" item="pair" separator="union"> SELECT #{pair.id}, #{pair.deptId} FROM dual </foreach> ) </select> ``` 这里展示了如何借助 `dual` 表以及 UNION 构造复合键匹配的批量查询方案[^3]。 --- ### 注意事项 - **性能优化**:大批量的数据操作可能引发性能瓶颈,建议合理控制每次请求的数量。 - **安全性考量**:防止因不当输入导致 SQL 注入风险,务必遵循最佳实践编码标准。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盖丽男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值