java中$和 的区别详解_Mybatis之#{}与${}的区别使用详解

1.两种取值方式的差异

mapper.xml映射文件

select * from t_emp WHERE emp_id=${id} and emp_name=#{name}

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 * from t_order_#{createYM} WHERE DATE_FORMAT(create_date,'%Y%m')=${createYM}+''

123

结果

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

==> Parameters: 201706(Integer)12

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

select * from t_order_${createYM} WHERE DATE_FORMAT(create_date,'%Y%m')=${createYM}+''

拼装的原生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 #{}与${}内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云 ram 容器镜像_容器中Java RAM的使用:不会丢失内存的5大技巧

阿里云 ram 容器镜像在本文中&#xff0c;我们希望分享Java内存管理的细节以及容器内部的弹性&#xff0c;这些细节乍一看并不明显。 在下面&#xff0c;您将找到要注意的问题列表以及即将发布的JDK版本中的重要更新&#xff0c;以及针对核心痛点的现有解决方法。 我们收集了5…

python 图表美化_你的图表不美观怎么办,Python实现数据可视化帮你实现

之前突然看到一个用Python实现数据可视化的技术&#xff0c;小编觉得解决了生活中的好多问题&#xff0c;大家一起来看看这个神器。1、主页首先&#xff0c;这个主页的设计就是我非常喜欢的风格&#xff0c;简单清晰&#xff0c;第一眼就让人有特别清爽的感觉&#xff0c;不愧是…

java堆内存剩余多少合理_Java堆内存的10个要点

我刚开始学习Java编程时&#xff0c;可不知道什么是堆内存或堆空间(heap space)&#xff0c;甚至根本不管对象创建时都放在哪里去了。正式了写一些程序后&#xff0c;经常会遇到java.lang.outOfMemoryError等错误&#xff0c;我才开始关注堆内存。对大多数程序员都经历过这样的…

Struts2请求处理的内部流程图/结构图/原理图(版本一)

流程说明&#xff1a; 1.客户端浏览器&#xff08;Client&#xff09;向服务器发送一个 http 请求&#xff08;HttpServletRequest&#xff09; 2.Container&#xff08;容器&#xff09; 通过 web.xml 映射请求&#xff0c;并获得控制器&#xff08;Controller&#xff09;的…

python求字符串的所有子集_打印一字符串的所有子集 | 学步园

#include#include#include#includeusing namespace std;void getSub(string src,int i,vector &result){//取子串方法:将串src中的第i个字符抠掉即为所求的子串assert(iif (src.length()<1){result.push_back(src);return;}src.erase(i,1); //删除从i开始的一个字符r…

aws 堆栈模板_使用Arquillian和LocalStack脱机测试AWS云堆栈

aws 堆栈模板在AWS云堆栈 &#xff08;例如DynamoDB&#xff0c;S3等&#xff09;上构建应用程序时&#xff0c;需要针对这些组件编写测试。 您可能首先想到的是拥有一个用于生产的环境和另一个用于测试的环境&#xff0c;然后针对该环境运行测试。 这对于集成测试&#xff0c…

java中springdi_java中spring入门

1、spring的概念apache推出的java企业框架&#xff0c;提供了基于ioc的对象工厂、aop面向切面编程等功能及其他增强功能。当前版本4.xxx&#xff0c;支持注解的配置。 springmvc。2、控制反转(ioc):inversion of control。用来描述框架的重要特征spring针对ioc的具体实现&#…

分析 Web 资源的访问过程(Servlet 程序访问过程)

浏览器输入地址&#xff1a;http://224.45.10.567:8080/qpw/greeting?namezs 浏览器通过224.45.10.567:8080与服务器&#xff08;Web Server&#xff0c;例如&#xff1a;Tomcat&#xff09;连接 服务器会在webapps目录下寻找qpw目录&#xff0c;找到后再进入qpw目录内寻找WE…

spring flux_Spring Web-Flux – Cassandra后端的功能样式

spring flux在上一篇文章中&#xff0c;我介绍了Spring Web-Flux的基础知识&#xff0c;它表示Spring框架的Web层中的响应式支持。 我已经展示了使用Spring Data Cassandra并在Spring Web Layers中使用传统注释支持的端到端示例&#xff0c; 大致如下&#xff1a; ... import…

