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 mybatis-starter原理

Spring Boot:Spring Boot整合Mybatis案例

Spring Boot 实用MyBatis做数据库操作

Spring boot 入门三:spring boot 整合mybatis 实现CRUD操作

Spring Boot集成Mybatis及通用Mapper

spring boot 与 Mybatis整合(*)