一文解惑mybatis中的#{}和${}

目录

基本概述

 #{}的基本使用

${}的基本使用 

 ${}使用情况

sql排序asc|desc

拼接表名

批量删除 

模糊查询


基本概述

#{}先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防止sql注入,比较常用。

${}先进行sql语句拼接,然后再编译sql语句,底层是Statement实现。存在sql注入现象。只有在需要进行sql语句关键字拼接的情况下才会用到。

 #{}的基本使用

    <select id="selectById" resultType="pojo.Car">select  * from t_car where id=#{id}</select>

通过执行可以清楚的看到,sql语句中是带有 ? 的,这个 ? 就是大家在JDBC中所学的占位符,专门用来接收值的。

这就是 #{},它会先进行sql语句的预编译,然后再给占位符传值

${}的基本使用 

    <select id="selectByCarType" resultType="com.study.mybatis.pojo.Car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefromt_carwherecar_type = ${carType}</select>

 很显然,${} 是先进行sql语句的拼接,然后再编译,出现语法错误是正常的,因为 燃油车 是一个字符串,在sql语句中应该添加单引号

    <select id="selectByCarType" resultType="com.study.mybatis.pojo.Car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefromt_carwhere<!--car_type = #{carType}--><!--car_type = ${carType}-->car_type = '${carType}'</select>

原则:能用 #{} 就不用 ${}

 ${}使用情况

当需要进行sql语句关键字拼接的时候。必须使用${}

sql排序asc|desc

需求:通过向sql语句中注入asc或desc关键字,来完成数据的升序或降序排列。

<select id="selectAll" resultType="com.study.mybatis.pojo.Car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefromt_carorder by carNum ${key}
</select>

 desc是一个关键字,不能带单引号的,所以在进行sql语句关键字拼接的时候,必须使用${}

拼接表名

业务背景:实际开发中,有的表数据量非常庞大,可能会采用分表方式进行存储,比如每天生成一张表,表的名字与日期挂钩,例如:2022年8月1日生成的表:t_user20220108。2000年1月1日生成的表:t_user20000101。此时前端在进行查询的时候会提交一个具体的日期,比如前端提交的日期为:2000年1月1日,那么后端就会根据这个日期动态拼接表名为:t_user20000101。有了这个表名之后,将表名拼接到sql语句当中,返回查询结果。那么大家思考一下,拼接表名到sql语句当中应该使用#{} 还是 ${} 呢?

使用#{}会是这样:select * from 't_car'

使用${}会是这样:select * from t_car

<select id="selectAllByTableName" resultType="car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefrom${tableName}
</select>

批量删除 

业务背景:一次删除多条记录。

对应的sql语句:

  • delete from t_user where id = 1 or id = 2 or id = 3;
  • delete from t_user where id in(1, 2, 3);

假设现在使用in的方式处理,前端传过来的字符串:1, 2, 3

如果使用mybatis处理,应该使用#{} 还是 ${}

使用#{} :delete from t_user where id in('1,2,3') 执行错误:1292 - Truncated incorrect DOUBLE value: '1,2,3'

使用${} :delete from t_user where id in(1, 2, 3)

<delete id="deleteBatch">delete from t_car where id in(${ids})
</delete>

模糊查询

需求:查询奔驰系列的汽车。【只要品牌brand中含有奔驰两个字的都查询出来。】

使用${}处理方法: 

<select id="selectLikeByBrand" resultType="Car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefromt_carwherebrand like '%${brand}%'
</select>

使用#{}

第一种:concat函数

<select id="selectLikeByBrand" resultType="Car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefromt_carwherebrand like concat('%',#{brand},'%')
</select>

第二种:双引号方式

<select id="selectLikeByBrand" resultType="Car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefromt_carwherebrand like "%"#{brand}"%"
</select>

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

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

相关文章

【技术指南】3D转换工具HOOPS Exchange的功能特征和典型使用场景全解析(二)

什么是 HOOPS Exchange&#xff1f;HOOPS Exchange 是一组软件库&#xff0c;可以帮助开发人员在开发应用程序时读取和写入主流的 2D 和 3D 格式。HOOPS Exchange 支持 在主流的3D 文件格式中读取 CAD 数据&#xff0c;并支持将 3D 数据转换为 PRC 数据格式&#xff0c;这是一种…

