首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Java EE进阶 --- SpringBoot】Mybatis操作数据库(基础二)

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

作者头像
optimistic_chen
发布2026-01-14 20:28:41
发布2026-01-14 20:28:41
1250
举报

多表查询

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

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

代码语言:javascript
复制
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 );

实现文章表的实体类:

代码语言:javascript
复制
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查询作者的相关信息: 接口:

代码语言:javascript
复制
@Mapper
public interface ArticleInfoMapper {
    ArticleInfo selectArticleInfoById(Integer id);
}
代码语言:javascript
复制
<select id="selectArticleInfoById" resultType="com.zc.mybatis.model.ArticleInfo">
        select
        ta.*,//文章表的所有字段
        tb.username,
        tb.age
        from article_info as ta
        left join user_info as tb //左连接
        on ta.uid=tb.id//连接条件:文章的用户ID=用户表的ID
        where 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接口

代码语言:javascript
复制
List<UserInfo> selectUserInfoByOrder(String sort);

xml实现SQL语句

代码语言:javascript
复制
    <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模糊查询(${})
代码语言:javascript
复制
 @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()来处理

完结撒花!🎉

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多表查询
  • 参数赋值方法:#{} 和 ${}
    • #{} 和${}比较
      • #{}性能更高
      • #{}性能更安全(防止SQL注入)
      • 排序功能(${})
      • like模糊查询(${})
  • 完结撒花!🎉
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档