StackTc
2018-06-25 08:55
采纳率: 61.9%
浏览 2.5k
已采纳

mybatis里面#是预编译的那么$什么时候会用呢

mybatis里面#是预编译的那么$什么时候会用呢,
如题求解,应该不难 这个问题。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

12条回答 默认 最新

  • Orange.P 2018-06-25 09:28
    已采纳

    $

    order by:
    一般使用#,防止注入,但在排序问题上,必须使用$进行注入。
    因为#是按string类型拼接,就成为:order by 'cloumn' 'desc'。

    order by ${sortColumn} ${sortOrder}

    使用$则为:order by cloumn desc。

    limit:

    limit #{index}, #{rows}

    like:

    and ss.survey_name like "%"#{surveyName}"%"


    and prod_name like '%${prodName}%'

    点赞 评论
  • gbzw1234zqkl 2018-06-25 13:12
    1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".   
    2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id
    点赞 1 评论
  • youling4651 2018-06-25 09:01

    注释的时候会用,应该是吧

    点赞 评论
  •  #{} 在预处理时,会把参数部分用一个占位符 ?
    select * from A where name = ?;
     ${} 则只是动态解析阶段简单的字符串替换
        select * from A where name = 'aaaaa';
    
    点赞 评论
  • happy00y 2018-06-25 09:07

    userPhone的值传入“111111”
    select * from user where userPhone=
    使用#{}格式传入入参后的执行sql为:
    select * from user where userPhone=‘111111’
    使用#{}格式传入入参后的执行sql为:
    select * from user where userPhone=111111
    特别注意的是limit 应该用${}而不是#{}

    点赞 评论
  • Orange.P 2018-06-25 09:32

    和 $

    order by:
    一般使用#,防止注入,但在排序问题上,必须使用$进行注入。
    例:order by ${sortColumn} ${sortOrder}
    因为#是按string类型拼接,就成为:order by 'cloumn' 'desc'。
    使用$则为:order by cloumn desc。

    limit:
    例: limit #{index}, #{rows}

    like 使用# $的方式:
    例: and ss.survey_name like "%"#{surveyName}"%"
    例: and prod_name like '%${prodName}%'

    点赞 评论
  • 曾经我的梦想很大 2018-06-25 09:36

    楼上解释的很清楚了,我这边是提供建设性建议是不要用${},使用#{}安全可靠便捷防注入等优点

    点赞 评论
  • 默默a20 2018-06-25 09:46

    ${} 出来的是不带引号的,#{}会有引号的,你需要自己判断,需要用什么,例如通用mapper 需要映射表名的,你就要用$,不然加引号会报错

    点赞 评论
  • 默默a20 2018-06-25 09:47

    如果你数据库的字段是字符型,就需要用#,会加上引号,你用$语句就报错了

    点赞 评论
  • 葫芦胡 2018-06-25 09:54

    需要动态传入表名、字段名(列名)进行查询时使用 ${}
    一般排序时使用 ${}:
    order by ${sortColumn} ${sortOrder}
    动态查询时使用 ${}
    select * from ${tableName} where ${columnName} = #{...}
    #{request} 会将request按字符串解析,即会将 request 解析成 'request',${request} 则不会讲request按字符串解析(会导致sql注入)

    点赞 评论
  • qq_38974579 2018-06-25 09:59

    #{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。
    ${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换

    点赞 评论
  • Lei_Da_Gou 2018-06-25 12:18

    select * from user where name like '%${searchStr}%' 说明:searchStr字符串,$一般为拼接一般用于模糊查询
    select * from user where name = #{searchStr} 说明:searchStr为一个变量

    点赞 评论

相关推荐 更多相似问题