mybatis里面#是预编译的那么$什么时候会用呢,
如题求解,应该不难 这个问题。
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}%'
注释的时候会用,应该是吧
#{} 在预处理时,会把参数部分用一个占位符 ?
select * from A where name = ?;
${} 则只是动态解析阶段简单的字符串替换
select * from A where name = 'aaaaa';
userPhone的值传入“111111”
select * from user where userPhone=
使用#{}格式传入入参后的执行sql为:
select * from user where userPhone=‘111111’
使用#{}格式传入入参后的执行sql为:
select * from user where userPhone=111111
特别注意的是limit 应该用${}而不是#{}
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}%'
楼上解释的很清楚了,我这边是提供建设性建议是不要用${},使用#{}安全可靠便捷防注入等优点
${} 出来的是不带引号的,#{}会有引号的,你需要自己判断,需要用什么,例如通用mapper 需要映射表名的,你就要用$,不然加引号会报错
如果你数据库的字段是字符型,就需要用#,会加上引号,你用$语句就报错了
需要动态传入表名、字段名(列名)进行查询时使用 ${}
一般排序时使用 ${}:
order by ${sortColumn} ${sortOrder}
动态查询时使用 ${}
select * from ${tableName} where ${columnName} = #{...}
#{request} 会将request按字符串解析,即会将 request 解析成 'request',${request} 则不会讲request按字符串解析(会导致sql注入)
#{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。
${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换
select * from user where name like '%${searchStr}%' 说明:searchStr字符串,$一般为拼接一般用于模糊查询
select * from user where name = #{searchStr} 说明:searchStr为一个变量