它们之间区别
在Mybatis中当我们使用${} 和#{} 编写Sql时需要特别注意,当我们使用#{}去编写sql时,#{}里面的变量在编译时参数显示的是?编译后会自动加上' ' ,可以防止sql注入风险,而${}对应的变量是不会添加’'的,有产生sql注入的风险,下面会讲它们是怎么进行编译的。
它们的使用方式,及编译过程演示
以下使用代码的形式来演示他们的过程变化
使用#{}来编写sql的条件查询
假设条件查询:在前端是一个输入框,查询对应的姓名,输入框输入的内容为:杨永卓
编译前:Select * from user where name =
编译中:Select * from user where name = ?
编译后:Select * from user where name = '杨永卓';
使用${}来编写sql的条件查询
编译前:Select * from user where name = ${name}
编译中:Select * from user where name = 杨永卓
编译后:Select * from user where name = 杨永卓;
编译前:Select * from user where name = ${name}
编译中:Select * from user where name = 杨永卓 and age= 18
编译后:Select * from user where name = 杨永卓 and age= 18;
使用#{}来编写sql的table表名
编译前:Select * from
编译中:Select * from ?
编译后:Select * from 'user'
使用${}来编写sql的table表名
编译前:Select * from ${user}
编译中:Select * from user
编译后:Select * from user
总结,使用场景
从上边的实例可以看出他们的区别,如果使用${}就会有sql注入的风险 ,而使用#{}参数会被识别为字符串,所以不适用与表名赋值 ,为了系统的安全,一般情况下使用#{}来编写sql代码 ,使用${}来做某些业务表名的赋值,比如使用工厂类去使用${}查对应的表 ,因为${}是在代码内去使用,也没有那种奇葩的业务,需要用户去输入表名查表,没有接触前端,也不存在外部赋值的情况,所以不会出现sql注入风险。
总结:仰天大笑出门去,我辈岂是蓬蒿人
|