Mybatis之#{}与${}的区别使用详解

 更新时间:2020年06月15日 14:40:31   作者:Javxuan  
这篇文章主要介绍了Mybatis之#{}与${}的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1.两种取值方式的差异

mapper.xml映射文件

<select id="selectEmployeeByCondition2" resultMap="empResultMap" databaseId="mysql">
    select * from t_emp WHERE emp_id=${id} and emp_name=#{name}
  </select>

java查询代码 params 为 id=1 ,name=”小红”

@Test
  public void testSelect() {
    InputStream resourceAsStream = ConfigTest.class.getResourceAsStream("../classes/mybatis-config.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    EmployeeMapper mapper2 = sqlSession.getMapper(EmployeeMapper.class);

    Employee employee2 = mapper2.selectEmployeeByCondition2(1,"xiaohong");
    System.out.println(employee2);
  }

结果

==>  Preparing: select * from t_emp WHERE emp_id=1 and emp_name=?
==> Parameters: xiaohong(String)
<==    Columns: emp_id, emp_name, emp_email, emp_tel, emp_dep, emp_status
<==        Row: 1, xiaohong , 123@qq.com, 123, 1, 0
<==      Total: 112345

1.1 #{}

从上述代码可以看出 #{} 在原生jdbc语句中会用 ?占位符来表示。这样做可以防止sql注入

1.2${}

从上述代码可以看出 ${} 是直接把param 拼到原生sql上

2.什么时候该使用什么方式

从上述示例可以看出 #{} 与${}的作用都是取值,同时#{}还可以防止sql注入更安全。是否表示在以后代码中就用#{}呢? 当然不是这样的,比如某电商系统的订单表数据量太庞大,不得以分表来保存数据。该电商的工程师最后决定将该表按年月进行分表(t_order_201701,t_order_201702…)。这个时候我们该采用那个中方式进行查询呢,如我要查询17年6月份的全部订单?
你可能想当然的认为这个容易,只要把年月动态传入到sql中就可以了如下:

<select id="selectOrderByCondition" resultMap="orderResultMap" databaseId="mysql">
    select * from t_order_#{createYM} WHERE DATE_FORMAT(create_date,'%Y%m')=${createYM}+''
  </select>123

结果

==>  Preparing: select * from from t_order_? WHERE DATE_FORMAT(create_date,'%Y%m')='201706'
==> Parameters: 201706(Integer)12

很显然该语句是执行不了的,此时就要采用${}

<select id="selectOrderByCondition" resultMap="orderResultMap" databaseId="mysql">
    select * from t_order_${createYM} WHERE DATE_FORMAT(create_date,'%Y%m')=${createYM}+''
  </select>

拼装的原生jdbcsql

==>  Preparing: select * from from t_order_201706 WHERE DATE_FORMAT(create_date,'%Y%m')='201706'
==> Parameters: 201706(Long)12

很显然这条sql可以执行。

3.总结

动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${} 。

1、#相当于对数据 加上 双引号,$相当于直接显示数据。
2、#{} : 根据参数的类型进行处理,比如传入String类型,则会为参数加上双引号。#{} 传参在进行SQL预编译时,会把参数部分用一个占位符 ? 代替,这样可以防止 SQL注入。
3、${} : 将参数取出不做任何处理,直接放入语句中,就是简单的字符串替换,并且该参数会参加SQL的预编译,需要手动过滤参数防止 SQL注入。
4、因此 mybatis 中优先使用 #{};当需要动态传入 表名或列名时,再考虑使用 ${} , 比较特殊,他的应用场景是需要动态传入表名或列名时使用,mybatis 排序时使用orderby动态参数时需要注意,用$而不是#

到此这篇关于Mybatis之#{}与${}的区别详解的文章就介绍到这了,更多相关Mybatis #{}与${}内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的System.getProperty()详解

    Java中的System.getProperty()详解

    System.getProperty("XXX")方法用来读取JVM中的系统属性,那么java 虚拟机中的系统属性使用在运行java程序的时候java -D配置,有两种方式,一种是在命令行配置另一种是在IDE中配置,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2023-09-09
  • 深入理解Java中的HashMap的实现机制

    深入理解Java中的HashMap的实现机制

    这篇文章主要介绍了深入理解Java中的HashMap的实现机制,同时也有助于理解Java中对于哈希函数的相关处理方式,需要的朋友可以参考下
    2015-07-07
  • 使用jps命令查看Java进程的详细指南

    使用jps命令查看Java进程的详细指南

    jps是Java开发者和系统管理员的得力助手,它简化了Java进程监控的过程,使得快速检查应用运行状态变得轻而易举,在Java开发和运维场景中,jps是一个非常实用的命令行工具,本文介绍了如何有效地使用 jps命令来查看Java进程的详细指南,需要的朋友可以参考下
    2024-10-10
  • Spring.Net控制反转IoC入门使用

    Spring.Net控制反转IoC入门使用

    这篇文章主要为大家详细介绍了Spring.Net控制反转IoC入门使用的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • java对象拷贝详解及实例

    java对象拷贝详解及实例

    这篇文章主要介绍了java对象拷贝详解及实例的相关资料,需要的朋友可以参考下
    2017-04-04
  • IntelliJ IDEA maven 构建简单springmvc项目(图文教程)

    IntelliJ IDEA maven 构建简单springmvc项目(图文教程)

    在工作当中,我们有时需要创建一个全新的工程,而基于spring-mvc web的工程较为常见,这篇文章主要介绍了IntelliJ IDEA maven 构建简单springmvc项目(图文教程),感兴趣的小伙伴们可以参考一下
    2018-05-05
  • springmvc+shiro+maven 实现登录认证与权限授权管理

    springmvc+shiro+maven 实现登录认证与权限授权管理

    Shiro 是一个 Apache 下的一开源项目项目,旨在简化身份验证和授权,下面通过实例代码给大家分享springmvc+shiro+maven 实现登录认证与权限授权管理,感兴趣的朋友一起看看吧
    2017-09-09
  • Spring Boot 使用 Disruptor 做内部高性能消息队列

    Spring Boot 使用 Disruptor 做内部高性能消息队列

    这篇文章主要介绍了Spring Boot 使用 Disruptor 做内部高性能消息队列,工作中遇到项目使用Disruptor做消息队列,对你没看错,不是Kafka,也不是rabbitmq。Disruptor有个最大的优点就是快,还有一点它是开源的哦,下面做个简单的记录
    2022-06-06
  • SpringMVC 拦截器的使用示例

    SpringMVC 拦截器的使用示例

    这篇文章主要介绍了SpringMVC 拦截器的使用示例,帮助大家更好的理解和学习使用SpringMVC,感兴趣的朋友可以了解下
    2021-04-04
  • Java中的Kotlin 内部类原理

    Java中的Kotlin 内部类原理

    这篇文章主要介绍了Java中的Kotlin 内部类原理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06

最新评论