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


    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 ~
  • 相关阅读:
    Flutter开发 - 花式收键盘&TextField小贴士
    高精读整数加法【循环总结】
    加解 & 解密
    数据说|数字经济,山东16市谁最“炫”?排行榜来了
    win10任务栏出现无法删除的空白块
    解决hadoop使用put上传报错问题
    静态时序分析(STA)附秋招面试提问
    我的私人笔记(Linux中安装mysql)
    学习笔记
    手机网页,输入时 软键盘盖住输入框完整解决方案,兼容安卓、鸿蒙、苹果IOS
  • 原文地址:https://blog.csdn.net/xqs196301/article/details/126432160