动态行转列,网上很多例子都是通过存储过程来实现,其实这样挺麻烦,可以通过现在代码中拼接字符串方式,实现.
使用场景,当需要行转列查询时,如果转化后列是动态的,可以先将列的字段去重查询出来,然后在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>