2020-09-28

Mybatis中#{}和${}
1、#{}将传入的数据都当成一个字符串,会对自动传入的数据加一个引号(单引号?双引号?加了引号就对了)如:

//传入的值是sex
order by #{column}
解析后为

order by “sex” //将会出错
2、${}将传入的数据直接显示生成在sql中,如:

//传入的值是sex
order by ${column}
解析后为

order by sex //正确的
3、#{}可以在很大程度上防止sql注入,${}无法防止sql注入

4、${}一般用于传入数据库对象,例如传入表名(mybatis动态查询)

6、能用#就别用$

#使用了PreparedStatement来进行预处理,然后用set的方式对占位符进行设置;

$则是通过Statement直接进行查询,当有参数时直接进行拼接进行查询。(具体大家可以去看jdbc里面的PreparedStatement和Statement的处理方式不同)

mybatis在对SQL语句进行预编译之前,会对SQL进行动态解析,#{}和${}会有不同的变现。

在下面的语句中,name值为zhangsan,下面两种方式得到的结果没有区别

1、select * from user where name = #{name};
2、select * from user where name = ${name};
得到的解析后的结果均为

select * from user where name = ‘zhangsan’
但是#{}在动态解析的时候,会把参数部分解析成一个占位符?代替

select * from user where name = #{name};
动态解析为
select * from user where name = ?;
而${}则是简单的字符替换,在动态解析阶段,该sql会被解析成

select * from user where name = ‘zhangsan’;
以上,#{} 的参数替换是发生在 DBMS(数据库管理系统) 中,而 ${} 则发生在动态解析过程中。

针对上面的sql,如果传入的值是;drop table user;,

那么第一条用#{}的sql解析为:

select * from user where name = “;drop table user;” //查不到东西
那么第二条用${}的sql解析为:

select * from user where name = ;drop table user;//会出错
传入的应该name = lhh;drop table user;才对啊,要是name=;本来就会有错;
这时候已经sql注入了。

优先使用 #{}。因为 ${} 会导致 sql 注入的问题。

若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。

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

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

相关文章

PageUtil

