Mybatis中的#和$的区别

上图,先看使用#{}带来的问题,控制台打印出来的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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值