#{ } 与 ${ } 的区别(重点)
#{ } 与 ${ } 在MyBatis中都是用于替换SQL参数的, 主要以下几点不同:
- 方式不同: ${ } 是直接替换为传递的参数, #{ } 则是先预处理,然后再设置参数
- 安全性不同: ${ } 存在SQL注入的风险, #{ }则不存在安全问题
- 使用场景不同: 一般情况下,能用 #{ } 就尽量用他, 如果传递的是 SQL 命令或 SQL 关键字,则需要使用 ${ },但在使用前一定要做好安全验证(保证传递的参数是可被穷举的);
什么是SQL注入
SQL注入就是指服务器对用户输入的数据过滤不严谨, 使得攻击者在输入数据之后添加了SQL语句, 从而获得了非法的权限.
例如, 我们登录操作需要用户输入 账号 和 密码
此时黑客就可通过SQL注入的方式,不需要知道账号密码 也能获取数据
查询结果为null的原因
大概率可能是, model包中类的属性名与数据库中表的字段名不一致, 那么查询的结果就为null
解决方案:
- (最简单的方式) 将类中的属性名与数据库表的字段名保持一致
- 通过SQL语句中的 as 对字段名进行重命名,将字段名重命名为类中的属性名
- 定义一个resultMap, 将字段名与属性名 进行手动映射
通过 like 进行模糊查询
接口:
xml实现接口:
测试:
成功查询到两条数据
实现多表查询
直接通过注释@Select 来实现接口
测试: