上图,先看使用#{}带来的问题,控制台打印出来的sql语句在navicat终端执行是正常的。但通过浏览器请求接口,浏览器展示出来的值就是有问题(没有查出列的数据,反倒是将字段的列名称查出来了)。这是什么问题呢,控制台能打印出正确的sql语句,说明获取参数和设置参数中的Controller层、Service层是没有问题的,此时则说明问题出现在Dao层,照这样推断应该是Mybatis那里出现了问题。但到底是什么问题呢?百思不得其解。。。
折磨了大半天了,还是求助峰哥吧。
我还在纠结是不是mybatis中distinct函数不能这样用,结果峰哥一眼就发现了问题所在,“把#字号改为美元符号”。我之前mybatis的入参是string类型的,如果我这里直接将#换成美元符号(打美元符号这个字符,csdn会报错所以就中文描述了)是会报错的。然后峰哥建议我map入参(这里峰哥笔误map.put写成了map.set).我个老六,#和$换来换去的没成功被峰哥发现了。
成功了,虚心请教吧
#{}和${}传参的区别
使用#{}
#{}是把传过来的值当成了一个字符串处理了,是字符串就得有引号。难怪没有查出数据的列值,查出了列名,看看下图吧。
#{}使用?做占位符
#{}可防止sql注入
使用${}
${}没有使用"?"占位符,直接将传参的值设置进了sql语句中
Java使用Map获取并设置前端传参
// 根据传参查询字段列表
@ResponseBody
@RequestMapping("/queryListByColumnName")
public Object queryListByColumnName(HttpServletRequest request) {
logger.info("调用了queryListByColumnName方法");
Map<String,Object> paramMap = new HashMap<>();
String columnName = request.getParameter("columnName");
//将前端传过来的参数设置进map中
paramMap.put("columnName",columnName);
JSONObject obj = new JSONObject();
List<WebZtlcProvateequity> ztlcProvateequityList = null;
try {
ztlcProvateequityList = webZtlcProvateequityServiceI.getWebZtlcProvateequityByParam(paramMap);
} catch (Exception e) {
e.printStackTrace();
obj.put("flag", 0);
obj.put("msg", "查询失败!");
return obj;
}
obj.put("flag", 1);
obj.put("msg", "查询成功!");
obj.put("objsList", ztlcProvateequityList);
return obj;
}
mybatis 入参Map类型(parameterType=“Map”)
<select id="selectWebZtlcProvateequityByParam" parameterType="Map" resultMap="BaseResultMap">
select DISTINCT ${columnName} from web_ztlc_provateequity order by ${columnName} asc;
</select>