140. Spring Boot MyBatis升级篇-注解- #和$符号特别篇
Posted SpringBoot
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了140. Spring Boot MyBatis升级篇-注解- #和$符号特别篇相关的知识,希望对你有一定的参考价值。
#、$符号在MyBatis的SQL参数注入有很重要的作用,这两个符号还是需要理解清楚的,不然可能就会写出被攻击的SQL语句了。好了,这篇文章就是为了解决#、$各自的使用场景。
本节大纲:
(1)#、$说明
(2)实例说明
(3)践践更通
(4)博主有话说
接下来看下具体的内容:
#、$说明:
(1)#{}说明
使用#{}意味着使用的预编译的语句,即在使用jdbc时的preparedStatement,sql语句中如果存在参数则会使用?作占位符,我们知道这种方式可以防止sql注入,并且在使用#{}时形成的sql语句,已经带有引号,例,select * from table1 whereid=#{id} 在调用这个语句时我们可以通过后台看到打印出的sql为:select * from table1 where id='2' 加入传的值为2.也就是说在组成sql语句的时候把参数默认为字符串。
(2)${}说明
使用${}时的sql不会当做字符串处理,是什么就是什么,如上边的语句:select * from table1 where id=${id} 在调用这个语句时控制台打印的为:select * from table1 where id=2 ,假设传的参数值为2。
(3)总结
从上边的介绍可以看出这两种方式的区别,我们最好是能用#{}则用它,因为它可以防止sql注入,且是预编译的,在需要原样输出时才使用${},如,
select *from ${tableName} order by ${id} 这里需要传入表名和按照哪个列进行排序 ,加入传入table1、id 则语句为:select* from table1 order by id
如果是使用#{} 则变成了select * from 'table1' order by 'id' 我们知道这样就不对了。
实例说明:
à使用#{}的语句:
@Select("Select * from Demo where name = #{name}")
public List<Demo> selectByName1(@Param("name") String name);
说明:这个例子创建一个预编译的语句,看起来像:select * from Demo where name = ?;
观察控制台的SQL打印:
selectByName1 : ==> Preparing: Select * from Demo where name = ?
DemoMapper.selectByName1 : ==> Parameters: 王五(String)
DemoMapper.selectByName1 : <== Total: 9
à使用${}的语句:
@Select("Select * from Demo where name = '${name}'")
public List<Demo> selectByName2(@Param("name") String name);
说明:这个例子创建一个内联的语句,看起来像: select * from Demo where name = '王五';
观察控制台的打印:
DemoMapper.selectByName2 : ==> Preparing: Select * from Demo where name = '王五'
DemoMapper.selectByName2 : ==> Parameters:
DemoMapper.selectByName2 : <== Total: 9
好了,以上已经是能一语胜千言了,博主就不废话了。
践践更通:
(1)例1:查询Demo表id=X的记录。
@Select("select *from Demo where id=#{id}")
public Demo selectById(intid);
(2)例2:查询Demo表的数据,并且按照指定字段id或者name降序排列。
@Select("select *from Demo order by ${orderField}")
public List<Demo> selectAllOrderByPointField(String orderField);
错误的写法1:
@Select("select *from Demo order by ${orderField}")
public List<Demo> selectAllOrderByPointField(String orderField);
运行会报如下错误:
org.apache.ibatis.reflection.ReflectionException:There is no getter for property named 'orderField' in 'class java.lang.String'
错误的写法2:
@Select("select *from Demo order by #{orderField} desc")
public List<Demo> selectAllOrderByPointField(@Param("orderField") String orderField);
这个不会报错,但是如果orderby id的话,不会按照id进行降序排序。因为这个翻译的SQL语句是:select *from Demo order by ‘id’,而我们期望的是:select*from Demo order by id。
(3)例3:查询Demo表的数据,并且按照指定字段id或者name升序或者降序排列。
@Select("select *from Demo order by ${orderField} ${ascOrDesc} ")
public List<Demo> selectAllOrderByPointField(@Param("orderField") String orderField,@Param("ascOrDesc") String ascOrDesc);
博主有话说:
能使用#{}的不用${}。
视频+交流平台:
à Spring Boot视频
http://412887952-qq-com.iteye.com/blog/2344171
à Spring Boot交流平台
http://412887952-qq-com.iteye.com/blog/2321532
以上是关于140. Spring Boot MyBatis升级篇-注解- #和$符号特别篇的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot:Spring Boot整合Mybatis案例