Mybatis之#{}与${}的区别使用详解
1.两种取值方式的差异
mapper.xml映射文件
select*fromt_empWHEREemp_id=${id}andemp_name=#{name}
java查询代码params为id=1,name=”小红”
@Test publicvoidtestSelect(){ InputStreamresourceAsStream=ConfigTest.class.getResourceAsStream("../classes/mybatis-config.xml"); SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(resourceAsStream); SqlSessionsqlSession=sqlSessionFactory.openSession(); EmployeeMappermapper2=sqlSession.getMapper(EmployeeMapper.class); Employeeemployee2=mapper2.selectEmployeeByCondition2(1,"xiaohong"); System.out.println(employee2); }
结果
==> Preparing:select*fromt_empWHEREemp_id=1andemp_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*fromt_order_#{createYM}WHEREDATE_FORMAT(create_date,'%Y%m')=${createYM}+'' 123
结果
==> Preparing:select*fromfromt_order_?WHEREDATE_FORMAT(create_date,'%Y%m')='201706'
==>Parameters:201706(Integer)12
很显然该语句是执行不了的,此时就要采用${}
select*fromt_order_${createYM}WHEREDATE_FORMAT(create_date,'%Y%m')=${createYM}+''
拼装的原生jdbcsql
==> Preparing:select*fromfromt_order_201706WHEREDATE_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#{}与${}内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!