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>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值