面试-3.MyBatis中#与$的区别,PrepareStatement

从JDBC到MyBatis:持久层技术演进与SQL注入防护实战 在Java企业级开发中,数据库持久层技术是构建稳定应用的核心基础。JDBC作为Java连接数据库的标准接口,提供了最底层的数据库操作能力,但其样板代码多、资源管理繁琐、手动映射易错等痛点影响了开发效率。为了解决这些问题,ORM框架应运而生,通过对象关系映射将数据库表与Java对象关联,实现了SQL与业务代码的解耦。MyBatis作为一款半自动ORM框架,在保留SQL灵活性的同时,通过Mapper接口与XML配置实现了参数安全映射和动态SQL,显著提升了开发效率和代码可维护性。特别是在安全层面,MyBatis 阅读详情

MyBatis中#与$的区别

0.c 防止sql 注入

举个例子:

	String sql = "select id from t_user where name =?";  

	PreparedStatement prep = conn.prepareStatement(sql);  
	prep.setString(1, name);  
    ResultSet rst = prep.executeQuery();  
  • 使用PrepareStatement时,SQL语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析和编译,对应的执行计划也会缓存下来,之后数据库就会以参数化的形式进行查询。当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如上图中 or ‘1=1’,它也会作为一个字段的值来处理,而不会作为一个SQL指令。从根本上讲,其实就是data VS. code的问题,确保data永远是data,不会是可执行的code,就杜绝了SQL注入这种问题。
1.MyBatis

MyBatis中使用parameterType向SQL语句传参,parameterType支持的类型可以是基本类型int,String,HashMap和java自定义类型。

在SQL中引用这些参数的时候,可以使用两种方式:

  • #{parameterName}

  • ${parameterName}

mybatis对这两种参数的处理分为两个阶段,

     首先为构建sqlsessionFactory的时候,这个时候的处理为,如果sql中含有${}则该条sql不做处理,如果sql中全是#{}则替换为 ? 。

     然后是sqlSession执行sql阶段,该阶段首先会将${value} 原封不动的替换为 value传过来的值,然后在将sql中的#{} 替换为 ? 。

2.总结
  • ${} 会将传入的参数完全拼接到sql语句中,也就是相当于一个拼接符号。比如说 : String sql = select * from user where id=${value}
          最后的处理方式就相当于 MyBatis 会将 ${value} 完全替换为参数 value 的值。 相当replace("${value}", value)的过程。实际上mybatis 是先将sql转成char数组,然后截取 "KaTeX parse error: Expected '}', got 'EOF' at end of input: …的部分放入到容器,替换 以"{"开头 以 "}"结尾的内容。所以说它的作用相当于拼接符号。拼接后直接作为sql语句的一部分,所以如 果参数是可执行代码,sql是会直接执行的。这就是为什么它会导致sql注入。

  • #{} 是一个占位符, mybatis最后会将这个占位符,替换成?,最后才进行prepareStatement的相应位置的?的替换,也就是 state.setString(序号,值),setInt(序号,值)等。

使用#{}传递参数,被JDBC解析为PreparedStatement预编译语句,变量内容被当做一个整体变量,比如字符串,整形等。使用${}传递参数,纯粹是字符串替换,中间出现SQL语句,也会被正常执行。所以,在Mybatis中使用使用$传递参数时,需要考虑sql注入的问题。

Tips:
      ${}方式一般用于传入数据库对象,例如传入表名、字段名。
      排序时使用order by 动态参数时需要注意,用${}而不是 #{}。

MyBatis与MyBatis-Plus防SQL注入:从预编译原理到实战安全编码 SQL注入是Web应用中最常见且危险的安全漏洞之一,其本质在于攻击者通过构造恶意输入,篡改原始SQL语句的逻辑结构,从而非法操作数据库。其防御的核心原理在于参数化查询(预编译),通过JDBC的PreparedStatement将SQL指令结构与用户输入数据严格分离,从根源上杜绝注入。这项技术是构建安全数据访问层的基石,广泛应用于需要处理用户输入并执行数据库查询的所有Java Web应用场景。MyBatis框架通过#{}占位符默认实现了参数化查询,而MyBatis-Plus的条件构造器(如LambdaQuer 阅读详情

相关推荐

吃透MyBatis底层原理:从JDBC封装到Spring Boot整合实战