tableau选择计算_干货 | 年薪40W, 掌握Tableau的留学生真的赚翻了

文章来源&#xff1a;UniCareer Tableau作为一款数据分析工具向来被视为文科转行Data必学因为它不需要你有Coding经验而且极易上手那么&#xff0c;Tableau究竟该怎么学&#xff1f;学会Tableau可以胜任哪些岗位&#xff1f;1Tableau: 学到就是赚到Tableau作为一款数据可视化工…

java 对线程进行事务控制_Java 多线程事务回滚 ——多线程插入数据库时事务控制...

背景日常项目中&#xff0c;经常会出现一个场景&#xff0c;同时批量插入数据库数据&#xff0c;由于逻辑复杂或者其它原因&#xff0c;我们无法使用sql进行批量插入。串行效率低&#xff0c;耗时长&#xff0c;为了提高效率&#xff0c;这个时候我们首先想到多线程并发插入&am…

Java Servlet 编程,重定向介绍

文章目录什么是重定向重定向流程演示图如何重定向注意的问题重定向的特点重定向演示什么是重定向 服务器向浏览器发送一个状态码 302 及一个消息头 location&#xff0c;浏览器收到后&#xff0c;会立即向 location 所指向的地址发送请求。 重定向流程演示图 &#xff08;1&a…

java platform_Java Platform Module系统中的可选依赖项

java platformJava平台模块系统&#xff08;JPMS&#xff09;对依赖项有很强的见解&#xff1a;默认情况下&#xff0c;需要它们&#xff08;可以访问&#xff09;&#xff0c;然后在编译时和运行时都将它们存在。 但是&#xff0c;这不适用于可选的依赖项&#xff0c;因为代码…

python图片重命名 工具_python - 请问django如何给上传的图片重命名

问 题我的models.py:pic models.ImageField(upload_toimg/%Y/%m)怎样给上传的图片重命名&#xff1f;例如&#xff1a;以当前上传的时间给图片命名.谢谢~&#xff01;解决方案结贴&#xff1a;1、先在你项目中添加一个文件夹如&#xff1a;system 在文件夹下添加__init__.py 和…

java索引序列_视图、序列、索引

视图视图(VIEW)也被称作虚表&#xff0c;即虚拟的表&#xff0c;是一组数据的逻辑表示。视图对应于一个SELECT语句&#xff0c;结果集被賦予一个名字&#xff0c;即视图名字。视图本身并不包含任何数据&#xff0c;它只包含映射到基表的一个查询语句&#xff0c;当基表数据发生…

Java 打 jar 包时,MANIFEST.MF 文件详解

具体详情&#xff0c;详见《MANIFEST.MF文件详解》 manifest.mf 的编写规则 不能有空行和空格的地方 第一行不可以是空行&#xff08;第一行的行前不可以有空行&#xff09;&#xff0c;行与行之间不能有空行&#xff0c;每行的行尾不可以有空格 一定要有空行的地方 最后一行…

hibernate删除记录_Hibernate记录:常见问题的提示和解决方案

hibernate删除记录如何通过适当的日志记录解决一些最常见的Hibernate问题&#xff1f; Hibernate的日志记录配置是一个重要但很少讨论的主题。 正确的配置可以帮助您在开发过程中发现潜在的问题&#xff0c;而错误的配置则可以在生产中导致严重的性能问题。 这就是我在新书《 …

python中的range_python中range()与xrange()用法分析

本文实例讲述了python中range()与xrange()用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;据说range比xrange开销要大&#xff0c;原因是range会直接生成一个list对象&#xff0c;而xrange每次调用返回其中的一个值(参考://www.jb51.net/article/50072.htm)。于是…

java velocity详解_[velocity] velocity详解

(1)为什么要使用模版语言&#xff1f;在服务器端可以使用 Velocity处理模板和生成的动态内容(HTML、XML等)。这和JSP技术的目标非常接近。但是&#xff0c;JSP模型可以毫无阻碍地访问底层的Servlet API和Java编程语言。它基本上是一种在很大程度上开放的访问模型。而作为一种完…