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随机数生成算法分享

    史上最全的java随机数生成算法分享

    这篇文章主要介绍了史上最全的java随机数生成算法,我分享一个最全的随机数的生成算法,最代码的找回密码的随机数就是用的这个方法
    2014-01-01
  • 详解Lombok的坑

    详解Lombok的坑

    这篇文章主要介绍了详解Lombok的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 使用mybatisplus接收mysql字段为json类型的数据方式

    使用mybatisplus接收mysql字段为json类型的数据方式

    这篇文章主要介绍了使用mybatisplus接收mysql字段为json类型的数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java中关于泛型、包装类及ArrayList的详细教程

    Java中关于泛型、包装类及ArrayList的详细教程

    泛型可以在类或方法中预支地使用未知的类型。这篇文章主要介绍了Java中关于泛型、包装类及ArrayList的详细教程,需要的朋友可以参考下
    2021-12-12
  • Java超详细分析@Autowired原理

    Java超详细分析@Autowired原理

    @Autowired注解可以用在类属性,构造函数,setter方法和函数参数上,该注解可以准确地控制bean在何处如何自动装配的过程。在默认情况下,该注解是类型驱动的注入
    2022-06-06
  • 解读@SelectProvider的使用方法

    解读@SelectProvider的使用方法

    这篇文章主要介绍了@SelectProvider的使用方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 一篇带你解析入门LongAdder源码

    一篇带你解析入门LongAdder源码

    LongAdder类是JDK1.8新增的一个原子性操作类。AtomicLong通过CAS算法提供了非阻塞的原子性操作,因为非常搞并发的请求下AtomicLong的性能是不能让人接受的
    2021-06-06
  • Java面试必考的关键字的用法汇总

    Java面试必考的关键字的用法汇总

    这篇文章主要为大家详细介绍了Java中的几种关键字相关知识,本文比较适合刚入坑Java的小白以及准备秋招的大佬阅读,需要的小伙伴快收藏起来吧
    2023-06-06
  • mybatis plus saveBatch方法方法执行慢导致接口发送慢解决分析

    mybatis plus saveBatch方法方法执行慢导致接口发送慢解决分析

    这篇文章主要为大家介绍了mybatis plus saveBatch方法导致接口发送慢解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 深入jetty的使用详解

    深入jetty的使用详解

    本篇文章是对jetty的使用进行了详细的分析解释。需要的朋友参考下
    2013-05-05

最新评论