MyBatis動態SQL如何實現前端指定返回字段
動態SQL實現前端指定返回字段
問題描述
在使用ClickHouse時,遇到需要根據業務需求,動態返回指定字段,從而充分利用ClickHouse列式存儲的優勢。
解決方案
可用MyBatis的動態SQL進行數據返回;故可在業務層將指定返回的列傳入數據層,利用foreach標簽進行遍歷返回數據。
代碼實現
1.請求參數
@Data public class QueryDTO { /** * 返回值 */ private Set<String> targetFields; }
2.mapper接口
/** * 查詢數據 * @param record * @return */ List<ResourceTotal> query(QueryDTO record);
3.mapper.xml實現
<sql id="Base_Result_Column"> resourceId, platformCount, createUserId </sql>
<select id="query" parameterType="cn.example.module.data.test.QueryDTO" resultMap="BaseResultMap"> select <foreach collection="targetFields" item="item" separator=","> ${item} </foreach> , <include refid="Base_Result_Column"/> from resource_total where 1 = 1 </select>
4.註意事項
a.使用動態返回字段時,不可使用預先編譯,故foreach中使用‘$’符號,而不使用‘#’;
b.foreach標簽後若還有其他固定字段返回,記得用逗號‘,’分隔。
MyBatis如何返回部分字段
mybatis 返回部分字段,這裡介紹兩種方式(主推第一種)
.xml文件中resultMap的type改為
java.util.HashMap 即可
其餘代碼都不用寫, 親測可用,xml文件中代碼如下:
<!-- 返回類型 --> <resultMap id="testRestMap" type="java.util.HashMap"> <result column="province_name" jdbcType="VARCHAR" property="provinceName" /> <result column="area_name" jdbcType="VARCHAR" property="areaName" /> <result column="lane_num" jdbcType="VARCHAR" property="laneNum" /> <result column="road_name" jdbcType="VARCHAR" property="roadName" /> </resultMap> <!--sql查詢 --> <select id="selTest" resultMap="testRestMap"> select province_name, area_name,lane_num, road_name from site_info where 1=1 and del_flag='0' </select>
第二種很笨的方法
重新新建一個對象實體,該實體文件的字段與要返回的 “部分字段” 一一對應即可,代碼如下:
resultMap 的type=com.sinosoft.pojo.DeviceNumber 指向一個文件,該文件為新建實體類,裡面是要返回的 “部分字段”
<!-- 全省設備數量統計 數據返回 --> <resultMap id="DeviceNumber" type="com.sinosoft.pojo.DeviceNumber"> <result column="distCode" jdbcType="VARCHAR" property="distCode" /> <result column="distName" jdbcType="VARCHAR" property="distName" /> <result column="number" jdbcType="VARCHAR" property="number" /> </resultMap> <!-- 全省設備數量統計 --> <select id="statisticsDevice" resultMap="DeviceNumber"> SELECT t1.distCode, t1.distName, t2.number FROM ( select fd_objectid distCode, area_name distName FROM t_sys_area WHERE LEVEL='2' ) t1 LEFT JOIN ( SELECT city_no, count(*) as number FROM site_info WHERE 1=1 and del_flag='0' and is_bridge!='1' GROUP BY city_no )t2 on t2.city_no=t1.distCode </select>
DeviceNumber 文件內容如下:
package com.sinosoft.pojo; /** * 數據返回 * @author zhangyajuan * */ public class DeviceNumber { private String distCode;//行政區劃 private String distName;//行政區劃名稱 private String number;//設備數量 public String getDistCode() { return distCode; } public void setDistCode(String distCode) { this.distCode = distCode; } public String getDistName() { return distName; } public void setDistName(String distName) { this.distName = distName; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Mybatis中resultMap的Colum和property屬性詳解
- Mybatis中resultMap的使用總結
- mybatis-puls中的resultMap數據映射
- mybatis映射和實際類型不一致的問題
- Mybatis實現聯表查詢並且分頁功能