MyBatis本质是对JDBC使用模式的标准化封装,其核心在于将SQL执行抽象为SqlSession工作单元、Mapper动态代理与配置驱动的执行链路。理解其原理需回归JDBC原始痛点——参数绑定脆弱、结果映射冗余、资源管理易错,进而掌握SqlSession生命周期、Executor执行器机制及XML与注解双轨制的工程权衡。技术价值体现在提升SQL可治理性、支持插件化横切(如分页/日志)、实现线程安全的数据库会话隔离;典型应用场景包括Spring Boot中多数据源路由、二级缓存集成Redis、动态SQL精

weixin_30437847的博客 399

MyBatis

1、#{}和${}的区别是什么? Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;mybatis在处理${}时,就是将${}替换成变量的值. PS:使用#{}可以有效的防止SQL注入,提高系统安全性(语句的拼接),如果使用在order by 中就需要使用 ${}。 最大区别在于:#{} 传入值时,sql解析参数是带引号的,而${}传入值时,sql解析参数是不带引号的。 --Mybatis在处理#{}时 select id,na

敲代码的彭于晏 973

MyBatis入门与实战:从JDBC痛点解析到核心机制深度应用

在Java企业级应用开发中,数据库持久化是核心环节。传统JDBC虽然提供了基础的数据库访问能力,但其冗长的样板代码、繁琐的资源管理和易错的手动映射,严重影响了开发效率与代码可维护性。为此,ORM(对象关系映射)框架应运而生,旨在通过自动化与配置化,将开发者从重复劳动中解放出来,使其更专注于业务逻辑与SQL优化。MyBatis作为一款“半自动化”的持久层框架,其核心价值在于平衡了控制权与开发效率。它不像Hibernate那样完全屏蔽SQL,而是将SQL的编写权交还给开发者,同时自动化处理JDBC底层的连接管理

weixin_34121282的博客 323

MyBatis源码分析(二)prepareStatement预编译的执行流程

通常我们如果自己写建立数据库连接的代码的时候,都会这么写 pstmt = conn.prepareStatement(sql); pstmt.setString(1, email); result = pstmt.executeQuery(); 而Mybatis是怎么封装,又是怎么进行预编译的呢,今天就一文让你理解Mybatis的原理 一、获取Executor 我们之前一篇文章《MyBatis源码分析(一)基本请求流程》讲了Mybatis执行的基本流程,包括Plugin插件。 其实在执行过程中,所有的sq

lz710117239的博客 3570

SQL注入攻击原理、实战与防御全解析:从漏洞利用到安全加固

SQL注入是一种经典的Web安全漏洞,其核心原理在于攻击者通过构造恶意输入,使得应用程序将用户输入的数据错误地执行为SQL代码,从而绕过身份验证、窃取或篡改数据库信息。这种漏洞的根源在于应用程序未对用户输入进行严格的过滤与校验,导致数据与代码边界混淆。从技术价值看,理解SQL注入是掌握Web安全攻防的基础,它直接关系到数据保密性、完整性和可用性。在实际应用场景中,无论是登录模块、搜索功能还是数据查询接口,任何涉及数据库交互且未做充分防护的地方都可能存在注入风险。本文以SQL注入为例,深入剖析了其产生机制、多

wentao365的专栏 391

深入MyBatis源码:架构解析、SQL执行流程与缓存机制详解

在Java持久层框架中,ORM(对象关系映射)技术是连接应用程序与关系型数据库的核心桥梁。其基本原理是通过元数据映射,将Java对象与数据库表结构进行关联,自动完成SQL生成、参数绑定和结果集转换。这一技术极大地提升了开发效率,降低了数据库操作的复杂性。从技术价值看,优秀的ORM框架能有效管理数据库连接、事务和缓存,是构建高性能、可维护后端系统的关键组件。在实际应用场景中,无论是电商系统的订单处理,还是内容管理平台的数据查询,都离不开对SQL执行流程和缓存机制的精细控制。本文将聚焦MyBatis这一广泛使用

weixin_33801856的博客 749

以mysql为例介绍PreparedStatement防止sql注入原理

最近,在写程序时开始注意到sql注入的问题,由于以前写代码时不是很注意,有一些sql会存在被注入的风险,那么防止sql注入的原理是什么呢?我们首先通过PrepareStatement这个类来学习一下吧! 作为一个IT业内人士只要接触过数据库的人都应该知道sql注入的概念及危害,那么什么叫sql注入呢?我在这边先给它来一个简单的定义:sql注入,简单来说就是用户在前端web页面输入恶意的sql语句用

lisehouniao的博客 1万+

