网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

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

这篇文章给大家分享的是有关MyBatis中#与$取值有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

创新互联公司是一家从事企业网站建设、成都网站制作、做网站、外贸营销网站建设、行业门户网站建设、网页设计制作的专业网络公司,拥有经验丰富的网站建设工程师和网页设计人员,具备各种规模与类型网站建设的实力,在网站建设领域树立了自己独特的设计风格。自公司成立以来曾独立设计制作的站点上1000家。

一、前言
动态SQL是MyBatis的主要特性之一,在mapper中定义的参数传到XML中之后,在查询之前 mybatis 会对其进行动态解析。MyBatis 为我们提供了两种支持动态SQL的语法:#{} 以及 ${}。

二、案例
下面我们通过相关案例来演示一下$与#的用法。

UserMapper.xml文件中查询语句最初写法


    select id, loginId, userName, role, note from t_user where id = #{id} and userName=#{userName}

测试控制台打印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},如下:


    select id, loginId, userName, role, note from t_user where id = ${id} and userName=#{userName}

再次测试,控制台打印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:


    select id, loginId, userName, role, note from t_user where id = #{id} and userName=#{userName} order by userName #{orderDesc}

测试控制台打印如下:

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,修改成${}取值方式


    select id, loginId, userName, role, note from t_user where id = #{id} and userName=#{userName} order by userName ${orderDesc}

再次测试,控制台打印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中#与$取值有什么区别”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!


网页题目:MyBatis中#与$取值有什么区别
文章路径:http://bjjierui.cn/article/jiehhp.html

其他资讯