mysql實現動態行轉列,不用存儲過程,mybatis

 

動態行轉列,網上很多例子都是通過存儲過程來實現,其實這樣挺麻煩,可以通過現在代碼中拼接字符串方式,實現.

使用場景,當需要行轉列查詢時,如果轉化後列是動態的,可以先將列的字段去重查詢出來,然後在java代碼中進行sql拼裝,然後再作爲參數傳入sql,注意mybatis去參數的時候用${param},才能編譯,不能使用#{param}方式,不然會當成字符串不會進行編譯.

 

實例,在不確定有多少課程的時候,需要進行動態行轉列,

方式一:不使用動態存儲過程實現

     步驟一:去重查詢所有的課程

           select distinct coursenm from table1;

        得到課程集合coursenmList;

 

     步驟二:變量課程拼裝動態sql語句

//拼裝行轉列,類似於下面這種語句
// MAX( CASE coursenm WHEN '大學語文' THEN scores else 0 END ) AS 大學語文,

StringBuilder sb = new StringBuilder();
for (String s : coursenmList) {
    sb.append("MAX( CASE coursenm WHEN '" + s);
    sb.append("' THEN scores ELSE 0 END ) AS " + s + ",");
}
//移除最後一個逗號
String sql = sb.subSequence(0, sb.length() - 1).toString();


步驟三: 在dao寫接口,可以根據實際場景增加其他參數

List<Map<String, Object>> getResult(@Param("sql") String sql);

 

 步驟四: mybatis的mapper.xml 取參數,返回結果是map

<select id="getResult" resultType="java.util.Map">

       select stuid ,stunm,${sql} from table group by stunm

</select>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章