(易懂)Mybatis中${}和#{}的区别和使用注意

2023-10-27

目录

一、区别

1. ${}使用字符串拼接的方式拼接sql,如果数据是字符串类型或日期,我们需要手动加引号,而#{}会自动加上引号

2. #{}安全${}不安全 容易造成sql注入。sql注入就是改变sql的语法规则,进行sql命令攻击

3. #{}是经过预编译的,是安全的,而${}是未经过预编译的,仅仅是取变量的值,是非安全的

4.sql和java一样 预编译会省去编译的时间,提升效率

二、如何选择和使用#{}和${}

1、有#{}选#{}

2、如果数据是表的字段,例如Order by 那么我们可以使用#{}

3、加上注解@param("")给参数重命名,相当于加了一层密  数据库字段名称要保密,防止别人拿到

4、${}加注解:by${重命名} 不加注解by${value}

5、重点案例——模糊查询 (也可以先看这个)


一、区别

1. ${}使用字符串拼接的方式拼接sql,如果数据是字符串类型或日期,我们需要手动加引号,而#{}会自动加上引号

2. #{}安全${}不安全 容易造成sql注入。sql注入就是改变sql的语法规则,进行sql命令攻击

3. #{}是经过预编译的,是安全的,而${}是未经过预编译的,仅仅是取变量的值,是非安全的

4.sql和java一样 预编译会省去编译的时间,提升效率

二、如何选择和使用#{}和${}

1、有#{}选#{}

2、如果数据是表的字段,例如Order by 那么我们可以使用#{}

3、加上注解@param("")给参数重命名,相当于加了一层密  数据库字段名称要保密,防止别人拿到

4、${}加注解:by${重命名} 不加注解by${value}

5、重点案例——模糊查询 (也可以先看这个)

为了更方便地看出区别,我们可以加一个mybatis的日志。

需要注意的是要加在前面。

<settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
<!--        设置mybatis的日志-->
<!--        logImpl:表示对日志的控制-->
<!--        "STDOUT_LOGGING"打印在控制台上-->
    </settings>

代码加在SqlMapConfig.xml中

然后我们运行一个上篇文章增的例子:https://blog.csdn.net/hefangxuxing/article/details/124439417?spm=1001.2014.3001.5502