关于unity Content Size Fitter 套 Content Size Fitter

首先&#xff1a;最好不要unity Content Size Fitter 套 Content Size Fitter 这样最后得到的变化可能会错误 unity也提示了&#xff0c;父物体如果有了&#xff0c;那么子物体就不要再加了。 但是你们要的需求&#xff1a; 一级父物体 ➡自适应大小➡二级父物体&#xff08…

番外-sql server数据库表及视图未备份,误删恢复

&#xff08;1&#xff09;关闭sql server服务&#xff0c;防止数据发生更大变化&#xff1b;备份数据库的ldf文件和mdf文件&#xff08;非常重要&#xff09; &#xff08;2&#xff09;安装工具ApexSQLLog &#xff08;3&#xff09;运行工具 首先设置一下数据库连接的方式…

MediaType的常用类型-GPT问答

MediaType的常用类型-GPT问答 MediaType是一个枚举类&#xff0c;包含了常见的媒体类型。下面是一些常用的MediaType类型&#xff1a; APPLICATION_JSON&#xff1a;JSON格式的数据APPLICATION_XML&#xff1a;XML格式的数据APPLICATION_FORM_URLENCODED&#xff1a;表单格式的…

JVM笔记

1&#xff0c;什么是JVM 1.1 定义&#xff1a; Java Virtual Machine ,是java程序的运行环境(java二进制字节码的运行环境) 1.2 优势&#xff1a; 一次开发&#xff0c;到处运行自动内存谷粒&#xff0c;垃圾回收功能数组下标越界检查(防止越界覆盖其他数据结构的内存)多态…

深度学习——CNN卷积神经网络

基本概念 概述 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种深度学习中常用于处理具有网格结构数据的神经网络模型。它在计算机视觉领域广泛应用于图像分类、目标检测、图像生成等任务。 核心思想 CNN 的核心思想是通过利用局部…

基于springboot+Redis的前后端分离项目(九)-【黑马点评】

&#x1f381;&#x1f381;资源文件分享 链接&#xff1a;https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码&#xff1a;eh11 附近的商户、用户签到、UV统计 &#xff08;一&#xff09;附近的商户1.附近商户-GEO数据结构的基本用法2.附近商户-导入店铺数据到…

uni-app实现emoj表情包发送(nvue版)

uni-app实现表情包发送&#xff0c; vue实现思路直接使用grideview网格布局加载emoj表情包即可实现&#xff0c;很简单&#xff0c;但是nvue稍微复杂&#xff0c;这里采用的方案是nvue提供的组件list 看效果 代码 <template><view style"margin-right: 10rpx;m…

自定义类型详解(C语言)

自定义类型 一. 结构体1.1 什么是结构体1.2 结构体的声明1.3 特殊的声明1.4 结构体的自引用1.5 结构体变量的定义和初始化1.5.1 结构体变量的定义1.5.2 结构体变量的初始化 1.6 结构体内存对齐1.6.1 为什么存在内存对齐 1.7 修改默认对齐数1.8 结构体传参 二. 位段2.1 什么是位…

k8s与集群管理

从docker讲起 终于有人把 Docker 讲清楚了&#xff0c;万字详解&#xff01; Docker资源&#xff08;CPU/内存/磁盘IO/GPU&#xff09;限制与分配指南 默认情况下&#xff0c;Docker容器是没有资源限制的&#xff0c;它会尽可能地使用宿主机能够分配给它的资源。如果不对容器资…

python如何打包整个项目成exe文件?

首先需要进入项目打包文件所在的目录 运行以下命令打包 build_medicalgraph.py文件 pyinstaller -D build_medicalgraph.py 打包完成后一定要记得下面这个步骤&#xff0c;否则运行会发现报错 把数据文件给放到exe文件同级别目录下 除了以下文件保留&#xff0c;其他文件可以…

win10远程桌面控制Ubuntu服务器 - 内网穿透实现公网远程

文章目录 前言视频教程1. ubuntu安装XRDP2.局域网测试连接3. Ubuntu安装cpolar内网穿透4.cpolar公网地址测试访问5.固定域名公网地址 转载自cpolar极点云文章&#xff1a;树莓派使用Nginx 搭建轻量级网站远程访问 前言 XRDP是一种开源工具&#xff0c;它允许用户通过Windows R…