MyBatis:SQL与Java的智能桥梁

MyBatis:SQL 与 Java 的「智能翻译官」

—— 用 极简的方式 连接数据库和 Java 对象,告别 JDBC 的繁琐操作!


核心定位:半自动化 ORM 框架

对比项JDBC 原生操作MyBatis 解决方案
SQL 编写拼字符串(易出错、难维护)XML/注解 清晰隔离 SQL
结果映射手动遍历 ResultSet → 对象自动映射 结果到 Java 对象
连接管理手动开/关 Connection、Statement自动管理资源(防泄漏)
参数传递setString(1, “Alice”) 硬编码动态参数#{} 防 SQL 注入)

📌 ORM (对象关系映射):将数据库表 自动映射为 Java 对象(如 User 类 → user 表)


核心组件图解

调用
执行
映射
操作
返回数据
封装结果
返回对象
Java 代码
SqlSession
Mapper 接口
XML 或 注解 SQL
数据库

核心优势详解

1. SQL 自由掌控

灵活编写复杂 SQL(存储过程、多表 JOIN)
动态 SQL:根据条件智能拼接 SQL 片段

<select id="findUsers">SELECT * FROM users<where><if test="name != null">   <!-- 动态条件 -->AND name = #{name}</if><if test="minAge != null">AND age >= #{minAge}</if></where>
</select>
2. 自动对象映射

数据库字段 → Java 对象属性(支持嵌套对象)

<resultMap id="userMap" type="User"><id property="id" column="user_id"/>       <!-- 主键映射 --><result property="name" column="user_name"/><!-- 字段映射 --><!-- 嵌套对象映射 --><association property="dept" javaType="Department"><result property="deptName" column="dept_name"/></association>
</resultMap>
3. 解耦神器
  • SQL 与 Java 代码分离(XML 管理 SQL)
  • 接口 + 注解 零 SQL 侵入方案(推荐)
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User getUserById(int id);
}

核心操作流程(以查询为例)

  1. 定义 Mapper 接口
public interface UserMapper {User getUserById(@Param("id") int id);
}
  1. 编写 SQL 映射(XML 或注解)
<!-- UserMapper.xml -->
<select id="getUserById" resultType="User">SELECT * FROM users WHERE id = #{id}
</select>
  1. 调用 MyBatis API
// 1. 加载配置(数据源、Mapper 路径)
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取会话
try (SqlSession session = factory.openSession()) {// 3. 获取 Mapper 代理对象UserMapper mapper = session.getMapper(UserMapper.class);// 4. 执行查询 → 自动返回 User 对象User user = mapper.getUserById(1001); 
}

进阶特性

特性用途
一级/二级缓存减少数据库查询(一级缓存默认开启,二级缓存需手动配置)
插件机制拦截 SQL 执行(实现分页、审计等)
类型处理器自定义 Java 类型 ↔ 数据库类型转换(如 List 转 JSON 存储)
动态 SQL 标签<foreach>, <choose>, <bind> 简化复杂查询

适用场景

  • 需精细控制 SQL 的项目(如金融系统、报表查询)
  • 遗留数据库(表设计不符合 ORM 规范)
  • 高性能需求场景(比全自动 ORM 如 Hibernate 更轻量)
  • 简单 CRUD 小项目(可选 Spring Data JPA)

代码对比:JDBC vs MyBatis

// ---------- JDBC 原生查询(20+行)-----------
Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id=?");
stmt.setInt(1, 1001); 
ResultSet rs = stmt.executeQuery();User user = null;
if (rs.next()) {user = new User();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));// ... 手动赋值所有字段
}
rs.close(); stmt.close(); conn.close(); // 必须手动关闭!// ---------- MyBatis 等效操作(1行)-----------
User user = userMapper.getUserById(1001); // SQL自动执行+结果封装

💡 总结
MyBatis = SQL 掌控力 + 开发高效率
—— 像写原生 SQL 一样灵活,像用 ORM 一样省力!

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

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

相关文章

自动驾驶控制系统