@Test
    public void insert(){
        User user =new User();
        user.setBirthday(new Date());
        user.setAddress("印度");
        user.setSex("男");
        user.setUsername("刘墉");
        //提交
        int count =mapper.insert(user);
        session.commit();
        System.out.println(count);
    }
    <insert id="insert" parameterType="com.qcby.entity.User">
        insert into user(username,birthday,sex,address)
        values(#{username},#{birthday},#{sex},#{address})
    </insert>

日志的?是占位符  #{}就是用占位符,然后自动帮你拼接。

而${}是字符串拼接 里面value他不认识值,想认识值需要加注解

 接下来我们可以通过一个模糊查询的例子来体验下二者的异同

 @Test
    public void likeByName(){

        List<User> users =mapper.likeByName("熊");
        for (User user:users){
            System.out.println(user.toString());
        }
    }
    <select id="likeByName" resultType="com.qcby.entity.User"                             
        parameterType="java.lang.String">
        select * from user where username like '%${username}%'
    </select>
 public List<User> likeByName(@Param("username") String name);

这里我们为了让用户可以通过输入熊 来查询名字中间有熊的所以使用了${}

而接口中likeByName方法用了注解,把变量进行了重命名加密。

如果使用#{}的话还想让用户不需要输入%熊%

你有什么方法吗?可以练习一下

----------------------------------------------------------

我的做法:

 
    public void likeByName(String username){
        String name = "%"+username+"%";
        List<User> users =mapper.likeByName(name);
        for (User user:users){
            System.out.println(user.toString());
        }
    }
       
   @Test
   public void diaoyong (){
    likeByName("熊")

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(易懂)Mybatis中${}和#{}的区别和使用注意 的相关文章

  • HTML-Entity 转义以防止 XSS

    我有一些用户输入 在我的代码中 我确保对以下符号进行转义 gt amp lt gt lt gt gt gt OWASP https www owasp org index php XSS 28Cross Site Scripting 29
  • 一般如何处理 CXF 请求处理程序中的输入参数?

    我一直在使用 apache CXF 版本 2 2 2 JAX RS 进行一些工作 我试图在调用业务方法之前在 CXF 请求处理程序中引入数据验证层 幸运的是 我在请求处理程序 DataValidationHandler 中遇到输入参数处理问
  • Java中构造函数中的长参数列表[重复]

    这个问题在这里已经有答案了 可能的重复 重构具有太多 6 个以上 参数的方法的最佳方法是什么 https stackoverflow com questions 439574 whats the best way to refactor a
  • Maven 管理的 Java EE 应用程序中 JBoss 提供的库

    这对我来说实际上不太可能 但网上似乎没有关于将 JBoss 提供的依赖项导入 Maven 管理的 Java EE 应用程序以在其中部署的直接答案 据我所知 有两件事与这个问题有关 那就是jboss as client外部 就 JVM 而言
  • 编写潜在并发问题的证明

    我正在阅读 Java 并发实践 并尝试编写一段代码来表明第 3 5 1 章中作为示例提供的类确实会引入问题 public class Holder public int n public Holder int n this n n publ
  • 用于将字符串与预定义字符混合/混淆的简单算法

    我有一个字符串如下 它的长度是10 它代表基数 36 因此包含数字和大写字母 字符串的来源是数据库生成的序列 即从 1 及以上 正在转换为基数 36 我的问题是转换为base 36转换的结果也是连续 顺序的 例如 ID 1402 gt 00
  • 访问 java jigsaw 模块中的资源文件[重复]

    这个问题在这里已经有答案了 我正在尝试从项目中的类访问 Eclipse 项目中的文件 我需要将该项目声明为 jigsaw 模块才能从其他项目访问它 但是通过这样做 我无法再访问项目中的 example png 等文件 这是我的项目结构 pr
  • Android 在 ROOM 数据库中插入大量数据

    我有大约 10 个模型 每个模型都有超过 120K 行和 90 列的记录 其中包含双数组值 在 Room 中插入任何模型都需要超过 125 130 秒 任何人都可以建议我需要做什么才能使用一些批量插入技术来保存所有这些 120K 该技术大约
  • 确定范围是否重叠

    给定两个具有整数开始时间和结束时间的事件 E1 s1 e1 E2 s2 e2 实现快速布尔检查以查看事件是否重叠 我有解决方案 但我很想看看其他人想出了什么 编辑 好的 这是我的解决方案 e1 gt s2 s1 gt s2 e2 lt s1
  • java IO将一个文件复制到另一个文件

    我有两个 Java io File 对象 file1 和 file2 我想将 file1 的内容复制到 file2 有没有一种标准方法可以做到这一点 而无需我创建一个读取 file1 并写入 file2 的方法 不 没有内置方法可以做到这一
  • Java中的String为什么是不可变的对象,但我在创建一个对象后仍然可以更改它的值? [复制]

    这个问题在这里已经有答案了 如果我可以创建一个字符串并给它一个值 这怎么可能呢 然后 我可以像这样简单地覆盖它的值 String a abc a def 我怎么可能改变的值a 我一定在这里遗漏了一些东西 我知道每当创建 String 对象时
  • 使用 python 中的 java 库

    我有一个 python 应用程序和 java 应用程序 python 应用程序为 java 应用程序生成输入并在命令行上调用它 我确信一定有一个更优雅的解决方案 就像使用 JNI 从 Java 调用 C 代码一样 有什么指点吗 仅供参考 我
  • 运行Java程序时出错

    我正在尝试使用 netbeans 运行我的 java 程序 但收到此错误 有什么建议吗 Exception in thread AWT EventQueue 0 java lang NullPointerException at javax
  • 如何正确安装mysqlconnecter java?

    上网冲浪后 我意识到我应该在系统环境变量中设置类路径连接器 jar 文件的路径文件我这样做了 并在命令行中输入此命令我有这个 C Users User gt echo classpath D classpath mysql connecto
  • 带有 CONTAINS 查询的PreparedStatement

    我有一个查询需要连续运行 28000 次 所以我认为使用准备好的语句可能是一个聪明的主意 这是我的查询 String requestWithFirstName SELECT SE ELEMENT ID SE LASTNAME SE FIRS
  • Cordova Android 应用程序中的网页不可用

    编辑 我一直在解决这个问题并回顾我的所有步骤 我很乐意缩小这个问题的规模 并在令人困惑的情况下获得更多确切的细节 目前 我觉得 Keycloak 似乎只想将我重定向到 https 据我所知 这应该是 Wildfly 服务器配置问题 编辑 我
  • 无法渲染非字符串的属性,toString 返回:null SPRING MVC 中的错误

    我正在尝试按照本教程为我的 spring mvc 项目创建一个通用错误处理程序 http www mkyong com spring mvc spring mvc exceptionhandler example http www mkyo
  • Android 布局崩溃

    I use a XWalkView https crosswalk project org 加载网页和视频查看器 https github com Bilibili ijkplayer在我的应用程序中播放实时视频 我希望 IjkVideoV
  • OkHttp javax.net.ssl.SSLPeerUnverifiedException:主机名domain.com未验证

    我几天来一直在努力让它发挥作用 我正在尝试通过以下方式连接到我的服务器https带有自签名证书 我认为现在没有任何页面或示例是我未读过的 我做了什么 按照本教程创建了 bks 密钥库 http blog crazybob org 2010
  • 确定方法调用顺序的接口设计模式

    我想创建一个具有多种方法的 Java 接口 但我希望界面的用户只能按照我定义的顺序或顺序调用方法 例如buyTicket 不应在此之前调用reserveTicket 问 有没有设计模式或任何关于如何做到这一点的提示 我考虑过 A 接口被包装

随机推荐

  • 报错解决TypeError: write() argument must be str, not list

    今天写爬虫的时候遇到的问题 将抓取的数据保存下来的时候报错 TypeError write argument must be str not list 字面意思是write写入的应该是str类型的数据 而不是一个list类型的数据 回到代码
  • x264的参考帧管理机制

    x264介绍 X264是一款研究的是H 264编码的开源代码软件 相比JM而言 其编码性能有很大的提高 其支持大多数H 264的特性工具 包括 CABAC和 CAVLC高效嫡编码 多参考帧预测 所有的帧内预测宏块类型 16x6l和4x4 所
  • 官宣——BSV工程师能力认证项目在CSDN推出线上学习平台

    去年11月 上海可一澈科技有限公司 以下简称 可一科技 与CSDN联合推出了BSV区块链开发工程师能力认证项目 以下简称 BSV工程师认证 今天 BSV工程师认证项目正式推出一个全新的线上学习平台 并发布首门课程 比特币协议与设计 本次推出
  • LDO基础知识:噪声 - 降噪引脚如何提高系统性能

    使用低压降稳压器 LDO 来过滤开关模式电源产生的纹波电压并不是实现清洁直流电源的唯一考虑因素 由于 LDO 是电子器件 因此它们会自行产生一定量的噪声 选择低噪声 LDO 并采取措施来降低内部噪声对于生成不会影响系统性能的清洁电源轨而言不
  • PYQT的最新界面代码

    This Python file uses the following encoding utf 8 import sqlite3 import traceback from PyQt5 QtGui import QMouseEvent Q
  • springboot入门简单使用

    springboot入门简单使用 1 SpringBoot项目创建并配置mysql数据库 创建项目 编写Controller测试 配置数据库 2 SpringBoot集成mybatis plus 初始化数据库 安装mybatis plus
  • 使用 imshow() 绘制矩阵

    使用 imshow 绘制矩阵 基础的展示效果 import matplotlib pyplot as plt import numpy as np mat np arange 0 100 reshape 10 10 plt imshow m
  • linux文件编程(4)—— 用ANSIC标准C库函数进行文件编程:fopen、fread、fwrite、fseek

    参考 linux文件编程 5 用ANSIC标准中的C库函数进行文件编程 作者 丶PURSUING 发布时间 2021 04 11 11 58 25 网址 https blog csdn net weixin 44742824 article
  • 深度优先搜索的框架

    深度优先搜索 最少分支找到答案 一 准备 1 节点间的relationship 2 列表lst 存放遍历结果 3 集合set 去重 二 结构 函数递归 def dfs root 1 首先判断根节点是否为空节点 if root is None
  • Python学习笔记-Python 变量类型

    变量是存储在内存中的值 这就意味着在创建变量时会在内存中开辟一个空间 变量赋值 Python 中的变量赋值不需要类型声明 每个变量在使用前都必须赋值 变量赋值以后该变量才会被创建 等号 用来给变量赋值 等号 运算符左边是一个变量名 等号 运
  • 【解决问题】mybatis-plus想要修改某字段为null问题

    背景 最近将框架的mybits换为mybits plus 然后在调用updateById时候 想让某个字段修改null 一直失败 问题 mybits plus调用updateById时候 想让某个字段修改null 一直失败 问题原因 myb
  • 2022最新个人所得税计算(附代码)

    相信大家一定很在意下面的三个问题 个人所得税怎么计算 年终奖如何扣税 五险一金如何计算 通过这篇文章 我们用实际例子来计算我们需要交的税 一 个人所得税怎么计算 第一步 计算全年收入 年终奖除外 做个假设 比如 博主上班后 开的工资是30k
  • React + antd +DatePicker组件禁用小于当下时间之前的时间,包括时,分

    一 DatePicker组件的设置 showTime设置时间只显示时 分 不显示秒 disabledDate函数 设置日期的禁用 disabledTime函数 设置时间的禁用
  • Centos 8 安装向日葵(sunloginclient-10.0.0-1)

    1 去官网下载最新的安装包 下载地址 2 准备安装 下面的问题可能遇到 但愿你们遇不到 如果没遇到问题 直接 rpm ivh sunloginclient 10 0 1 24347 amd64 rpm root yaco ls opt to
  • JavaScript中对象的简单使用实例(String、Math、Date、Array)

    String对象使用 JavaScript中的字符串对象 和字符串的常用方法 var s string 查看目标字符串是否可以匹配一个字符串 如果可以 则返回该字符串 否则返回空 alert s match str 返回字符出现的位置 al
  • 【设计模式】观察者模式

    观察者模式是一种行为型设计模式 它定义了一种一对多的依赖关系 当一个对象的状态发生改变时 其所有依赖者都会收到通知并自动更新 当对象间存在一对多关系时 则使用观察者模式 Observer Pattern 比如 当一个对象被修改时 则会自动通
  • vite项目 router/indext.ts 中引入 views/**/*.vue 页面后报错的解决方法

    报错现象 view 文件夹下新建文件夹 新建的文件夹下新建view页面 路由文件中引入views vue 页面时出现了报错 报错现象如下 解决方法 在 tsconfig app json 文件中添加 src vue 注意 添加保存后报错可能
  • uniapp 动态修改 tabbar 的高度

    项目中使用了原生的tabbar tabbar的修改提供了两个API 看了 html5 plus的文档 没有看到可以修改tabbar的部分
  • js正则表达式去除空行

    表单文本域中的内容可能有时候会存在空行 但我们保存时并不想要多余的空行 所以要想办法去掉它 只需要一个简单的正则表达式即可 n n n n
  • (易懂)Mybatis中${}和#{}的区别和使用注意

    目录 一 区别 1 使用字符串拼接的方式拼接sql 如果数据是字符串类型或日期 我们需要手动加引号 而 会自动加上引号 2 安全 不安全 容易造成sql注入 sql注入就是改变sql的语法规则 进行sql命令攻击 3 是经过预编译的 是安全