Mybatis 传入参数作为查询语句的情况

1、情形

    刚接到一个新加需求,需要加一个分组查询功能。大概就是有一个下拉框,选中其中一个,那么页面上的列表要根据选中的分组显示,并显示分组的名字和条数。

2、处理

    使用group by语句就可以解决问题。好,先来一个我第一次写的sql:

select count(defectCode) as groupNum,#{groupName} as groupName  
    	from bugbasefields 
    	GROUP BY  #{groupName} 

但是查询结果却不是我想要的:

我去这是什么情况,分组和查询结果都不对。在我一遍遍的尝试无果下,打开了万能的度娘。度娘告诉我:你,回去看看mybatis的#和$的区别,再来找我。于是我又找另一个度娘(打开了另一个页面)仔细看了看mybatis下#和$的区别:
1、#{}将传入的参数当成一个字符串,会给传入的参数加一个双引号;

2、${}将传入的参数直接显示生成在sql中,不会添加引号;

3、#{}能够很大程度上防止sql注入,${}无法防止sql注入;

嗯,那改改吧:

select count(defectCode) as groupNum,${groupName} as groupName  
    	from bugbasefields 
    	GROUP BY  ${groupName} 

结果:

嗯,数据是对了,但是 分组后有null和空字符串,这要是给前端小姐姐,惹她不高兴,我那帮男同事不会给我好果子吃。。。为了不挨揍,那在处理一下。

select count(defectCode) as groupNum,
		 CASE  
			WHEN  (${groupName} is not null and ${groupName} != '')
			THEN  ${groupName} 
	        ELSE  '其它'
	     END  as groupName
		from bugbasefields GROUP BY  groupName 

结果:

空的,空字符串的都统统去"其它"里,这多好,前端好我也好,,嘿嘿。

在这里我发现了一个新大陆,可能是我知识的盲点,group by 后面是可以跟别名的。

这个是数据表字段,分组但是有问题 没出现了3个其他。

但我稍微改了下,分组别名就达到了预期结果:

这就说明group by 语句一定是在查询之后才执行的。。。由此看来我的sql之路还很长。。。。。

最后 ,还是那句希望在编程路上热情不减,一起加油!

 

 

 

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