Spring、Spring MVC 和 Spring Boot ,mybatis 相关面试题

关于 MyBatis 中 #{} 与 ${} 的本质区别

  • #{} 底层使用的是 PreparedStatement 预编译机制:

    • MyBatis 会将 SQL 中的 #{xxx} 替换为 ?,生成一个参数化的 SQL 模板;
    • 实际参数值通过 PreparedStatement.setXXX() 方法传入;
    • 所有参数都被视为纯数据(字面量),不会被数据库解析为 SQL 关键字或表达式;
    • 因此,天然具备防止 SQL 注入的能力,是安全的首选方式。
  • ${} 是纯粹的字符串替换:

    • MyBatis 直接将 ${xxx} 替换为变量的字符串值,不做任何转义或类型处理;
    • 最终拼接成一条完整的 SQL 字符串再发送给数据库;
    • 如果用户输入恶意内容(如 ' OR '1'='1),就会导致 SQL 注入漏洞;
    • 仅在极少数场景下可谨慎使用 ,例如:
      • 动态表名(如按时间分表:user_202511);
      • 动态列名或排序字段(如 ORDER BY ${column});
    • 必须配合严格的白名单校验或输入过滤(如验证表名是否合法、是否来自可信来源),否则绝不允许使用。

📌 最佳实践 :
99% 的场景使用 #{};只有在明确知道风险并做好防护的前提下,才考虑使用 ${}。


"雪花 ID 逆向找表"场景

动态分表 需求,确实可能需要用到 ${},例如:

复制代码
<select id="getUser" resultType="User">
    SELECT * FROM user_${tableSuffix} WHERE id = #{id}
</select>

但关键在于:

  • tableSuffix 不能直接来自用户输入;
  • 应由服务端根据雪花 ID 解析出时间,再映射到预定义的合法后缀 (如 202511);
  • 最好再加一层校验:if (!validSuffixes.contains(tableSuffix)) throw ...

这样才能在使用 ${} 的同时保证安全。

Spring、Spring MVC 和 Spring Boot 的区别与联系

Spring、Spring MVC 和 Spring Boot 都属于 Spring 全家桶,它们是层层递进、职责分明的关系。

  1. Spring Framework 是整个生态的基础

    它的核心是 IoC(控制反转)和 AOP(面向切面编程):

    • IoC 将对象(Bean)的创建和依赖关系管理交给 Spring 容器,开发者通过 依赖注入(DI) (如 @Autowired)获取 Bean,避免了硬编码的 new 操作,降低了组件耦合度;
    • AOP 通过动态代理实现日志、事务、权限等横切逻辑的统一处理,提升代码复用性。
  2. Spring MVC 是基于 Spring 的 Web 框架

    它采用 MVC 分层架构 (Model-View-Controller),用于构建 Web 应用或 RESTful 接口。

    核心流程是:

    • 请求由前端控制器 DispatcherServlet 拦截;
    • 通过 HandlerMapping 找到对应的 Controller 方法(Handler);
    • 经过参数解析、数据绑定(如 JSON 反序列化)后执行业务逻辑;
    • 若方法标注 @ResponseBody (或使用 @RestController),则直接将返回值序列化为 JSON 响应给前端;
      (传统模式会返回 ModelAndView,由视图解析器渲染页面,但现在主流是前后端分离,基本都用 @ResponseBody)
  3. Spring Boot 是对 Spring 的进一步封装和简化

    它的核心理念是 "约定大于配置" + "开箱即用":

    • 通过 Starter 依赖 自动引入整合好的技术栈(如 spring-boot-starter-web = Spring MVC + 内嵌 Tomcat + Jackson);
    • 启动时自动扫描 classpath 下所有 JAR 包中的 META-INF/spring.factories (或新版的 AutoConfiguration.imports),加载自动配置类;
    • 自动配置类通过 条件注解 (如 @ConditionalOnClass(DataSource.class))判断是否生效------例如,只要 classpath 中有数据库驱动,就会自动配置 DataSource、JdbcTemplate 等 Bean;
    • 开发者无需手动配置 XML 或繁琐的 Java Config,直接注入即可使用,极大提升了开发效率。
相关推荐
CoderYanger4 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
CQU_JIAKE7 小时前
11.7[高体】
java·后端·spring
apcipot_rain8 小时前
C++转Java日记(04)
java·开发语言·c++
特立独行的猫A8 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
云和数据.ChenGuang9 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
憧憬成为java架构高手的小白10 小时前
LangGraph4j 实战(下)
java
天诰10 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
蜗牛一步步往上爬12 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
这个昵称不容易14 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长14 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统