MyBatis中#与$取值有什么区别
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章给大家分享的是有关MyBatis中#与$取值有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言动态SQL是MyBatis的主要特性之一,在mapper
千家信息网最后更新 2025年01月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安全错误
数据库的锁怎样保障安全
华为h225服务器配置
图片过多服务器如何存放
南通游戏软件开发系统
重庆巫溪生鲜软件开发
上海软件开发怎么报价
开放大学计算机网络技术毕业总结
中科创达车联网软件开发
服务器云盘权限管理软件
目前我们有哪些网络安全威胁
虹口区创新软件开发定制价格
小学生网络安全教育事项
软件开发副经理架构设计
计算机网络技术企业
世界最大的公开数据库
前端 连接数据库
软件开发哪家公司强
养殖场智能综合管理系统软件开发
steam下载游戏无法连接服务器
沉迷网络安全告家长书
软件开发接私活
我看数据库可靠
安徽沙巴克网络技术有限公司官网
网络安全属于服务业吗
河北通用软件开发厂家
网络安全教育班级感言
服务器检修管理
移动网络技术方向管培生
qsqlite数据库介绍
域服务器管理客户端
新安县网络安全检查