MyBatis中是如何对占位符进行赋值的?

MyBatis 中对占位符进行赋值的过程主要由 PreparedStatement 和参数处理器 (ParameterHandler) 协同完成。

1. SQL 语句中的占位符:

MyBatis 支持两种占位符:

  • # (预编译参数): 推荐使用。

    • MyBatis 会使用 PreparedStatement 的占位符 ? 来处理。
    • PreparedStatement 会对参数进行预编译和类型检查,可以防止 SQL 注入攻击。
    • 例如:SELECT * FROM user WHERE id = #{id}
  • $ (字符串替换): 不推荐,除非有特殊需求。

    • MyBatis 会直接将参数值替换到 SQL 语句中。
    • 存在 SQL 注入的风险。
    • 例如:SELECT * FROM user WHERE id = ${id}

2. 赋值流程 (以 # 占位符为例):

  1. 解析 SQL 语句:

    • MyBatis 解析 Mapper XML 文件或注解中的 SQL 语句。
    • 将 SQL 语句中的 # 占位符替换为 ?
    • 例如,将 SELECT * FROM user WHERE id = #{id} AND name = #{name} 转换为 SELECT * FROM user WHERE id = ? AND name = ?
  2. 创建 PreparedStatement:

    • MyBatis 使用 JDBC 的 Connection 对象创建 PreparedStatement 对象。
  3. 获取参数值:

    • MyBatis 根据参数的名称或位置,从以下来源获取参数值:
      • 单个参数: 如果只有一个参数,可以直接传入。
      • 多个参数:
        • 使用 @Param 注解: 可以通过 @Param 注解为参数指定名称。
        • 使用 Map: 可以将参数放入 Map 中,键为参数名称,值为参数值。
        • 使用 JavaBean: 可以将参数封装到 JavaBean 中,属性名与参数名称对应。
        • 按参数顺序 如果没有@Param注解, 也没有使用Map, 则按照参数定义的顺序.
      • 如果是基本类型包装类, 会自动进行拆箱.
    • MyBatis 会根据配置的类型处理器 (TypeHandler),将 Java 对象转换为 JDBC 类型。
  4. 设置参数值:

    • MyBatis 使用 PreparedStatementsetXXX 方法(如 setIntsetStringsetDouble 等),根据参数的类型和位置,将参数值设置到 PreparedStatement 的占位符中。
    • 会根据配置的 TypeHandler 将 Java 类型转换为 JDBC 类型。
  5. 执行 SQL 语句:

    • MyBatis 执行 PreparedStatementexecuteQueryexecuteUpdateexecute 方法,执行 SQL 语句。

示例:

Mapper XML:

<select id="getUserById" resultType="User">SELECT * FROM user WHERE id = #{id} AND name = #{name}
</select>

Mapper 接口:

import org.apache.ibatis.annotations.Param;public interface UserMapper {User getUserById(@Param("id") int id, @Param("name") String name);
}

Java 代码:

// ... 获取 SqlSession
User user = sqlSession.getMapper(UserMapper.class).getUserById(1, "John");

执行流程:

  1. MyBatis 解析 getUserById 方法的 SQL 语句,将 # 占位符替换为 ?,得到 SELECT * FROM user WHERE id = ? AND name = ?
  2. MyBatis 创建 PreparedStatement 对象。
  3. MyBatis 从方法参数中获取 id (值为 1) 和 name (值为 “John”)。
  4. MyBatis 使用 PreparedStatementsetInt(1, 1)setString(2, "John") 方法,将参数值设置到占位符中。
  5. MyBatis 执行 PreparedStatementexecuteQuery 方法,执行 SQL 语句,并将结果映射为 User 对象。

ParameterHandler:

  • ParameterHandler 是 MyBatis 中负责处理参数设置的接口。
  • 默认实现类是 DefaultParameterHandler
  • DefaultParameterHandler 会根据参数的类型和配置的 TypeHandler,选择合适的 PreparedStatement.setXXX 方法来设置参数值。

TypeHandler:

  • TypeHandler 是 MyBatis 中负责 Java 类型和 JDBC 类型之间转换的接口。
  • MyBatis 内置了许多 TypeHandler,用于处理常见的类型转换。
  • 可以自定义 TypeHandler 来处理特殊的类型转换。

总结:

MyBatis 通过 PreparedStatement 和参数处理器 (ParameterHandler) 来实现对占位符的赋值。 它支持 #(预编译参数)和 $(字符串替换)两种占位符,推荐使用 # 占位符,以防止 SQL 注入攻击。 MyBatis 会根据参数的类型和配置的 TypeHandler,将 Java 对象转换为 JDBC 类型,并使用 PreparedStatementsetXXX 方法将参数值设置到占位符中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/71106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Apollo对配置类的热更新优化

背景 关于配置的热更新&#xff0c;apollo 通过com.ctrip.framework.apollo.spring.annotation.SpringValueProcessor 处理带Value的方法或字段&#xff0c;通过监听变更事件&#xff0c;采用反射去更新对应的值 但这个功能仅仅用于单个属性&#xff0c;当我有一组有关联关系…

Highcharts 配置语法详解

Highcharts 配置语法详解 引言 Highcharts 是一个功能强大的图表库&#xff0c;广泛应用于数据可视化领域。本文将详细介绍 Highcharts 的配置语法&#xff0c;帮助您快速上手并制作出精美、实用的图表。 高级配置结构 Highcharts 的配置对象通常包含以下几部分&#xff1a…

【AD】3-5 元件在原理图中的基本操作2

1.导线连接 选择放置->线&#xff08;CtrlW&#xff09;&#xff0c;或者直接点击横条处&#xff0c;建议使用直角走线 注意&#xff1a;下图中的线不具有电气连接属性&#xff0c;只是单纯的线 双击导线&#xff0c;进行设置导线粗细及颜色 2.网络标签 放置->网络标…

vim:基础配置

Vim 配置清单 设置行号显示 set number 设置相对行号&#xff08;可选&#xff09; set relativenumber设置制表符为4个空格 set tabstop4 设置自动缩进 set autoindent " 启用语法高亮 syntax on" 设置背景颜色&#xff08;可选&#xff0c;根据终端或GUI Vi…

【Springboot】解决问题 o.s.web.servlet.PageNotFound : No mapping for *

使用 cursor 进行老项目更新为 springboot 的 web 项目&#xff0c;发生了奇怪的问题&#xff0c;就是 html 文件访问正常&#xff0c;但是静态文件就是 404 检查了各种配置&#xff0c;各种比较&#xff0c;各种调试&#xff0c;最后放弃时候&#xff0c;清理没用的配置文件&…

day02_Java基础

文章目录 day02_Java基础一、今日课程内容二、数组&#xff08;熟悉&#xff09;1、定义格式2、基本使用3、了解数组的内存图介绍4、数组的两个小问题5、数组的常见操作 三、方法&#xff08;熟悉&#xff09;1、定义格式2、方法重载overload 四、面向对象&#xff08;掌握&…

Linux服务器防火墙白名单访问策略的配置示例

最近在做Linux系统应用部署配置过程中&#xff0c;为了确保应用的安全&#xff0c;简单学习了解了一些Linux中的动态防火墙管理工具的使用方法。本文测试实验主要采用Linux服务器的动态防火墙管理工具(即firewalld)&#xff0c;来实现服务或端口的访问控制&#xff0c;firewall…

【UCB CS 61B SP24】Lecture 17 - Data Structures 3: B-Trees学习笔记

本文以 2-3-4 树详细讲解了 B 树的概念&#xff0c;逐步分析其操作&#xff0c;并用 Java 实现了标准的 B 树。 1. 2-3 & 2-3-4 Trees 上一节课中讲到的二叉搜索树当数据是随机顺序插入的时候能够使得树变得比较茂密&#xff0c;如下图右侧所示&#xff0c;时间复杂度也就…

【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘

摘要 支持向量机&#xff08;SVM&#xff09;是机器学习中的经典算法&#xff01;本文将深入解析最大间隔分类原理&#xff0c;手撕对偶问题推导过程&#xff0c;并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南&#xff0c;助力你掌握这一核心算法…

西门子S7-1200比较指令

西门子S7-1200 PLC比较指令学习笔记 一、比较指令的作用 核心功能&#xff1a;用于比较两个数值的大小或相等性&#xff0c;结果为布尔值&#xff08;True/False&#xff09;。典型应用&#xff1a; 触发条件控制&#xff08;如温度超过阈值启动报警&#xff09;数据筛选&…

SDF,占用场,辐射场简要笔记

符号距离函数&#xff08;Signed Distance Function&#xff0c;SDF&#xff09;的数学公式用于描述空间中任意点到某个几何形状边界的最短距离&#xff0c;并通过符号区分点在边界内外。具体定义如下&#xff1a; 假设 Ω \Omega Ω 是一个几何形状的边界&#xff0c;对于空…

solidwork智能尺寸怎么对称尺寸

以构造轴为中心线就能画智能尺寸的对称尺寸。先点击边再点击构造线

如何从零开始理解LLM训练理论?预训练范式、模型推理与扩容技巧全解析

Part 1&#xff1a;预训练——AI的九年义务教育 &#x1f4da; 想象你往峨眉山猴子面前扔了1000本《五年高考三年模拟》-我那时候还在做的题&#xff08;海量互联网数据&#xff09;&#xff0c;突然有一天它开口唱起《我在东北玩泥巴》&#xff0c;这有意思的过程就是LLM的预…

工程化与框架系列(13)--虚拟DOM实现

虚拟DOM实现 &#x1f333; 虚拟DOM&#xff08;Virtual DOM&#xff09;是现代前端框架的核心技术之一&#xff0c;它通过在内存中维护UI的虚拟表示来提高渲染性能。本文将深入探讨虚拟DOM的实现原理和关键技术。 虚拟DOM概述 &#x1f31f; &#x1f4a1; 小知识&#xff1…

设计模式--spring中用到的设计模式

一、单例模式&#xff08;Singleton Pattern&#xff09; 定义&#xff1a;确保一个类只有一个实例&#xff0c;并提供全局访问点 Spring中的应用&#xff1a;Spring默认将Bean配置为单例模式 案例&#xff1a; Component public class MySingletonBean {// Spring 默认将其…

深入浅出:Spring AI 集成 DeepSeek 构建智能应用

Spring AI 作为 Java 生态中备受瞩目的 AI 应用开发框架&#xff0c;凭借其简洁的 API 设计和强大的功能&#xff0c;为开发者提供了构建智能应用的强大工具。与此同时&#xff0c;DeepSeek 作为领先的 AI 模型服务提供商&#xff0c;在自然语言处理、计算机视觉等领域展现了卓…

CSS浮动详解

1. 浮动的简介 浮动是用来实现文字环绕图片效果的 2.元素浮动后会有哪些影响 对兄弟元素的影响&#xff1a; 后面的兄弟元素&#xff0c;会占据浮动元素之前的位置&#xff0c;在浮动元素的下面&#xff1b;对前面的兄弟 无影响。 对父元素的影响&#xff1a; 不能撑起父元…

python数据类型等基础语法

目录 字面量 注释 变量 查数据类型 类型转换 算数运算符 字符串定义的三种方式 字符串占位 数据输入 字面量 被写在代码中固定的值 六种数据类型: 1 字符串 String 如"egg" 2 数字 Number: 整数int 浮点数float 复数complex :如43j 布尔…

Android 图片压缩详解

在 Android 开发中,图片压缩是一个重要的优化手段,旨在提升用户体验、减少网络传输量以及降低存储空间占用。以下是几种主流的图片压缩方法,结合原理、使用场景和优缺点进行详细解析。 效果演示 直接先给大家对比几种图片压缩的效果 质量压缩 质量压缩:根据传递进去的质…

Flutter状态管理框架GetX最新版详解与实践指南

一、GetX框架概述 GetX是Flutter生态中轻量级、高性能的全能开发框架&#xff0c;集成了状态管理、路由导航、依赖注入等核心功能&#xff0c;同时提供国际化、主题切换等实用工具。其优势在于代码简洁性&#xff08;减少模板代码约70%&#xff09;和高性能&#xff08;基于观…