Data NoArgsConstructor public class PageUtil implements Serializable {private static final long serialVersionUID 1L;/*** 总记录数*/private int totalCount;/*** 每页记录数*/private int pageSize;/*** 总页数*/private int totalPage;/*** 当前页数*/private int c…

springboot+事务,多张表的操作事务回滚

第一步,在springboot的启动类上开启事务,注解 EnableTransactionManagement 第二步:事务注解,回滚 Transactional(rollbackFor Exception.class) //Transactional和try catch捕获异常会让注解失效,所以: 第…

@EnableTransactionManagement

GetMapping("/saveData")ApiOperation("传感器数据上云-红外测温及气体")Transactional(rollbackFor Exception.class)public WebResult saveData(InfrareDataReqVo infrareDataReqVo){try {PigHeatEntity pigHeatEntitynew PigHeatEntity();pigHeatEntit…

根据经纬度显示地图轨迹

后端代码 public boolean saveCarGPSData(CarGPSReqVo carGPSReqVo) {Map<String,String> paramsnew HashMap<>(2);params.put("key",trsConfig.getCarGPS_key());params.put("coorType",carGPSReqVo.getCoorType());params.put("pageNu…

Linux vim 全选

全选&#xff08;高亮显示&#xff09;&#xff1a;按esc后&#xff0c;然后ggvG或者ggVG 全部复制&#xff1a;按esc后&#xff0c;然后ggyG 全部删除&#xff1a;按esc后&#xff0c;然后dG

两阶段聚合(局部聚合+全局聚合)

// 第一步&#xff0c;给RDD中的每个key都打上一个随机前缀。 JavaPairRDD<String, Long> randomPrefixRdd rdd.mapToPair(new PairFunction<Tuple2<Long,Long>, String, Long>() {private static final long serialVersionUID 1L;Overridepublic Tuple2&l…

java实现考勤机信息同步

/** * 更新传感器的用户信息 * * param sensorNumber * param attendanceEmployeeVos */ private synchronized void initializeAdd(String sensorNumber, List attendanceEmployeeVos) { if (attendanceEmployeeVos ! null && attendanceEmployeeVos.size() > 0) {…

Bug管理

Bug严重程度和优先级 bug两个重要属性就是优先级&#xff08;Priority&#xff09;和严重性(Severity)。通常Bug管理系统将严重性分为五个等级&#xff1a;Blocker、Critical、Major、Normal、Minor、Trivial。将优先级分为Immediate、Urgent、High、Normal、Low。 Bug的严重程…

处理魔法值

使用static final 定义常量或使用enum值 public static final String DANGERKEY_TRUE "1";if(DANGERKEY_TRUE.equals(dangerKey)){BigDecimal warningValue new BigDecimal(JedisUtils.get(WARNING_VALUE_KEY));model.addAttribute("isDanger", true);mo…

flink流处理

<?xml version"1.0" encoding"UTF-8"?> - - flink_warehouse com.kaikeba.flink 1.0-SNAPSHOT 4.0.0 flink_study - - cloudera https://repository.cloudera.com/artifactory/cloudera-repos/ - - org.apache.flink flink-streamin…

flink批处理

4.1 State 4.1.1 state概述 Apache Flink — Stateful Computations over Data Streams 回顾单词计数的例子 java /** 单词计数 */ public class WordCount { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env StreamExecution…

utils

Service(“MarketingExpensesService”) public class MarketingExpensesServiceImpl extends ServiceImpl<MarketingExpensesMapper,MarketingExpensesPO> implements MarketingExpensesService { Resource private MetadataApi metadataApi; Override public PageUtil …

使用Notepad++打造称心的IDE: Python PHP Perl

Notepad简介 Notepad 不仅有语法高亮度显示&#xff0c;也有语法折叠功能&#xff0c;并且支持宏以及扩充基本功能的外挂模组。 官方网站下载安装 https://notepad-plus-plus.org/官方仓库下载各种版本 https://notepad-plus-plus.org/repository插件下载 https://sourceforg…

DOS实用命令

查看DOS支持的命令 打开cmd窗口&#xff0c;使用help命令&#xff0c;查看各种命令&#xff0c;以及命令的作用 常用命令使用说明 命令的使用帮助可以在命令后添加 /?参数 C:\Users\Administrator\Desktop>dir /? 显示目录中的文件和子目录列表。DIR [drive:][path][…

CMD命令之BAT脚本语法详解

批量处理用DOS命令来处理文件&#xff0c;命令格式为.bat echo、、call、pause、rem(小技巧&#xff1a;用::代替rem)是批处理文件最常用的几个命令&#xff0c;我们就从他们开始学起。 注 首先, 不是一个命令, 而是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显. 下面…

C语言中预定义宏的应用

__LINE__ 在源代码中插入当前源代码行号 __FILE__ 在源代码中插入当前源代码文件名 __FUNCTION__(__fucn__) 在源代码中插入当前源代码函数名 __DATE__ 在源代码中插入当前…

printf输出格式

printf()格式转换的一般形式如下 %(flags)(width)(.prec)type 以中括号括起来的参数为选择性参数&#xff0c;而%与type则是必要的。底下先介绍type的几种形式 整数 %d 整数的参数会被转成一有符号的十进制数字 %u 整数的参数会被转成一无符号的十进制数字 %o 整数的参数会被转…

C函数实现返回多个值的方法

C语言中&#xff0c;一个函数最多只能实现一个返回值。 int func (int b) { int a5; if (a>b) return a; else return b; return 0; } 通过在函数中使用返回语句&#xff0c;返回一个值给函数&#xff0c;同时终止函数的调用&#xff0c;返回主函数。而在实际操…

汇编中的寄存器

ebp和esp是32位的SP&#xff0c;BP esp是堆栈指针 ebp是基址指针 ESP与SP的关系就象AX与AL&#xff0c;AH的关系.32位CPU所含有的寄存器有&#xff1a;4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、…