【五斗米】Mybatis

动态sql,主要用于解决查询条件不确定的情况:在程序运行期间,根据用户提交的查询条件实现动态拼接sql语句进行查询数据。 这里的条件判断使用的表达式为OGNL表达式,常用的动态sql标签有、、等 if标签:条件判断 where标签:判断包含节点有内容就插入 where,否则不插入 foreach标签:遍历元素............

m0_64210833的博客 1597

java prepare_java中prepareStatement与createStatement的区别

首先来看两段代码:第一个使用createStatement()1 public void delete( intid){2 try{3 Connection c =DBUtil.getConnection();4 Statement s =c.createStatement();5 String sql = "...

weixin_39832348的博客 368

Mybatis详细教程

Mybatis详细讲解教程,适用于新手学习与应用

FreeRTOS系统CPU使用率统计

操作系统中CPU使用率是在软件架构设计中必须要考虑的一个重要性能指标。它直接影响到程序的执行时间以及优先级更高的任务能否实时响应的问题。而CPU使用率也不能过低,避免资源浪费。

灵哎惹,凌沃敏的博客 1377

Java开发中SQL注入防御全解析:从PreparedStatement到MyBatis最佳实践

SQL注入是一种常见且危害极大的Web安全漏洞,其本质在于攻击者能够将恶意构造的数据作为SQL代码的一部分执行,从而绕过应用层逻辑直接操作数据库。其核心防御原理在于严格区分数据与代码,通过参数化查询确保用户输入始终被当作数据处理,而非可执行的指令。在Java技术栈中,这一原理主要通过预编译机制实现技术价值,它能从根本上杜绝大部分注入攻击。具体到工程实践,开发者需要深入理解JDBC的PreparedStatement工作机制,并掌握主流ORM框架如MyBatis中#{}与${}操作符的关键区别。正确的应用场景

weixin_34378767的博客 513

真双口RAM---Quartus与Vivado开发环境区别对比

2、写和写冲突:表示两个端口写使能同时有效且写地址相同,此时需要关断一个写,把两个写端口都需要更新的值处理到一个写端口上面,任何的DP RAM 都不支持写和写冲突。以上述直方图统计使用为例,博主在仿真过程中发现,vivado真双口RAM--B端口读写延迟2个clk;1、读和写冲突:如果读和写同时有效,且读和写是同一个地址时,发生RAM读写冲突,此时会把最新的写数据直接赋给读数据,称为写穿通到读。

weixin_54470733的博客 3582

MyBatis面试题总结

啃下MyBatis源码 - MyBatis面试题总结 1.概念/使用方法向的问题 1.1 什么是Mybatis? 1.2为什么说Mybatis是半ORM框架?/与Hibernate有哪些不同? 1.3Mybaits的优点? 1.4MyBatis框架的缺点? 1.5#{}和${}的区别? 1.6怎么解决实体类中的属性名和表中的字段名不一样的问题? 1.7在mapper中如何传递多个参数? ...

持之以恒,方得始终 2万+

Unreal 5 MetaHuman插件全流程:从安装到角色动画生成

本文详细介绍了Unreal 5中MetaHuman插件的全流程使用指南,从安装配置到角色动画生成。通过Quixel Bridge下载预设角色,利用面部捕捉技术赋予数字人模型生命力,并提供材质编辑、性能优化等进阶技巧,帮助用户快速创建照片级真实的虚拟角色。

weixin_29009081的博客 829

iTunes登录协议抓包实战:绕过反检测与TLS解密的完整方案

在软件逆向与网络协议分析中,抓包工具扮演着关键角色。代理型工具如Fiddler通过修改系统代理实现HTTPS解密,而驱动型工具如HTTPDebugger则注入进程钩取网络API,但这些实现机制往往会被具有反检测策略的客户端识别。以iTunes登录协议为例,其内置证书锁定、进程完整性与系统代理检测等防护,导致常规抓包方案失效。从工具原理出发,对比不同抓包方案的暴露面,重点介绍如何利用Fiddler通过中间人代理获取明文流量,以及使用Wireshark进行被动监听规避检测的进阶技巧,并总结常见问题排查经验,为分

weixin_28607671的博客 366

Mybatis面试题

Mybatis面试题 resultType 和 resultMap 的区别? resultType 是标签的一个属性,适合简单对象(POJO、JDK 自带类型: Integer、String、Map 等),只能自动映射,适合单表简单查询。 <select id="selectAuthor" parameterType="int" resultType="com.gupaoedu.domain.Author"> select author_id authorId, author_n

cgk1996的博客 289

PCL 逐点插入法构建Delaunay三角网(C++详细过程版)

点云构建Delaunay三角网的逐点插入法基于PCL点云库的C++详细过程版实现

点云侠的博客 2991

JDBC与MyBatis深度对比:从手动操作到半自动ORM的持久层演进

在Java后端开发中,持久层是连接应用与数据库的关键组件,其核心是实现数据访问逻辑的封装。从原理上看,持久层技术经历了从底层接口到高级框架的演进,旨在提升开发效率与代码可维护性。JDBC作为Java官方的数据库连接标准,提供了最基础的数据操作能力,但需要开发者手动处理连接管理、SQL执行和结果映射,代码冗余且易出错。相比之下,MyBatis作为半自动ORM框架,通过SQL与代码分离、参数自动映射等机制,显著减少了样板代码,同时保留了SQL编写的灵活性。这种设计在提升开发效率的同时,也便于进行SQL优化和性能

weixin_30520015的博客 341

三极管电平转换电路

摘要:本文介绍了三种基于三极管的电平转换电路方案。第一种采用双NPN三极管实现3.3V转5V反相电平转换;第二种使用单NPN三极管完成5V转3.3V同相转换;第三种利用单PNP三极管实现3.3V转5V同相转换。各方案均通过三极管的开关特性配合电阻网络实现电压域适配,具有结构简单、成本低的优点,适用于不同逻辑电平设备(如MCU与外设)间的信号兼容传输。文中详细分析了各电路的工作原理、元件作用和特性,并通过Multisim仿真验证了其功能有效性。

XU157303764的博客 1853

LAMMPS实例教程—In文件详解

本博文主要介绍专栏 《LAMMPS实例教程—In文件详解》, 针对于 Lammps 可分析的物理过程进行讲解,提供 In 文件以及后处理方法,持续更新。 目前分为8个专题: 1)力学专题、2)传热专题、3)相变专题、4)界面专题、5)吸附专题、6)流动专题、7)物性专题以及8)基础理论专题。

