当前位置: 首页 > news >正文

【Java EE进阶 --- SpringBoot】Mybatis操作数据库(基础二)


🚀 欢迎来到我的CSDN博客:Optimistic _ chen
一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐:

专栏内容特色适合人群
🔥C语言从入门到精通系统讲解基础语法、指针、内存管理、项目实战零基础新手、考研党、复习
🔥Java基础语法系统解释了基础语法、类与对象、继承Java初学者
🔥Java核心技术面向对象、集合框架、多线程、网络编程、新特性解析有一定语法基础的开发者
🔥Java EE 进阶实战Servlet、JSP、SpringBoot、MyBatis、项目案例拆解想快速入门Java Web开发的同学
🔥Java数据结构与算法图解数据结构、LeetCode刷题解析、大厂面试算法题面试备战、算法爱好者、计算机专业学生

🚀我的承诺:
✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客  #编程学习  #Java  #C语言  #算法  #程序员

文章目录

  • 多表查询
  • 参数赋值方法:#{} 和 ${}
    • #{} 和${}比较
      • #{}性能更高
      • #{}性能更安全(防止SQL注入)
      • 排序功能(${})
      • like模糊查询(${})
  • 完结撒花!🎉

多表查询

我们之前了解到的查询都是单表查询,我们很多时候都是多张表一起查询的。所以我们需要再建一张数据表,进行多表关联查询。

建立文章表,编写数据库代码:

DROP TABLE IF EXISTS articleinfo;
CREATE TABLE articleinfo (id INT PRIMARY KEY auto_increment,title VARCHAR ( 100 ) NOT NULL,content TEXT NOT NULL,uid INT NOT NULL,delete_flag TINYINT ( 4 ) DEFAULT 0 COMMENT '0正常, 1删除',create_time DATETIME DEFAULT now(),update_time DATETIME DEFAULT now() 
) DEFAULT charset 'utf8mb4';INSERT INTO articleinfo ( title, content, uid ) VALUES ( 'Java', 'Java正⽂', 1 );

实现文章表的实体类:

import lombok.Data;import java.util.Date;
@Data
public class ArticleInfo {private Integer id;private String title;private String content;private Integer uid;private Integer deleteFlag;private Date createTime;private Date updateTime;//用户表字段private String username;private Integer age;
}

现在我们根据uid查询作者的相关信息:
接口:

@Mapper
public interface ArticleInfoMapper {ArticleInfo selectArticleInfoById(Integer id);
}
<select id="selectArticleInfoById" resultType="com.zc.mybatis.model.ArticleInfo">selectta.*,//文章表的所有字段tb.username,tb.agefrom article_info as taleft join user_info as tb //左连接on ta.uid=tb.id//连接条件:文章的用户ID=用户表的IDwhere ta.id=#{id}</select>

多表查询结果:在这里插入图片描述

参数赋值方法:#{} 和 ${}

Mybatis的参数赋值方法,一般情况下,我们使用 #{} 进行赋值,但是 ${} 的方法同样可以实现一些功能
在这里插入图片描述
注意:我们上面传的参数是Integer的,如果是String类型的参数就出现了变化。
在这里插入图片描述
可以看到,使用 ${} 参数依旧是直接拼接到SQL中,但是字符串作为参数时,需要添加 ‘ ’ ,但是 ${} 不会自动拼接 ‘ ’.需要我们手动拼接。
在这里插入图片描述
总结:
#{} 使⽤的是预编译SQL,通过? 占位的⽅式, 提前对SQL进⾏编译,然后把参数填充到SQL语句中. #{} 会根据参数类型,⾃动拼接引号’‘.
${} 会直接进行字符串替换,一起对SQL进行编译,如果参数是字符串,需要手动加上引号’';

#{} 和${}比较

总的来说:#{} 和${} 的区别就是预编译SQL即时SQL的区别.

#{}性能更高

预编译SQL : 一条SQL语句发给服务器后,第一次编译:首先解析语法和语义,检验SQL语句是否正确;其次优化SQL语句;最后进行SQL编译,编译一次后缓存起来。之后再执行到此语句不会再次编译(修改参数即可),省去了解析、优化等过程,以此提高效率。
即时SQL : 一条SQL语句发给服务器后,首先解析语法和语义,检验SQL语句是否正确;其次优化SQL语句,制定执行计划;执行并返回结果。(每条语句都要经过这些流程)

