mybatis select返回值為map時,選取表欄位的兩列作為key,value
mybatis select返回值為map時,選取表欄位的兩列作為key,value
一:資料格式確定
在做專案時,遇見這樣的需求,統計每部部門下的裝置數量,因為後臺需要對該資料進行二次處理,所以如果dao層返回List
部門編號 | 數量1 | 數量2 | 數量3 |
---|---|---|---|
部門A | 10 | 1 | 9 |
部門B | 20 | 2 | 18 |
在按照此資料格式進行實施的時,發現Map只有 key、value 只能返回兩個欄位,所有對sql語句進行處理,將其餘欄位通過 concat(數量1,’,’,數量2,’,’,數量3) 連線,則現在的資料格式為
部門編號 | 數量 |
---|---|
部門A | 10,1,9 |
部門B | 20,2,18 |
在上表中 部門編號代表Map的 key ,數量代表Map的 value
二:XxxMapper.xml 書寫
定義resultMap
<resultMap id="mapResultMap" type="HashMap">
<result property="key" column="id" jdbcType="VARCHAR" javaType="java.lang.String" />
<result property="value" column="value" javaType="java.lang.String" jdbcType="VARCHAR" />
</resultMap>
查詢語句
注:該mapper中使用的case when 語法進行統計分析,使用concat拼接結果集欄位
<select id="selectXxxxNum" resultMap="mapResultMap">
select
id as id ,
concat(count(device_id) ,',',
sum(case when customer_id is not null and customer_id != '' then 1 else 0 end),',',
sum(case when customer_id is null or customer_id = '' then 1 else 0 end) ) as value
from sys_device_info
where is_effective = true
group by id
</select>
ResultHandler.java 書寫
package cn.ja.rome.mybatis;
import java.util.HashMap;
import java.util.Map;
import org.apache.ibatis.session.ResultContext;
/**
* 用於轉化結果集
*
* @author jiangliuhong
*/
public class ResultHandler implements org.apache.ibatis.session.ResultHandler {
@SuppressWarnings("rawtypes")
private final Map mappedResults = new HashMap();
@SuppressWarnings("unchecked")
@Override
public void handleResult(ResultContext context) {
@SuppressWarnings("rawtypes")
Map map = (Map) context.getResultObject();
mappedResults.put(map.get("key"), map.get("value")); // xml配置裡面的property的值,對應的列
}
@SuppressWarnings("rawtypes")
public Map getMappedResults() {
return mappedResults;
}
}
SessionMapper.java 書寫
package cn.ja.rome.dao;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.stereotype.Repository;
import cn.ja.rome.mybatis.ResultHandler;
/**
* 用於session查詢
*
* @author jiangliuhong
*/
@Repository
public class SessionMapper extends SqlSessionDaoSupport {
@Resource
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
super.setSqlSessionFactory(sqlSessionFactory);
}
/**
* @return
*/
@SuppressWarnings("unchecked")
public Map<String,Object> selectXxxNum(){
ResultHandler handler = new ResultHandler();
//namespace : XxxMapper.xml 中配置的地址(XxxMapper.xml的qualified name)
//.selectXxxxNum : XxxMapper.xml 中配置的方法名稱
//this.getSqlSession().select(namespace+".selectXxxxNum", handler);
this.getSqlSession().select(XxxMapper.class.getName()+".selectXxxxNum", handler);
Map<String, Object> map = handler.getMappedResults();
return map;
}
}
執行
配置完成,最後在service中注入SessionMapper
@Autowired
private SessionMapper sessionMapper;
public Map<String,Object> test(){
return sessionMapper.selectXxxNum();
}
相關文章
- select,value,pluck 欄位區分
- 根據key集合批次從map中獲取value
- Mybatis-Plus 更新欄位為 NULLMyBatisNull
- spring boot - mybatis Map集合返回空欄位Spring BootMyBatis
- JQuery 獲取select被選中的value和textjQuery
- Java交換map的key和value值Java
- Hashtable/HashMap與key/value為null的關係HashMapNull
- Mybatis框架:foreach迴圈遍歷欄位(為了解決動態表、動態欄位查詢資料)MyBatis框架
- select * 和 select 所有欄位的區別
- java8的stream將一個List轉為按照某個欄位分組的map,再按照另一個欄位取max最終得到一個mapJava
- mybatis自動填充時間欄位MyBatis
- 【Mongo】mongo更新欄位為另一欄位的值Go
- 解決mybatis用Map返回的欄位全變大寫的問題MyBatis
- MySQL為欄位新增預設時間(插入時間)MySql
- mybatis-plus 獲取某列表的某欄位的集合MyBatis
- 欄位管理,為什麼只有新增的時候才自動匹配欄位型別型別
- 一個 key 能儲存多個 value 的 map --- 自定義的 MultiValueMap,實現 Map 介面
- SAP MM MM17裡不能修改物料主資料'Purchasing Value Key'欄位值?
- mybatis中查詢出多個以key,value的屬性記錄,封裝成一個map返回的方法MyBatis封裝
- 類成員函式作為map容器的value使用例項函式
- PHP 陣列作為列表使用時應當遵循的規範PHP陣列
- JavaScript select valueJavaScript
- 在 SQL Server 中,建立表時可以直接為欄位新增唯一約束(UNIQUE)SQLServer
- 為什麼 @Value 可以獲取配置中心的值?
- mybatis&plus系列------Mysql的JSON欄位的讀取和轉換MyBatisMySqlJSON
- SAP MM 為MB51報表增加查詢欄位
- 在使用mybatis的請務必注意欄位的大小寫問題,insert時務必注意mapper的返回值型別MyBatisAPP型別
- 快速將下劃線欄位改為駝峰欄位
- MySQL-去掉不為null的欄位MySqlNull
- ODI基於源表時間戳欄位獲取增量資料時間戳
- Sqlserver的欄位datetime型別預設值設為getdate()時,設值毫秒為000SQLServer型別
- 給mybatis新增自動建表,自動加欄位的功能MyBatis
- 同一張表的兩個欄位比較查詢
- mysql建立表的時候對欄位和表新增COMMENTMySql
- 陣列作為函式引數陣列函式
- 為什麼獲取不到@Value註解值?
- [提問交流]onethink 模型欄位為什麼只有在新增時候 能選擇型別模型型別
- MyBatis實現MySQL表欄位及結構的自動增刪MyBatisMySql
- jpa~為欄位新增insert的預設值