MyBatis中#与$取值有什么区别
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章给大家分享的是有关MyBatis中#与$取值有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言动态SQL是MyBatis的主要特性之一,在mapper
千家信息网最后更新 2025年02月23日MyBatis中#与$取值有什么区别
这篇文章给大家分享的是有关MyBatis中#与$取值有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
一、前言
动态SQL是MyBatis的主要特性之一,在mapper中定义的参数传到XML中之后,在查询之前 mybatis 会对其进行动态解析。MyBatis 为我们提供了两种支持动态SQL的语法:#{} 以及 ${}。
二、案例
下面我们通过相关案例来演示一下$与#的用法。
UserMapper.xml文件中查询语句最初写法
测试控制台打印SQL如下:
2017-08-06 18:23:24,390 [main] [com.queen.mybatis.mapper.UserMapper.findUserByMapParam]-[DEBUG] ==> Preparing: select id, loginId, userName, role, note from t_user where id = ? and userName=?
现在我们修改一下语句,将where id = #{id} 修改成 ${id},如下:
再次测试,控制台打印SQL如下:
2017-08-06 18:27:58,887 [main] [com.queen.mybatis.mapper.UserMapper.findUserByMapParam]-[DEBUG] ==> Preparing: select id, loginId, userName, role, note from t_user where id = 1 and userName=?
可以观察到两条SQL语句的不同,下面一条以${}语句获取参数值时,直接将数据取出来拼接到了SQL语句中;而我们用#{}取得值是以占位符的形式出现。
#{}:是以预编译的方式,将参数设置到SQL语句中,跟我们原来学JDBC时一样,能够很大程度防止sql注入
${}:取出来的值直接拼接到SQL语句中,会有安全问题,无法防止Sql注入。
大多数情况下我们取参数的值都是使用的#{},但是有些情况像表名,排序时使用order by 动态参数时需要注意,用$而不是#。
修改UserMapper.xml:
测试控制台打印如下:
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''desc'' at line 1### The error may exist in UserMapper.xml### The error may involve com.queen.mybatis.mapper.UserMapper.findUserByMapParam-Inline### The error occurred while setting parameters### SQL: select id, loginId, userName, role, note from t_user where id = ? and userName=? order by userName ?### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''desc'' at line 1 at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:26)
以#{}号方式取值,控制台报错。
那我们修改一下UserMapper.xml,修改成${}取值方式
再次测试,控制台打印SQL正常:
2017-08-06 19:17:02,331 [main] [com.queen.mybatis.mapper.UserMapper.findUserByMapParam]-[DEBUG] ==> Preparing: select id, loginId, userName, role, note from t_user where id = ? and userName=? order by userName desc
感谢各位的阅读!关于"MyBatis中#与$取值有什么区别"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
语句
参数
控制台
控制
动态
测试
方式
内容
再次
情况
更多
案例
篇文章
查询
不同
不错
实用
很大
安全
写法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
干巴精互联网科技有限公司
视频护苗网络安全课
杭州新域互联网科技有限公司
第五届中国网络安全论坛
数据库事务的四个特征怎么实现
hblink dmr服务器
网络安全防护相关汇总
电脑网络技术分析人物形象
手游版罗布乐思怎么建服务器
农业银行网络安全的开题报告
27号文件 网络安全
网美至尚网络技术有限公司
买了服务器该如何建站
数据库中三表外连接
数据库设计教程
最快访问数据库
克尔瑞数据库登陆
北京天下网络技术有限公司
湖州小黄鸭网络技术有限公司
和网络安全法相关的小故事
连接远程数据库 慢
服务器管理器怎么没有
人人车二手车网络技术
ifix数据库io地址
中石油北京软件开发公司
胡润网络安全企业百强
职业规划范文软件开发
绝地求生2手游进哪个服务器
乡镇如何 强调网络安全
制造业网络安全应用场景