花瓣小跑 发表于 2024-7-29 19:21:40

MyBatis查询数据库(3)

前言

   ❤️❤️❤️SSM专栏更新中,各位大佬以为写得不错,支持一下,感谢了!❤️❤️❤️
Spring + Spring MVC + MyBatis_冷兮雪的博客-CSDN博客
前面我们讲解了MyBatis增删改查基本操作,下面我们来深入了解MyBatis其中不同和需要留意的地方。
一、查询操作

1、单表查询

下面我们来实现⼀下根据用户 id 查询用户信息的功能
UserController 实现代码如下:
//url 路径名直接全部小写即可
    @RequestMapping("/getuserbyid")
    public Userinfo geUserById(Integer id){
      if (id==null)
            return null;
      return userService.getUserById(id);
    }UserMapper 实现代码如下:
/**
   * 根据用户id查询用户信息
   * @param id
   * @return
   */
    Userinfo getUserById(@Param("id") Integer id); UserMapper.xml 实现代码如下:
<select id="getUserById" resultType="com.example.ssmdemo1.entity.Userinfo">
      select * from userinfo where id=${id}
</select> Ⅰ、参数占位符 #{} 和 ${}



[*] #{}:预编译处理。

[*] ${}:字符直接替换。
预编译处理是指:MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使用 PreparedStatement 的 set 方法来赋值。直接替换:是MyBatis 在预处理 ${} 时,就会把 ${} 替换成变量的值。
上面代码我们使用的是${},去传递Integer(整数)类型的参数时,是没有题目的,但如果传递的是String类型的话,程序就会报错。
https://i-blog.csdnimg.cn/blog_migrate/a20365e96187adc510234ed08d2b5dd8.png
下面我们通过 根据用户名查询用户(getUserByName)来看看
https://i-blog.csdnimg.cn/blog_migrate/7a3743ba7978a0b9a8592cbbb0582840.png
这就直接报错了,说是没有admin这个用户,这是由于${}是直接替换值(不会管你是什么类型,都直接替换),而SQL语句中字符串需要使用单引号,这就会查询不到,报错。
https://i-blog.csdnimg.cn/blog_migrate/8d7f1dad523995a06f83fc3c41f22307.png
精确SQL:
https://i-blog.csdnimg.cn/blog_migrate/7d446c516e413f9f2150a3a094c8dfc8.png
两者区别总结:

1、#{}:安全参数占位符


[*]#{}是MyBatis的预编译语句中的参数占位符,用于传递参数值。它会自动进行参数值的类型转换和防止SQL注入攻击。
[*]在使用#{}时,MyBatis会将参数值通过JDBC的PreparedStatement接口进行预编译,参数值会被当做字符串类型处理,然后由JDBC驱动来负责将其转换成对应的数据库类型,如许可以避免SQL注入题目。
[*]例子:SELECT * FROM users WHERE id = #{userId}
2、${}:字符串替换占位符


[*]${}是字符串替换占位符,用于直接将参数的值替换到SQL语句中。在使用${}时,参数值会被直接替换进SQL语句中,不会进行预编译或类型转换。
[*]由于${}直接替换参数值到SQL语句中,可能存在SQL

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: MyBatis查询数据库(3)