MyBatis 基本概念
MyBatis 基本概念详解
MyBatis 是一个优秀的持久层框架,它支持定制 SQL、存储过程以及高级映射,用于将 Java 对象与数据库中的记录进行映射。作为 ORM(对象关系映射)框架,MyBatis 的主要优势在于灵活性高,开发者可以手写 SQL,精确控制 SQL 语句执行的方式,并灵活处理复杂的数据库查询。
MyBatis 在 Java 社区中应用广泛,特别是在企业级应用开发中,因为它提供了对复杂 SQL 查询的优良支持,同时减少了与 JDBC 的直接交互,使代码更加简洁易维护。
一、MyBatis 的基本概念
1. ORM (Object Relational Mapping)
MyBatis 是一个半自动的 ORM 框架,它将数据库中的表与 Java 对象进行映射,但与全自动的 ORM 框架(如 Hibernate)不同,MyBatis 强调 SQL 的灵活性,开发者需要手写 SQL 语句。通过这种方式,MyBatis 既保留了传统 JDBC 的灵活性,又减少了 JDBC 的冗余代码。
2. SqlSessionFactory
SqlSessionFactory 是 MyBatis 中的核心组件之一,负责创建 SqlSession 对象。SqlSessionFactory 是一个工厂类,通过读取 MyBatis 配置文件,创建并管理数据库连接。通常情况下,一个应用程序只需要一个 SqlSessionFactory 实例,这个实例可以在应用启动时通过 XML 或 Java 配置加载。
// 使用 MyBatis XML 配置创建 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
3. SqlSession
SqlSession 是用于执行数据库操作的对象,它负责执行 SQL 语句、获取映射器实例、提交事务和关闭连接等操作。SqlSession 可以执行 select、insert、update、delete 等操作,并提供了事务的提交与回滚功能。
try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectUser(1);
}
每次使用 SqlSession 时,应该在操作完成后关闭它,以释放数据库连接资源。
4. Mapper(映射器)
Mapper 是 MyBatis 中的一个重要概念,负责将 Java 接口与 SQL 语句进行关联。Mapper 接口中的方法通常对应数据库中的 SQL 操作,如查询、插入、更新、删除等。MyBatis 会根据接口方法的注解或 XML 配置文件,自动将 SQL 语句映射到对应的方法上。
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User selectUser(int id);
}
通过使用 Mapper,开发者无需编写过多的 JDBC 代码,只需要定义接口和 SQL 语句,MyBatis 会自动完成映射和数据库交互。
5. Configuration(配置文件)
MyBatis 的配置文件是 MyBatis 框架运行时的核心配置文件,主要用于定义数据库连接、环境配置、映射器注册等信息。配置文件通常命名为 mybatis-config.xml,包含以下关键部分:
- 环境配置(environments):用于定义多个数据库环境(如开发环境、生产环境等)。
- 映射器(mappers):用于注册 Mapper 接口或 XML 映射文件。
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><mappers><mapper resource="com/example/mappers/UserMapper.xml"/></mappers>
</configuration>
二、MyBatis 的工作原理
MyBatis 的工作流程主要围绕 SQL 语句的执行和对象的映射展开。其核心流程如下:
- 加载配置文件:MyBatis 首先通过
SqlSessionFactoryBuilder解析mybatis-config.xml配置文件,并构建SqlSessionFactory。 - 获取 SqlSession:通过
SqlSessionFactory获取SqlSession对象,用于执行数据库操作。 - 执行 SQL 语句:MyBatis 会根据
Mapper中的定义,调用对应的 SQL 语句,并通过ResultMap或@Select注解将查询结果映射为 Java 对象。 - 提交或回滚事务:对于非查询操作,如
insert、update和delete,MyBatis 需要手动提交事务。 - 关闭 SqlSession:操作完成后,必须关闭
SqlSession以释放数据库连接资源。
三、MyBatis 的核心功能
1. 动态 SQL
MyBatis 支持动态 SQL,这意味着开发者可以根据运行时条件生成不同的 SQL 语句。动态 SQL 通常使用 MyBatis 提供的 if、choose、where、set 等标签来实现。
<select id="findUsers" resultType="User">SELECT * FROM users<where><if test="username != null">AND username = #{username}</if><if test="age != null">AND age = #{age}</if></where>
</select>
动态 SQL 极大地增强了 MyBatis 的灵活性,使得开发者可以根据不同的条件生成复杂的 SQL 查询。
2. 高级映射
MyBatis 提供了丰富的映射功能,支持将复杂的数据库表结构映射为 Java 对象。常见的映射关系包括一对一、一对多和多对多等。
(1) 一对一映射
一对一映射通常用于将数据库中的一条记录关联到一个 Java 对象的属性。例如,用户和地址是一对一的关系。
<resultMap id="UserResult" type="User"><id column="id" property="id"/><result column="username" property="username"/><association property="address" column="address_id" javaType="Address" select="selectAddress"/>
</resultMap>
(2) 一对多映射
一对多映射通常用于将一条记录关联到多个 Java 对象的集合。例如,一个用户可以拥有多个订单。
<resultMap id="UserResult" type="User"><id column="id" property="id"/><result column="username" property="username"/><collection property="orders" ofType="Order" select="selectOrders"/>
</resultMap>
3. 缓存机制
MyBatis 提供了一级缓存和二级缓存机制,用于提升数据库查询的性能。
- 一级缓存:一级缓存是默认开启的,作用域是
SqlSession级别,意味着在同一个SqlSession中执行相同的查询语句时,MyBatis 会从缓存中读取结果,而不会重复查询数据库。 - 二级缓存:二级缓存是跨
SqlSession的缓存,作用域为Mapper,需要手动开启,并且缓存的结果可以在不同SqlSession之间共享。
<cache/>
4. 分页查询
MyBatis 不直接提供分页功能,但可以通过传递分页参数(如 offset 和 limit)来实现分页查询。
<select id="findUsersByPage" resultType="User">SELECT * FROM users LIMIT #{limit} OFFSET #{offset}
</select>
同时,也可以结合分页插件(如 PageHelper)来简化分页处理。
四、MyBatis 与 Spring 的集成
MyBatis 可以与 Spring 框架无缝集成,借助 Spring 的依赖注入和事务管理,可以进一步简化 MyBatis 的配置和使用。
在 Spring 中集成 MyBatis 通常使用 MyBatis-Spring 模块。开发者只需要配置 SqlSessionFactory 和 Mapper,Spring 会自动管理 SqlSession 的生命周期和事务。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:mappers/*.xml"/>
</bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.example.mappers"/>
</bean>
通过这样的集成方式,开发者可以在 Spring 中直接注入 Mapper,并且享受 Spring 的事务管理功能。
五、MyBatis 的优缺点
优点:
- 灵活性高:MyBatis 允许开发者直接编写 SQL,可以处理
复杂的查询和性能优化。
2. 轻量级:相比全自动 ORM 框架(如 Hibernate),MyBatis 更加轻量,适用于大型项目和对 SQL 控制要求较高的场景。
3. 支持动态 SQL:MyBatis 的动态 SQL 功能可以根据运行时条件生成不同的 SQL 语句,提供了极大的灵活性。
4. 良好的扩展性:MyBatis 提供了丰富的插件机制,可以方便地扩展其功能,如分页插件、性能监控插件等。
缺点:
- 对 SQL 依赖较重:开发者需要手动编写 SQL,复杂业务逻辑的 SQL 维护成本较高。
- 全局性能优化不足:由于 MyBatis 是手写 SQL,无法像全自动 ORM 框架那样全局性地优化数据库访问性能。
六、总结
MyBatis 作为一个灵活、高效的 ORM 框架,通过手写 SQL 提供了对复杂数据库操作的精细控制,并且具备优秀的动态 SQL 和映射功能。虽然 MyBatis 对 SQL 有一定的依赖,但在性能优化和灵活性方面,其表现尤为突出,尤其适合对 SQL 有严格控制和复杂查询需求的企业级项目。
相关文章:
MyBatis 基本概念
MyBatis 基本概念详解 MyBatis 是一个优秀的持久层框架,它支持定制 SQL、存储过程以及高级映射,用于将 Java 对象与数据库中的记录进行映射。作为 ORM(对象关系映射)框架,MyBatis 的主要优势在于灵活性高,…...
前端开发之装饰器模式
介绍 装饰器模式 是在不修改对象内部结构的情况下,动态地给对象添加功能的一种设计模式。在软件开发中,有时候我们需要为已有对象添加一些额外的行为,但不希望修改该对象的代码,装饰器模式可以很好的满足这一需求。 在TypeScrip…...
【STL】pair 与 map:基础、操作与应用
C 标准库中提供了许多用于处理数据结构的容器和工具。pair 和 map 是两个非常有用的工具,广泛应用于存储和处理关联数据。在本文中,我们将详细介绍 pair 与 map 的相关操作,并结合代码实例为读者提供清晰的理解。 pair:成对数据的…...
深度学习-图像处理篇4VGG网络
CNN感受野...
初级css+初级选择器
一、css基础样式 html: 标签 > 网页骨架 css: 美化这个网页的骨架 >样式去装饰网页 1. css 层叠样式表 (英文全称: Cascading Style Sheets) >修饰网页内容 比如: 文字大小 颜色 网页排版 高宽等等 2. css写在哪里?——行内样式 内部样式 外部样…...
gitlab 的CI/CD (二)
前言 上文完成了gitlab-runner的基础配置及将gitlab的制品上传至软件包库(产品库)的脚本编写; 本文实现gitlab的ci/cd对远程服务器的操作; 介绍 要让Gitlab Runner部署到远程机器,远程机器必须信任gitlab runner账…...
【html】基础(一)
本专栏内容为:前端专栏 记录学习前端,分为若干个子专栏,html js css vue等 💓博主csdn个人主页:小小unicorn ⏩专栏分类:js专栏 🚚代码仓库:小小unicorn的代码仓库🚚 &am…...
【网站架构部署与优化】Nginx优化
文章目录 Nginx服务优化一、隐藏Nginx版本号,避免安全漏洞泄漏方法一:通过修改配置文件方法二:通过修改源码并重新编译安装 修改Nginx的用户和组修改用户与组 配置Nginx网页缓存时间配置Nginx连接保持的超时时间KeepAlive模式简介Nginx中的超…...
gitlab修改访问端口
目录 1.找到gitlab.rb文件,一般在/etc/gitlab/路径下 2.打开配置文件,加上代码 3.重新配置 4.重启gitlab 1.找到gitlab.rb文件,一般在/etc/gitlab/路径下 2.打开配置文件,加上代码 打开文件 sudo vi gitlab.rb 加上默认端口配…...
分库分表-分页排序查询
优质博文:IT-BLOG-CN 背景:我们系统上云后,数据根据用户UDL部分数据在国内,部分数据存储在海外,因此需要考虑分库查询的分页排序问题 一、分库后带来的问题 需求根据订单创单时间进行排序分页查询,在单表…...
【openwrt-21.02】openwrt PPTP Passthrough 不生效问题解决方案
Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …...
【编程基础知识】Mysql的各个索引数据结构及其适用场景
一、引言 在数据库的世界中,索引是提升查询速度的超级英雄。就像图书馔的目录帮助我们快速找到书籍一样,MySQL中的索引加速了数据检索的过程。本文将带你深入了解MySQL索引的多种数据结构、它们的适用场景以及如何巧妙地使用它们来优化性能。 二、索引…...
解决IDEA出现:java: 程序包javax.servlet不存在的问题
问题截图: 解决如下: 1. 点击文件——>项目结构 2. 点击库——>点击——>点击java 3. 找到Tomcat的文件夹,找到lib文件夹中的servlet-api.jar,点击确定 4. 选择要添加的模块 5. 点击应用——>确定...
Comfyui控制人物骨骼,细节也能完美调整!
前言 本文涉及的工作流和插件,需要的朋友请扫描免费获取哦~ 在我们利用Comfyui生成图像的工作中,是否常常因为人物的动作无法得到精确的控制而感到苦恼,生成出来的图片常常达不到自己心中满意的效果。 今天给大家分享的这个工作流ÿ…...
mysql学习教程,从入门到精通,SQL LEFT JOIN 语句(23)
1、SQL LEFT JOIN 语句 在SQL中,LEFT JOIN(也称为左连接)是一种将左表(LEFT JOIN左侧的表)的所有记录与右表(LEFT JOIN右侧的表)中匹配的记录结合起来的查询方式。如果左表中的记录在右表中没有…...
VSCode远程切换Python虚拟环境
VSCode远程切换Python虚拟环境 引言 在现代开发环境中,使用虚拟环境来管理项目依赖是一种普遍的做法。它不仅可以避免不同项目间的依赖冲突,还能让开发者更好地控制和隔离各个项目的环境。Visual Studio Code(VSCode)是一款广受…...
【CSS in Depth 2 精译_038】6.2 CSS 定位技术之:绝对定位
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结)第二章 相对单位(已完结)第三章 文档流与盒模型(已完结)第四章 Flexbox 布局(已…...
828 华为云征文|华为 Flexus 云服务器搭建 SamWaf 开源轻量级网站防火墙
在当今数字化高速发展的时代,网络安全问题日益凸显。为了保障网站的稳定运行和数据安全,我们可以借助华为 Flexus 云服务器搭建 SamWaf 开源轻量级网站防火墙。这不仅是一次技术的挑战,更是为网站筑牢安全防线的重要举措。 一、华为 Flexus …...
基于二自由度汽车模型的汽车质心侧偏角估计
一、质心侧偏角介绍 在车辆坐标系中,质心侧偏角通常定义为质心速度方向与车辆前进方向的夹角。如下图所示,u为车辆前进方向,v为质心速度方向,u和v之间的夹角便是质心侧偏角。 质心侧偏角的作用有如下三点: 1、稳定性…...
前端html+css+js 基础总结
HTML 行级元素 标签分为行级元素与块级元素 行级元素占据区域由其显示内容决定,如span,img(图片),<a></a>基本格式: <a href"链接" target"_blank"></a>用于跳转到其他网站,…...
One API 部署教程(下):使用指南
导读:前面两篇讲了本地和线上部署,现在 One API 已经跑起来了,接下来就是真正的使用环节! 理解核心概念 在开始之前,咱们先搞清楚几个关键概念,不然后面容易晕。 渠道(Channel):就是你的各个 AI 平台的 API Key。比如你有 DeepSeek 的 Key、OpenAI 的 Key、通义千问…...
RK3588 LGA核心板:高性能嵌入式开发的模块化解决方案
1. 项目概述:当旗舰SoC遇见极致封装最近在嵌入式圈子里,一个“小而强”的组合引起了我的注意:瑞芯微的旗舰级SoC RK3588,被塞进了一个极其紧凑的LGA封装里,做成了名为SOM-3588-LGA的核心板,并且已经现货发售…...
GitHub 协作完全指南:从“傻瓜”到专家的保姆级教程
引言:为什么协作会让人头疼?想象一下,你和其他几个人要一起画一幅巨大的壁画。每个人都在自己的小画板上画一部分。问题来了:怎么保证大家用的颜色一致?怎么把每个人的画拼到一起时严丝合缝?如果两个人画了…...
从物理模型到代码:用MATLAB类轻松构建你的第一个仿真对象(比如弹簧振子)
从物理模型到代码:用MATLAB类轻松构建你的第一个仿真对象 理工科研究者常面临一个核心挑战:如何将复杂的物理系统转化为可计算的数学模型?以弹簧振子为例,这个看似简单的力学系统蕴含着丰富的物理规律。传统脚本式编程往往导致代码…...
嵌入式软件定时器原理与实现:从硬件限制到多任务调度
1. 软件定时器:从硬件限制到软件自由的桥梁在嵌入式开发里,定时器是个绕不开的话题。无论是让LED灯定时闪烁,还是需要周期性地采集传感器数据,甚至是实现一个简单的按键消抖,都离不开定时功能。硬件定时器(…...
前沿:小目标检测,YOLOv11n 再进化!
点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID|计算机视觉研究院 学习群|扫码在主页获取加入方式 https://sensors.myu-group.co.jp/sm_pdf/SM4311.pdf 计算机视觉研究院专栏 Column of Computer Vision Institute 基于最新 YOLOv…...
AI 高性能笔记本电脑高效紧凑型功率 MOSFET 完整选型方案
随着 AI 算力在笔记本电脑中的爆发式增长(如本地大模型、智能温控、性能调度),电源架构对功率 MOSFET 提出严苛要求:超高电流密度、极低损耗、超小封装、逻辑电平驱动。微碧半导体(VBsemi)基于先进的 Trenc…...
ARM ETM10硬件追踪系统设计与信号完整性优化
1. ARM ETM10硬件追踪系统设计精要在嵌入式系统开发领域,ARM ETM10(Embedded Trace Macrocell)作为一款高性能硬件追踪模块,为开发者提供了处理器指令和数据流的实时可视性。不同于软件调试工具,ETM10通过在芯片内部直…...
编程统计员工午休时长,下午工作效率数据,划定合理休息时间,科学提升全天职场整体工作产能。
基于商务智能(BI)思想的「员工午休时长 vs 下午工作效率」分析系统,保持中立、去营销化、无引流。一、实际应用场景描述某中型互联网团队发现:- 有人午休时间过长,下午精神仍不佳- 有人午休过短,下午效率明…...
【亲测免费】 探索U-Net多类别图像分割:基于PyTorch的开源利器
探索U-Net多类别图像分割:基于PyTorch的开源利器 【下载地址】U-Net多类别训练代码基于PyTorch 本仓库提供了一个基于PyTorch实现的U-Net模型代码,适用于多类别图像分割任务。你可以使用该代码训练自己的数据集,实现对图像中不同类别的精确分…...