目录 控制系统概述 无人车控制架构设计 自动驾驶控制核心技术 车辆纵向控制 车辆横向控制 自动驾驶控制方法 自动驾驶控制技术方案 人机交互系统 控制系统概述 控制技术是智能驾驶的关键,旨在环境感知技术的基础之上,根据决策规划出目标轨迹,通过纵向和横向控制系统…

网络安全基石:从弱口令治理到动态防御体系的构建

引言&#xff1a;数字时代的防御困局 在5G与物联网技术全面落地的数字新基建时代&#xff0c;企业网络资产规模呈现指数级增长。Verizon《2023年数据泄露调查报告》显示&#xff0c;61%的安全事件直接源于凭证失窃&#xff0c;而其中81%的攻击成功案例可溯源至初始口令强度的不…

Error: fatal: detected dubious ownership in repository at

这个错误是 Git 在新版中引入的一种 安全检查机制&#xff0c;目的是防止不同用户访问同一个 Git 仓库目录&#xff0c;避免潜在的权限或安全问题。你的情况是&#xff1a;仓库目录是属于另一个用户。当前以管理员用户 OVERSPREAD/Administrator 运行 Git。Git 为了安全起见&am…

嵌入式 数据结构学习 (六) 树、哈希表与内核链表

一、树(Tree)结构详解1. 树的基本概念树的核心特性非线性结构&#xff1a;数据元素之间存在一对多的层次关系递归定义&#xff1a;树的子树仍然是树专业术语&#xff1a;度(Degree)&#xff1a;结点拥有的子树数叶子结点&#xff1a;度为0的结点层次(Level)&#xff1a;根为第1…

封装WebSocket

一个基于原生 WebSocket 的封装库&#xff0c;实现了自动重连、心跳检测等功能&#xff0c;用于在前端应用中稳定地与后端 WebSocket 服务通信。下面从设计思路、关键功能等方面进行详细分析&#xff1a;设计思路 这个封装库采用单例模式设计&#xff0c;全局维护一个 WebSocke…

SLICEGPT: COMPRESS LARGE LANGUAGE MODELSBY DELETING ROWS AND COLUMNS

发表&#xff1a;ICLR24 机构&#xff1a;ETH Zurich 连接&#xff1a;https://arxiv.org/pdf/2401.15024 ABSTRACT 大型语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为自然语言处理的基石&#xff0c;但其使用伴随着在计算和内存资源方面的高昂代价。…

Python 【技术面试题和HR面试题】➕ 循环结构、控制语句及综合应用问答

1.技术面试题 &#xff08;1&#xff09;详细描述单调栈的工作原理和应用场景 答&#xff1a; 原理 维护栈内元素单调递增 / 递减&#xff0c;新元素入栈前&#xff0c;弹出破坏单调性的栈顶&#xff0c;保持单调。 应用场景 排队比身高&#xff0c;搭积木找最大的空地 &#x…

100G系列光模块产品与应用场景介绍

在当今数字化时代&#xff0c;网络流量呈爆炸式增长&#xff0c;对数据传输速度和带宽的要求也越来越高。100G 光模块作为高速数据传输的关键组件&#xff0c;因其卓越的高速传输能力&#xff0c;已成为数据中心、云计算、企业网络以及 5G 通信网络等领域的重要组成部分。接下来…

运筹说 第140期 | 从直觉到算法:这些奠基人如何塑造了启发式方法的科学根基?

运筹说建构知识体系&#xff0c;解析学习要点运 筹 优 化 领 域 教 学 媒 体视频课程已上线&#xff01;&#xff01;!欢迎大家关注同名抖音和哔哩哔哩账号&#xff01;在人工智能与优化科学的浩瀚星空中&#xff0c;启发式算法如同一把钥匙&#xff0c;为人类打开了处…

Flutter编译安卓应用时遇到的compileDebugJavaWithJavac和compileDebugKotlin版本不匹配的问题

记一次flutter应用&#xff0c;编译安卓时&#xff0c;报的一个compileDebugJavaWithJavac和compileDebugKotlin版本本匹配的问题。 最终定位的原因是项目一来了audioplayers组件。 audioplayers组件有依赖了audioplayers_android&#xff0c; 它使用1.8编译的。 版本过低。后来…

linux-权限管理

