千家信息网

MyBatis中#与$取值有什么区别

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章给大家分享的是有关MyBatis中#与$取值有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言动态SQL是MyBatis的主要特性之一,在mapper
千家信息网最后更新 2026年10月31日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安全错误 数据库的锁怎样保障安全 互联网与科技发展 科技互联网公司logo 广州凡科互联网科技 互联网巨头投资的硬核科技 哈尔滨秒房互联网科技有限公司 太原新华互联网科技学校怎么样 南山科技园互联网公司有哪些 互联网科技有哪些公司 崇明区互联网教育科技诚信经营 如何创新互联网科技 晋城互联网科技 工业互联网展湾科技股份有限公司 电子商务与互联网科技的关系 本届互联网大会上的黑科技 工业互联网科技创业 云鲸互联网络科技有限公司 国产互联网科技公司 互联网科技机房 北京天晋互联网科技有限公司 东风日产互联网科技公司叫什么 手冲咖啡和咖啡机区别 涨乐互联网科技 互联网科技logo 卫星互联网科技股票 深圳国际航运科技和互联网 北京华百购互联网科技有限公司 本届互联网博览会上的黑科技 明优互联网科技有限公司 互联网高科技行业有哪些企业 北京瑞云互联网科技有限公司
0