Mybatis resultMap实现按某列字段统计 获取另一列该列字段及另一列list集合

本文介绍了一个具体的 MyBatis resultMap 配置示例,展示了如何通过 resultMap 映射复杂的数据结构,包括基本属性映射及集合属性映射的方法。
    <resultMap id="***ResultMap" type="GroupDO">
      <id column="source_id" jdbcType="BIGINT" property="sourceId"/>
      <collection property="bIdList" ofType="Long" javaType="ArrayList">
          <result column="b_id"/>
      </collection>
    </resultMap>
    <sql id="SourceBuGroup_Column_List">
   source_id,b_id
    </sql>

public class GroupDO implements Serializable {


    private Long sourceId;

    private List<Long> bIdList;


}
### MyBatis 中通过列拼接作为 Key 获取 Map 参数的MyBatis 的 XML 配置文件中,可以通过 `<foreach>` 或者字符串拼接的方式实现将某几列的组合成一个键(Key),并利用该键从传入的 `Map` 参数中获取对应的。 以下是具体的实现方法: #### 方法一:使用 SQL 字符串拼接 可以在 SQL 查询语句中直接定义一个新的字段,用于表示由某些列组成的复合键。例如,在查询语句中使用 `CONCAT()` 函数将多列拼接为单个字符串,并将其映射到目标对象中的某个属性上[^1]。 ```xml <resultMap id="mapResultMap" type="HashMap"> <result property="key" column="compositeKey" javaType="java.lang.String"/> <result property="value" column="valueColumn" javaType="java.lang.String"/> </resultMap> <select id="selectWithCompositeKey" resultMap="mapResultMap" parameterType="Map"> SELECT CONCAT(columnA, ',', columnB) AS compositeKey, someValueColumn AS valueColumn FROM your_table_name WHERE #{yourCondition} </select> ``` 在此配置下,`columnA` 和 `columnB` 被拼接成了新的字段 `compositeKey`,并通过它访问 `Map` 参数中的数据。 --- #### 方法二:动态 SQL 替换占位符 如果需要更灵活地处理输入参数,则可以借助 `${}` 动态替换机制完成自定义逻辑。这种方式适用于简单的场景,但需要注意防止 SQL 注入风险[^3]。 假设有一个名为 `inputParams` 的 `Map` 参数传递给 Mapper 接口,其中包含了部分条件以及期望的结果集结构化方式: ```xml <select id="dynamicSelectByKey" resultType="java.util.Map" parameterType="java.util.Map"> SELECT * FROM table_name t WHERE ${t.columnName} IN ( <foreach collection="keysList" item="item" open="(" separator="," close=")"> '${item}' </foreach> ) </select> ``` 此片段展示了如何基于外部提供的列表构建内部子查询的一部分内容。注意这里的 `${}` 不会像 `#{}` 一样被转义,因此可以直接嵌套变量名或者表达式进去形成最终执行计划所需的部分SQL片断。 --- #### 方法三:服务端预处理后再调用接口 一种思路是在 Service 层先准备好完整的 key-value 映射关系表再交给 DAO 执行操作。这样做的好处是可以充分利用 Java 编程语言的优势简化复杂度较高的业务需求[^2]。 比如下面这个例子就演示了怎样把一组设备编码及其关联的时间戳构建成 HashMap 并注入至持久层组件供后续检索之需: ```java // 构建hashmap存储deviceCode和recordTime的关系 Map<String, String> deviceRecordMap = new HashMap<>(); for(DeviceInfo info : devices){ deviceRecordMap.put(info.getDeviceCode(),info.getRecordTime()); } // 将准备好的map传送给mapper做进一步筛选计算 myMapper.selectByCustomKeys(deviceRecordMap); ``` 随后只需调整 mapper 文件接受上述形式的数据源即可满足题目描述的要求。 --- ### 注意事项 - 当采用 `${}` 进行动态 SQL 组装时务必小心潜在的安全隐患——即未加防护措施的情况下容易遭受恶意攻击者构造特殊字符序列从而突破权限限制等问题的发生。 - 如果涉及大量记录读写动作建议优先选用批量加载策略减少网络交互次数提升整体性能表现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

icool_ali

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

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

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

打赏作者

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

抵扣说明:

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

余额充值