Mybatis下动态sql中##和$$的区别讲解

针对"Mybatis下动态sql中##和$$的区别讲解"这个问题,下面是完整的攻略:

1. ##和$$的基本区别

1.1 ##和$$分别代表什么

Mybatis中的#{}和${}都是用来表示动态sql的。其中,#{}叫做“预编译”。#{}可以防止SQL注入攻击,是使用Mybatis的推荐方式。

在#{}中使用的参数会被自动进行占位符处理,不需要手动添加占位符。而${}叫做“静态值替换”,使用${}的时候需要手动添加占位符。

动态SQL可以使用#{}和${}来引用参数,但是二者在使用方法和特性上有很大区别。区别最大的地方就是处理方式不同。

在Mybatis中动态SQL的引用参数方式如下:

<select id="selectByColumn" resultType="com.example.model.User">
    select * from user where username = #{username}
</select>

1.2 ##和$$处理sql语句的方式

对于#{}使用的参数,执行时会自动进行占位符处理,把参数值放到占位符内,然后再使用占位符构建SQL语句。

对于${}使用的参数,则不是占位符,而是直接替换成为参数值,再构建成SQL语句。

这两种处理方式的差异,直接影响到程序的安全和性能。因此,建议使用#{}进行动态SQL处理。

2. ##和$$的使用示例

下面将分别对##和$$进行示例讲解,让大家对它们的特性更为清晰明了。

2.1 ##的使用示例

二者的使用形式不同,大致可以概括为:#{}把SQL中的参数替换成“?”占位符,然后将参数值分别设置到占位符中;${}直接把参数替换为输入参数值,不做参数类型处理。

比如,在执行查询用户操作时,可能不同用户会采用不同的查询方式,查询参数也会存在许多情况。使用#{}就可以方便的处理这样的情况,具体如下:

<!-- 动态查询 -->
<select id="queryUser" resultType="com.example.model.User">
    select * from user
    where 1=1
    <if test="username != null and username != ''">
        and username like '%'||#{username}||'%'
    </if>
    <if test="email != null and email != ''">
        and email like '%'||#{email}||'%'
    </if>
</select>

使用#{},就可以通过设置不同的动态值,拼接出各种需要的SQL语句,大大降低了代码复杂度,方便了开发人员的开发工作。

2.2 $$的使用示例

使用${}的时候,需要手动添加占位符标志,在输入参数值之前加入“$”符号,典型的例子如下:

<!-- 采用$符号处理 -->
<update id="updateStatus" parameterType="com.example.model.User">
    update users
    set status=${status}
    where user_id=${userId}
</update>

在这里,通过使用$符号,可以方便地把输入参数值替换到SQL语句中的对应位置,使代码更具可读性。

但是,使用${}时,必须注意防范SQL注入攻击,因为参数值会直接拼接到SQL语句中去。

总结

通过本文的介绍,相信各位已经理解了#{}和${}的区别:#{}搭配占位符处理参数,对于动态SQL处理来说,保持较为严谨的处理方式;而${}则不做额外的参数处理,利用自身的占位符拼接SQL语句,更具可读性。

另外,使用MyBatis时,建议尽量采用#{}来代替${}。这样可以保证SQL安全,还能达到更好的性能表现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mybatis下动态sql中##和$$的区别讲解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java — 函数式编程

    函数式编程 面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是怎么做。有时只是为了做某事情而不得不创建一个对象,而传递一段代码才是我们真正的目的。 Lambda Lambda是一个匿名函数,可以理解为一段可以传递的代码。当需要启动一个线程去完成任务时, 通常会通过java.lang.Runnable…

    Java 2023年4月22日
    00
  • Java经典用法总结(二)

    让我们来详细讲解一下《Java经典用法总结(二)》的完整攻略。 简介 本文是《Java经典用法总结》系列的第二篇,主要介绍了Java集合类中常用的几种容器及其使用方法,以及常见的集合操作方式和优化。 Java集合类 Java集合类可以被看作是一种数据结构的封装,用于存储一组相关的数据。Java集合类提供了丰富的操作和算法,可以快速对数据进行处理。 Java集…

    Java 2023年5月20日
    00
  • java实现一个简单的网络爬虫代码示例

    下面是使用Java实现一个简单的网络爬虫的完整攻略: 步骤一:选择一个开源的网络爬虫库 在Java中,我们可以选择很多不同的网络爬虫库,例如jsoup、WebMagic、crawler4j等等。这些库都提供了丰富的API,可以使爬虫开发变得更加容易和高效。 在这里,我们将以jsoup库作为示例进行介绍。 步骤二:分析目标网站结构 在开始爬取前,我们需要分析目…

    Java 2023年5月18日
    00
  • Tomcat 启动错误(8080端口被占用)处理方法

    这里是针对Tomcat启动错误(8080端口被占用)处理的完整攻略。请按以下步骤操作: 1. 查找占用8080端口的进程 打开终端或命令提示符,输入以下命令: Windows netstat -ano | findstr 8080 MacOS/Linux sudo lsof -i :8080 以上命令会列出占用8080端口的进程PID。例如: TCP 127…

    Java 2023年5月19日
    00
  • Java二维数组与动态数组ArrayList类详解

    下面是Java二维数组与动态数组ArrayList类的详解攻略。 Java二维数组的定义和使用方法 二维数组的定义 Java中的二维数组是数组中的数组,可以看作是一种矩阵。二维数组的定义方式如下: dataType[][] arrayName = new dataType[row][column]; 其中,datatype是数据类型,arrayName是数组…

    Java 2023年5月26日
    00
  • 利用5分钟快速搭建一个springboot项目的全过程

    下面是详细的攻略过程,包括两个示例。 前置条件 在开始搭建 Spring Boot 项目之前,需要确保以下环境已经安装和配置好: Java JDK 8+,可使用 java -version 命令检查 Java 安装情况。 Maven 3.0+,可使用 mvn -v 命令检查 Maven 安装情况。 IntelliJ IDEA(或其他任意一款 IDE) 步骤一…

    Java 2023年5月15日
    00
  • java数字和中文算数验证码的实现

    下面将为你讲解如何实现“Java数字和中文算数验证码”的过程。 1. 实现思路 Java数字和中文算数验证码一般包括以下几个步骤: 生成算式表达式和结果 将算式表达式和结果转化为图片 将图片显示在界面上 验证用户输入的答案是否正确 2. 实现步骤 2.1 生成算式表达式和结果 算式表达式可以随机生成,常见的包括加减乘除四则运算,可以使用Java中的随机数生成…

    Java 2023年5月19日
    00
  • Java编写超时工具类实例讲解

    Java 编写超时工具类实例讲解 简介 在实际应用中,我们经常需要限定某些操作的执行时间,以避免程序运行过程中因为某些操作沉睡或者阻塞而导致程序失效。Java 提供了一种基于线程的等待机制,可以用来限定某些操作的执行时间。本文将介绍如何使用 Java 编写一个超时工具类来限定某个操作的最长执行时间。 实现方式 一个常用的方式是使用线程来控制等待时间,如下所示…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部