MyBatis中的${}和#{}

学习链接

1关于${}中是写value还是参数名称

按照常规想法,当使用like时,把#{}换成${}来完成sql语句,

因为用#{}的话,需要手动在添加参数时,将参数用"%xx%"包围住,编译后sql语句才是like %xx%,

或者要么用${}来完成,'%${value}%' 这个对应值会直接占据这个位置,并不像#{}那样先用?占据位置,再代入参数,相比上面一种方法,${}更方便,但是也增加了sql注入的风险,所以一般情况,尽量不要用后面一种方法。


但是,这次动态查询时,依旧时写了'%${value}%',而不是'%${title}%',发生了如下错误

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'value' not found. Available parameters are [param5, author, pubulishTime, title, param3, param4, param1, content, param2, statusCode]
Caused by: org.apache.ibatis.binding.BindingException: Parameter 'value' not found. Available parameters are [param5, author, pubulishTime, title, param3, param4, param1, content, param2, statusCode]
复制代码

    <select id="selectArticleByTitleKey" parameterType="String" resultType="Article">
        select * from article where title like '%${value}%'
    </select>
复制代码
<!--复合查询/动态查询-->
    <select id="selectInfoDynamic" parameterType="Article" resultMap="ArticlesList">
        select id,title,image,content,pubulishtime,author,link,localName,statuscode from article
        <trim prefix="where" suffixOverrides="and">
            <if test='title!=null and title!=""'>
                title like '%${title}%' and
            </if>
            <if test='author!=null and author!=""'>
                author=#{author} and
            </if>
            <if test='content!=null and content!=""'>
                content like '%${content}%' and
            </if>
            <if test='pubulishTime!=null and pubulishTime!=""'>
                pubulishtime=#{pubulishTime} and
            </if>
            <if test='statusCode!=null and statusCode!=""'>
                statuscode=#{statusCode}
            </if>
        </trim>
    </select>
复制代码
    <select id="selectArticleByTitleKey" parameterType="String" resultType="Article">
        select * from article where title like '%${value}%'
    </select>
复制代码

总结:

参考Mybatis SQL语句Like查询%${value}%与 #{value} 的区别中评论区博主补充的一句当接受类型为简单类型时,只能写Value


2关于测试时遇到,通过网址来加入参数时,参数为中文,log中参数却显示为乱码

http://localhost:12306/test2?titleKey=%E6%AC%A7%E6%96%87

[DEBUG] 2019-03-05 01:02:08,821 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==>  Preparing: select * from article where title like '%欧æ%' 
[DEBUG] 2019-03-05 01:02:08,822 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: 
[DEBUG] 2019-03-05 01:02:08,824 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<==      Total: 0
复制代码
  • 数据库建库建表都设置了编码utf8
  • jdbc属性配置中也加了
?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
复制代码
  • jsp页面也有
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java" %>
复制代码

将like语句换成=也是一样,有中文依旧乱码

http://localhost:12306/test3?title=%E5%BA%93%E5%85%B9%E9%A9%AC%EF%BC%9A%E8%A6%81%E4%BF%9D%E6%8C%81%E8%BF%87%E5%8E%BB%E4%B8%A4%E5%9C%BA%E7%9A%84%E7%B2%BE%E7%A5%9E%E9%9D%A2%E8%B2%8C%EF%BC%8C%E4%B8%8B%E4%B8%80%E4%B8%AA%E4%BA%BA%E8%A6%81%E7%AB%99%E5%87%BA%E6%9D%A5

[DEBUG] 2019-03-05 01:15:43,630 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==>  Preparing: select * from article where title=? 
[DEBUG] 2019-03-05 01:15:43,631 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: åºå
¹é©¬ï¼è¦ä¿æè¿å»ä¸¤åºçç²¾ç¥é¢è²ï¼ä¸ä¸ä¸ªäººè¦ç«åºæ¥(String)
[DEBUG] 2019-03-05 01:15:43,634 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<==      Total: 0
复制代码

所以和like还是=没有关系,

总结:

暂时没找到解决方法,但是通过页面,写一个input标签来输入中文时,却没有问题

转载于:https://juejin.im/post/5c7d54ef6fb9a049b13ef123

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值