【JavaEE】MyBatis 单表查询易错问题(添加后返回自增id,${}与#{},SQL注入,模糊查询)

14 篇文章 0 订阅
4 篇文章 0 订阅

1. 添加用户,返回受影响的行数

UserMapper 接口声明:
在这里插入图片描述
mapper.xml实现如下:
在这里插入图片描述
单元测试如下:
在这里插入图片描述
结果如下:
在这里插入图片描述

2. 添加用户,返回自增的id

mapper接口声明:
在这里插入图片描述
mapper.xml实现:
在这里插入图片描述
单元测试代码:
在这里插入图片描述
结果:
在这里插入图片描述
相关注解:
在这里插入图片描述

  • useGeneratedKeys:令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字段),默认值:false。需要手动设置 TRUE
  • keyColumn:设置⽣成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第⼀列的时候,是必须设置的。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。(映射数据表中的字段)
  • keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或 insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。(映射对应数据表的类的属性)

3. 参数占位符 #{} 和 ${}

  • #{}:预编译处理。
  • ${}:字符直接替换。
  • 预编译处理是指:MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使⽤ PreparedStatement 的set ⽅法来赋值。(列如在进行字符串复制时会自动加上 ‘’)
  • 直接替换:是MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。

3.1 ${} 优点

在进行需要对查询的结果排序(order)时候就需要使用${},如果使用#{}在进行SQL拼接时候会给排序规则(asc,desc)加上 ’ ’ 导致SQL语句报错

mapper接口:
在这里插入图片描述

mapper.xml实现:
在这里插入图片描述

单元测试:
在这里插入图片描述
在这里插入图片描述
直接替换才能查询成功,使用#{}反而会报错:
在这里插入图片描述

3.2 #{} VS ${} 区别:

  1. 定义不同 : #{} 是预处理,${} 是直接替换
  2. 使用不同:#{} 适用于所有类型的参数匹配,${} 只适用于数值类型
  3. 安全性不同: #{}性能高,并且没有安全问题;但 ${} 存在SQL注入的安全问题

4. SQL 注入问题

假设实现一个登录功能,此时数据库中只有admin一条用户信息(账号密码均为admin):

在这里插入图片描述
mapper接口:
在这里插入图片描述
xml实现:(使用直接替换的${}):
在这里插入图片描述
在正常输入正确的账号密码时候能够实现登录(查询到完整的用户信息):
单元测试代码:
在这里插入图片描述
在这里插入图片描述
sql 注⼊代码:“’ or 1='1”
在这里插入图片描述
发现即使在用户没有正确输入密码的情况下也能成功查询到完整的用户信息:
在这里插入图片描述
这就是SQL注入问题;

结论:用于查询的字段,尽量使用 #{} 预查询的方式。

5. like 查询

在进行like模糊查询时 使⽤ #{} 报错:

mapper接口:
在这里插入图片描述
xml实现:
在这里插入图片描述
单元测试:
在这里插入图片描述
报错:
在这里插入图片描述
原因如下:相当于: select * from userinfo where username like ‘%‘username’%’; 又加了一次 ’ ’ 所以肯定是查询不出来的:
在这里插入图片描述
这个是不能直接使⽤ ${},可以考虑使⽤ mysql 的内置函数 concat() 来处理,实现代码如下:
在这里插入图片描述
在这里插入图片描述
单元测试:
在这里插入图片描述
模糊查询成功~

  • 本篇完 ,over ~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值