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安全,还能达到更好的性能表现。

阅读剩余 43%

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

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

相关文章

  • C语言与java语言中关于二维数组的区别

    C语言和Java语言在二维数组的定义和使用方面存在一些区别,下面我将分别对它们的二维数组进行详细讲解。 C语言中的二维数组 定义 在C语言中,二维数组可以被定义为由多个一维数组组成的数组,每个一维数组又由多个元素组成。二维数组的定义和初始化可以通过以下方式进行: // 定义一个3行4列的二维数组 int a[3][4] = { {1, 2, 3, 4}, {…

    Java 2023年5月26日
    00
  • Java字节流 从文件输入输出到文件过程解析

    Java字节流 从文件输入输出到文件过程解析 什么是Java字节流 Java字节流主要用来处理二进制数据,包括字节、字节数组、字符串等。使用Java字节流,可以将数据从一个地方输入到Java程序,也可以从程序输出到另一个地方,比如文件、网络等。Java字节流主要包括InputStream、OutputStream和它们的子类。 文件输入输出 Java字节流的…

    Java 2023年5月26日
    00
  • 一个jsp+AJAX评论系统

    下面是一个jsp+AJAX评论系统的完整攻略。 前期准备 在开始创建一个jsp+AJAX评论系统之前,我们需要准备以下几个方面的内容: 后端语言。对于jsp+AJAX评论系统,我们使用的后端语言是Java。 数据库。我们需要使用数据库来存储和获取评论数据。常见的数据库有MySQL和Oracle等。 Web应用程序服务器。我们需要使用Web应用程序服务器来运行…

    Java 2023年6月15日
    00
  • 分享java打印简单图形的实现代码

    下面是分享Java打印简单图形的实现代码的完整攻略: 准备工作 在开始之前,我们需要进行一些准备工作。首先,我们需要具备一定的Java基础知识,如循环、条件语句、方法的定义和调用等。其次,我们需要了解一些控制台输出相关的知识,如System.out.print()和System.out.println()的使用方法等。 实现代码 下面是Java打印简单图形的…

    Java 2023年5月23日
    00
  • 解析Java编程之Synchronized锁住的对象

    下面我将详细讲解“解析Java编程之Synchronized锁住的对象”的完整攻略。 介绍 在Java编程中,使用Synchronized关键字来进行同步控制是非常常见的路线。这个关键字提供了一种简单的方法来确保在并发代码的同时,一组代码只有一个线程可以访问。Synchronized关键字的目标对象是引用变量。 应用 要在Java编程中使用Synchroni…

    Java 2023年5月26日
    00
  • 一天吃透SpringBoot面试八股文

    Springboot的优点 内置servlet容器,不需要在服务器部署 tomcat。只需要将项目打成 jar 包,使用 java -jar xxx.jar一键式启动项目 SpringBoot提供了starter,把常用库聚合在一起,简化复杂的环境配置,快速搭建spring应用环境 可以快速创建独立运行的spring项目,集成主流框架 准生产环境的运行应用监…

    Java 2023年4月30日
    00
  • Java 中的Printstream介绍_动力节点Java学院整理

    Java 中的PrintStream 介绍 什么是 PrintStream PrintStream 是 Java 中用于输出数据的一个类,提供了一系列的 print() 和 println() 方法实现输出功能。 PrintStream 常用的构造方法有两种: PrintStream(File file) PrintStream(OutputStream o…

    Java 2023年5月26日
    00
  • Android 解析JSON对象及实例说明

    Android 解析JSON对象及实例说明 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript语言的一个子集,因此容易被人阅读和编写,同时也易于机器解析和生成。在Web应用程序中,JSON通常用来传递从服务器到客户端的数据。 Android中使用JSON Android中提…

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