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 ‘张%'

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

调用运行

运行结果:

总结

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

相关文章

  • 使用SpringBoot中web项目推荐目录结构的问题

    使用SpringBoot中web项目推荐目录结构的问题

    这篇文章主要介绍了SpringBoot中web项目推荐目录结构的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • java类访问权限与成员访问权限解析

    java类访问权限与成员访问权限解析

    这篇文章主要针对java类访问权限与成员访问权限进行解析,对类与成员访问权限进行验证,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Java使用新浪微博API通过账号密码方式登陆微博的实例

    Java使用新浪微博API通过账号密码方式登陆微博的实例

    这篇文章主要介绍了Java使用新浪微博API通过账号密码方式登陆微博的实例,一般来说第三方App都是采用OAuth授权认证然后跳转之类的方法,而本文所介绍的账号方式则更具有自由度,需要的朋友可以参考下
    2016-02-02
  • InputStreamReader 和FileReader的区别及InputStream和Reader的区别

    InputStreamReader 和FileReader的区别及InputStream和Reader的区别

    这篇文章主要介绍了InputStreamReader 和FileReader的区别及InputStream和Reader的区别的相关资料,需要的朋友可以参考下
    2015-12-12
  • SpringCloud_Eureka服务注册与发现基础及构建步骤

    SpringCloud_Eureka服务注册与发现基础及构建步骤

    Eureka服务注册中心,主要用于提供服务注册功能,当微服务启动时,会将自己的服务注册到Eureka Server,这篇文章主要介绍了SpringCloud中Eureka的配置及详细使用,需要的朋友可以参考下
    2023-01-01
  • Springboot搭建JVM监控(Springboot + Prometheus + Grafana)

    Springboot搭建JVM监控(Springboot + Prometheus +&n

    在应用开发时,监控报警必不可少,本文主要介绍了Springboot搭建JVM监控(Springboot + Prometheus + Grafana),具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • java仿枚举实例

    java仿枚举实例

    下面小编就为大家带来一篇java仿枚举实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java设计模式之桥接模式详解

    Java设计模式之桥接模式详解

    桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分和实现部分`分离开来,从而使它们可以独立地进行变化,本节给大家讲一下设计模式中的桥接模式,并结合实际业务场景给大家讲解如何使用,需要的朋友可以参考下
    2023-07-07
  • Java微服务的打包问题解决

    Java微服务的打包问题解决

    本文主要介绍了Java微服务的打包问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java实现文件夹上传功能实例代码(SpringBoot框架)

    java实现文件夹上传功能实例代码(SpringBoot框架)

    在web项目中上传文件夹现在已经成为了一个主流的需求,下面这篇文章主要给大家介绍了关于java实现文件夹上传功能(springBoot框架)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04

最新评论