【面试题-013】MyBatis 中,`#` 和 `$` 符号区别

在 MyBatis 中,#$ 符号用于参数替换和表达式。它们在 SQL 语句中用于防止 SQL 注入,并允许动态地插入参数值。

  1. # 符号(预编译参数):
    • #{parameter} 用于预编译参数。
    • 在 SQL 语句中,#{parameter} 会被 MyBatis 解析为一个参数占位符,MyBatis 会自动将参数值进行转义,以防止 SQL 注入。
    • 预编译参数适合用于简单的字符串替换,如查询和更新操作。
  2. $ 符号(动态参数):
    • ${parameter} 用于动态参数。
    • 在 SQL 语句中,${parameter} 会被 MyBatis 解析为一个动态参数。
    • 动态参数允许你直接在 SQL 语句中插入变量值,而不需要进行转义。
    • 动态参数适合用于复杂的表达式和计算,如拼接字符串、计算等。
      总结:
  • #{parameter} 是 MyBatis 推荐的参数替换方式,用于防止 SQL 注入,并提供了更好的安全性。
  • ${parameter} 虽然允许直接插入变量值,但需要注意 SQL 注入的风险,并确保变量值的安全性。
    在实际应用中,应该优先使用 #{parameter} 进行参数替换,以提高代码的安全性和可维护性。

MyBatis 中的缓存机制主要包括一级缓存和二级缓存

MyBatis 中的缓存机制主要包括一级缓存和二级缓存。它们的作用和实现方式有所不同,下面详细介绍:

一级缓存(SqlSession 缓存)

  1. 作用
    • 一级缓存是 SqlSession 级别的缓存,它存储了最近一次查询的结果。
    • 每个 SqlSession 都有自己的缓存,缓存中存储了查询结果
  2. 存储内容
    • 存储的是查询的结果集,包括从数据库中检索到的数据。
  3. 存储方式
    • 缓存存储在 SqlSession 中,因此同一个 SqlSession 内的所有查询都会共享这个缓存
  4. 缓存策略
    • 默认情况下,一级缓存是开启的,除非在映射器 XML 文件中或 MyBatis 配置文件中明确关闭。
  5. 失效时机
    • 当 SqlSession 关闭时,一级缓存中的数据会被清空。
    • 如果查询的结果集被修改,或者查询的 SQL 语句发生了变化,一级缓存中的数据也会被清空。

二级缓存(Mapper 缓存)

  1. 作用
    • 二级缓存是跨多个 SqlSession 的缓存,它可以存储多个 SqlSession 的查询结果
    • 二级缓存可以提高多个 SqlSession 之间查询结果的共享和复用
  2. 存储内容
    • 存储的是查询的结果集,与一级缓存类似。
  3. 存储方式
    • 缓存存储在 Mapper 接口的实现类中,而不是 SqlSession 中。
    • 同一个 Mapper 接口的实现类之间共享二级缓存。
  4. 缓存策略
    • 默认情况下,二级缓存是关闭的,除非在映射器 XML 文件中或 MyBatis 配置文件中明确开启。
    • 开启二级缓存后,可以设置具体的缓存实现类,如 org.apache.ibatis.cache.impl.PerpetualCache
  5. 失效时机
    • 当 Mapper 接口的实现类(代理类)被垃圾回收时,二级缓存中的数据会被清空。
    • 如果查询的结果集被修改,或者查询的 SQL 语句发生了变化,二级缓存中的数据也会被清空。

总结

  • 一级缓存适用于单次会话内的查询结果缓存,可以提高会话内的查询效率。
  • 二级缓存适用于跨多个会话的查询结果缓存,可以提高不同会话之间的查询效率。
    在使用 MyBatis 时,可以根据实际需求来选择使用一级缓存、二级缓存,或者两者结合使用。同时,需要注意缓存策略的设置,以避免缓存带来的问题,如脏数据、数据不一致等。
相关推荐
编码忘我8 分钟前
java多线程安全集合
java
悟空码字13 分钟前
滑块拼图验证:SpringBoot完整实现+轨迹验证+Redis分布式方案
java·spring boot·后端
编码忘我14 分钟前
java类加载器及tomcat为什么不用双亲委派
java
MegaDataFlowers1 小时前
快速上手Spring
java·后端·spring
小江的记录本1 小时前
【MyBatis-Plus】Spring Boot + MyBatis-Plus 进行各种数据库操作(附完整 CRUD 项目代码示例)
java·前端·数据库·spring boot·后端·sql·mybatis
左左右右左右摇晃1 小时前
Java 笔记--OOM产生原因以及解决方法
java·笔记
大傻^1 小时前
Spring AI Alibaba Function Calling:外部工具集成与业务函数注册
java·人工智能·后端·spring·springai·springaialibaba
SuniaWang1 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题四:《Ollama 模型管理与调优:让 AI 模型在低配服务器上流畅运行》
人工智能·学习·spring
逆境不可逃1 小时前
LeetCode 热题 100 之 33. 搜索旋转排序数组 153. 寻找旋转排序数组中的最小值 4. 寻找两个正序数组的中位数
java·开发语言·数据结构·算法·leetcode·职场和发展
码界奇点1 小时前
基于Spring Boot的医院药品管理系统设计与实现
java·spring boot·后端·车载系统·毕业设计·源代码管理