Rockyoung 3万+

mybatis 零:基本原理

目录 概念: MyBatis的架构: MyBatis根据功能架构分为三个层:(体系结构) ★★★★★ 执行器Exceutor: 实现类: 处理器Handler: 缓存: 二级缓存的实现: MyBatis在面试中常见的问题: 概念: MyBatis是一个持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动...

zuo_h_dr的博客 457

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

2019秋招java后端面试题

1.jsp九大内置对象 request对象:表示来自客户端的请求 response对象:表示对客户端的响应 session对象:指的是客户端与服务器的一次会话 out对象 :out对象是用来向客户端输出内容 page对象:page对象指向当前JSP页面本身 application对象:实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在 pa...

qq_41531073的博客 487

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深入MyBatis源码:从核心原理到插件机制,掌握ORM框架精髓

在Java后端开发中,ORM框架是连接应用与数据库的关键桥梁,其核心在于将对象模型与关系型数据库进行高效、灵活的映射。MyBatis作为一款主流的持久层框架,通过其清晰的架构设计,实现了SQL与Java代码的解耦,让开发者能够以声明式的方式操作数据库。理解其底层原理,如动态SQL的生成机制、缓存的实现策略以及插件的扩展点,对于构建高性能、可维护的数据访问层至关重要。这些机制不仅关系到应用的执行效率,也直接影响到复杂业务场景下的开发体验。例如,通过分析**插件(Plugin)** 的动态代理实现,可以深入理解

weixin_34269583的博客 392

大厂Java面试核心:基础原理与实战能力解析

Java作为企业级开发的主流语言,其底层原理和工程实践能力是技术面试的核心考察点。从JVM内存模型到并发编程机制,这些基础概念构成了Java技术体系的基石。理解HashMap扩容策略、锁升级过程等原理级问题,不仅能展现知识深度,更能体现解决高并发、分布式场景的实际能力。大厂面试特别关注候选人对GC调优、线程安全等问题的实战经验,这些技能直接影响系统性能和稳定性。通过分析典型面试题如秒杀系统设计、性能优化方案等,可以系统性地掌握分布式架构和工程实践要点。

weixin_33981932的博客 346
上一篇: 面试-阿里社招笔试题两则(二)----基于hashMap实现LRU缓存
下一篇: 面试-4.索引失效问题
过河的小卒子
博客等级 码龄10年 39粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值