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

本文介绍了一种不依赖存储过程的动态行转列方法,通过在Java代码中动态拼装SQL语句,实现对不确定数量列的转换。具体步骤包括:1. 查询并获取所有需要转换的列名;2. 动态拼装CASE WHEN语句;3. 在DAO层定义接口接收拼装好的SQL;4. MyBatis中使用${}
743

被折叠的 条评论
为什么被折叠?