#{}性能更安全(防止SQL注入)

SQL注⼊:是通过操作输⼊的数据来修改事先定义好的SQL语句,以达到执⾏代码对服务器进⾏攻击的⽅法。

菜鸟教程
SQL 注入的工作原理
输入验证不足:当Web应用程序没有正确验证用户输入时,攻击者可以在输入字段中插入SQL代码。

拼接SQL语句:应用程序后端通常将用户输入与SQL查询拼接在一起,形成完整的数据库查询语句。

执行恶意SQL:如果应用程序没有对输入进行适当的清理或转义,恶意SQL代码将被数据库服务器执行。

数据泄露或破坏:攻击者可以利用SQL注入来查询、修改或删除数据库中的数据,或者执行数据库管理系统的系统命令。
正常情况:
在这里插入图片描述

常见的SQL注入:直接将恶意代码嵌入到用户输入中
在这里插入图片描述
更可怕的是,如果在登录阶段,密码输入’ or 1='1总为true,就会登录成功(当然还要看登录代码怎么写)。

排序功能(${})

mapper接口

List<UserInfo> selectUserInfoByOrder(String sort);

xml实现SQL语句

    <select id="selectUserInfoByOrder" resultType="com.zc.mybatis.model.UserInfo">select id, username, age, gender, phone, delete_flag, create_time, update_time from user_info order by id ${sort}</select>

在这里插入图片描述
但是,如果把 ${} 改为 #{} :
在这里插入图片描述
因为当使用#{}查询时,desc前后自动加了引号,导致sql错误(#{} 会根据参数类型判断是否拼接引号)

like模糊查询(${})

 @Select("select id, username, age, gender, phone, delete_flag, create_time, 
update_time " +"from user_info where username like concat('%',#{Java},'%')")List<UserInfo> queryAllUserByLike(String key);

使用 ${} 可以正确查出来,但是存在SQL注入的问题,所有不能直接使用 ${} ,使⽤mysql的内置函数concat()来处理

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen
📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中……


悄悄说:点击主页有更多精彩内容哦~ 😊

http://www.dtcms.com/a/473804.html

相关文章:

  • 【ComfyUI】Flux 扩展原始图像边界
  • 068B-基于R语言平台Biomod2集成模型的物种分布模型构建和数据可视化教程【2027】
  • Custom SRP 12 - HDR
  • 偏振相机是否属于不同光谱相机的范围内
  • 烟台房地产网站建设视频直播服务
  • SQL Server中alter对于表的常用操作
  • 学校网站建设报告九江 网站建设公司
  • Blender图片转3D模型智能插件 True Depth V2附使用教程
  • 【数据分享】中国土地利用数据(1980-2015)
  • 工信部网站备案通知怎么样免费给网站做优化
  • Differentially Private Synthetic Text Generation for RAG——论文阅读
  • SQL入门:流程控制函数全解析
  • php网站虚拟机价格电子商务网站建设的意义
  • 【AES加密专题】6.功能函数的编写(3)
  • Windows安装Apache Kafka保姆级教程(图文详解+可视化管理工具)
  • java集合类的底层类是哪个
  • Arbess从入门到实战(13) - 使用Arbess+GitLab+Gradle实现Java项目自动化部署
  • 类与对象--2
  • socket 传输结构体数据,另一端进行恢复
  • 2025年数据治理平台解决方案:让数据真正可用、可信、可运营
  • 网站建设公司 长春广州购物网站建设
  • Linux ARM QT FrameBuffer
  • 静态网站特点阿里云wordpress在哪里设置
  • MATLAB完整问卷调查数据分析(附完整代码)
  • Claude Code学习笔记(四)-助你快速搭建首个Python项目
  • 济南 制作网站 公司哪家好文登seo排名
  • Chrome 插件开发入门
  • 天津专业网站制作wordpress 多域名登陆
  • Docker简介及部署
  • 字符数组和字符串