linux-权限管理一、权限的基本类型二、权限的表示方式1. 字符形式&#xff08;rwx&#xff09;2. 数字形式三、权限管理常用命令1. chmod2. chown3. chgrp四、隐藏权限1. lsattr2. chattr五、权限掩码六、特别权限位1. suid2. sgid3. Sticky Bit七、权限委托1. 授权用户2. 授权…

从FCOS3D到PGD:看深度估计如何快速搭建你的3D检测项目

【导读】 还记得那个曾经在单目3D目标检测领域掀起热潮的 FCOS3D 吗&#xff1f;在后续更新中他们又推出了全新升级版——PGD&#xff08;Probabilistic and Geometric Depth&#xff09;最有意思的是&#xff0c;这次他们彻底换了路线&#xff1a;从原先的“直接回归深度”&a…

Apache Cloudberry 向量化实践(三)重塑表达式构建路径:Gandiva 优化实战

在向量化执行系统中&#xff0c;表达式构建是不可或缺的基础环节。无论是 SQL 中的投影、筛选&#xff0c;还是分区、聚合、排序&#xff0c;最终都需转化为底层执行引擎能识别和执行的表达式树。而在 Apache Cloudberry 向量化执行框架中&#xff0c;这一过程由 Gandiva 表达式…

Windows删除文件或者拔出U盘显示正在使用/占用解决办法

1、复制文件地址2、打开任务管理器&#xff0c;选择左侧【性能】3、打开资源监视器4、选择资源监视器中的CPU5、粘贴你复制的占用文件地址6、除了explore.exe以外&#xff0c;其他的关联的句柄都选中&#xff0c;然后右键结束

自由学习记录(68)

&#x1f9e0; blender为什么不用 M 或 T&#xff1f; 键位含义为什么没选MMove&#xff1f;其实被用作「Move to Collection」等功能不符合历史定义&#xff0c;而且功能太多了TTransform&#xff1f; 但 transform 是一个总称&#xff08;含移动、旋转、缩放&#xff09;T 被…

ReactNative【实战系列教程】我的小红书 8 -- 我(含左侧弹窗菜单,右下角图标等)

最终效果点左上角菜单按钮&#xff0c;弹出左侧菜单后代码实现app/(tabs)/mine.tsx import icon_add from "/assets/icons/icon_add.png"; import mine_bg from "/assets/images/mine_bg.png"; import Heart from "/components/Heart"; import a…

C++性能优化实战:从理论到落地的五大核心策略

在当今这个对计算效率要求极高的时代&#xff0c;C作为系统级编程语言的王者&#xff0c;其性能优化能力依然是无可替代的核心竞争力。本文将分享我在大型分布式系统开发中积累的C性能优化实战经验&#xff0c;这些经验帮助我们将关键组件的吞吐量提升了300%&#xff0c;延迟降…

字节 Seed 团队联合清华大学智能产业研究院开源 MemAgent: 基于多轮对话强化学习记忆代理的长文本大语言模型重构

&#x1f525; 最新动态!!! [2025/07] 我们提供了快速启动脚本&#xff0c;让使用MemAgent变得超级简单&#xff0c;详情请见下方"快速入门"部分。[2025/06] 我们发布了RL-MemAgent-14B和RL-MemAgent-7B模型&#xff0c;在350万token上下文任务中实现了近乎无损的性…

【unitrix】 4.20 类型级二进制数减法实现解析(sub.rs)

一、源码 这段代码实现了一个用于统计二进制补码整数位数的系统&#xff0c;支持多种自定义数值类型&#xff08;Z0、P1、N1、B0、B1&#xff09;。 use core::mem::size_of; use crate::number::{Z0, P1, N1, B0, B1, Var};/// 统计二进制位数的 trait pub trait BitLength {f…

手把手教你安全删除Anaconda虚拟环境(避坑指南)

文章目录一、删除前必看清单&#xff08;超级重要&#xff09;二、三种删除方法对比&#xff08;建议收藏&#xff09;方法1&#xff1a;官方推荐命令&#xff08;最安全&#xff09;方法2&#xff1a;暴力删除大法&#xff08;快速但需谨慎&#xff09;方法3&#xff1a;核弹级…