mybatis中${}和#{}的区别以及底层原理分析

 更新时间:2024年05月07日 10:30:48   作者:JinF~  
这篇文章主要介绍了mybatis中${}和#{}的区别以及底层原理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

${}和#{}的区别以及底层原理

${}

不会自动加 ' ',如果传入参数为简单类型,那么必须写 ${value},如果是对象,写的是${属性名};

底层解析的时候只要sql语句包含 ${ } ,在创建cofigration对象的时候,这条sql就会被解析成动态类型的语句,底层不会把 ${ } 转成 " ? "(不做处理),只会在使用Mapper接口代理对象进行数据操作的时候把#{ }转成 " ? ",之后再调用JDBC进行赋值,把${ }转成mapper接口的参数值,所以会存在SQL注入的问题

#{}

对于字符串会自动加 ' ',如果传入参数为简单类型,可以写 ${任意值},如果是对象,写的是${属性名}

底层解析的时候如果sql语句只包含 #{ } ,这条sql就会被解析成静态类型的语句,会把 #{ }转成 " ? ",进行数据操作时调用JDBC进行赋值

#{}和${}取值符号

如图,两个方法的参数类型为简单类型,简单类型包括8大基本类型和String

  • 1. #{}取值符号会自动为String类型的参数加上‘’单引号
  • 2. ${}取值符号不会自动为String加上‘’单引号

当sql标签的查询代码是 select * from t_user where username =  ‘lyx’;

这种情况,需要使用自动加上单引号的#{}:select * from t_user where username = #{username}

当查询数据降序排序时:

UserDao接口如下:

select * from t_user order by 排序字段名 desc

UserMapper.xml文件如下:

 

调用

  • queryUserOrderByColumn(String column)运行结果

      

  • queryUserOrderByColumn2(String column)运行结果2

  • 看数据库中的数据,说明方法1没有成功降序排序

所以对于动态排序的sql语句,要用${},而不用#{}

对于排序正确 的代码是

select * from t_user order by username desc

如果使用#{},会自动为String类型添加单引号,变成

select * from t_user order by 'username' desc

所以查不到数据

来看使用${}的第二种情况:模糊查询

sql语句应该是,

LIKE_ (单个任意字符)
列名 LIKE ‘张_'
LIKE % (任意长度的任意字符)
列名 LIKE ‘张%'

显然,使用 ${},不自动添加单引号才是正确的

调用运行

运行结果:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

最新评论