当前位置: 首页 > news >正文

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 可以执行 selectinsertupdatedelete 等操作,并提供了事务的提交与回滚功能。

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 语句的执行和对象的映射展开。其核心流程如下:

  1. 加载配置文件:MyBatis 首先通过 SqlSessionFactoryBuilder 解析 mybatis-config.xml 配置文件,并构建 SqlSessionFactory
  2. 获取 SqlSession:通过 SqlSessionFactory 获取 SqlSession 对象,用于执行数据库操作。
  3. 执行 SQL 语句:MyBatis 会根据 Mapper 中的定义,调用对应的 SQL 语句,并通过 ResultMap@Select 注解将查询结果映射为 Java 对象。
  4. 提交或回滚事务:对于非查询操作,如 insertupdatedelete,MyBatis 需要手动提交事务。
  5. 关闭 SqlSession:操作完成后,必须关闭 SqlSession 以释放数据库连接资源。

三、MyBatis 的核心功能

1. 动态 SQL

MyBatis 支持动态 SQL,这意味着开发者可以根据运行时条件生成不同的 SQL 语句。动态 SQL 通常使用 MyBatis 提供的 ifchoosewhereset 等标签来实现。

<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 不直接提供分页功能,但可以通过传递分页参数(如 offsetlimit)来实现分页查询。

<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 的优缺点

优点:
  1. 灵活性高:MyBatis 允许开发者直接编写 SQL,可以处理

复杂的查询和性能优化。
2. 轻量级:相比全自动 ORM 框架(如 Hibernate),MyBatis 更加轻量,适用于大型项目和对 SQL 控制要求较高的场景。
3. 支持动态 SQL:MyBatis 的动态 SQL 功能可以根据运行时条件生成不同的 SQL 语句,提供了极大的灵活性。
4. 良好的扩展性:MyBatis 提供了丰富的插件机制,可以方便地扩展其功能,如分页插件、性能监控插件等。

缺点:
  1. 对 SQL 依赖较重:开发者需要手动编写 SQL,复杂业务逻辑的 SQL 维护成本较高。
  2. 全局性能优化不足:由于 MyBatis 是手写 SQL,无法像全自动 ORM 框架那样全局性地优化数据库访问性能。

六、总结

MyBatis 作为一个灵活、高效的 ORM 框架,通过手写 SQL 提供了对复杂数据库操作的精细控制,并且具备优秀的动态 SQL 和映射功能。虽然 MyBatis 对 SQL 有一定的依赖,但在性能优化和灵活性方面,其表现尤为突出,尤其适合对 SQL 有严格控制和复杂查询需求的企业级项目。

相关文章:

MyBatis 基本概念

MyBatis 基本概念详解 MyBatis 是一个优秀的持久层框架&#xff0c;它支持定制 SQL、存储过程以及高级映射&#xff0c;用于将 Java 对象与数据库中的记录进行映射。作为 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;MyBatis 的主要优势在于灵活性高&#xff0c;…...

前端开发之装饰器模式

介绍 装饰器模式 是在不修改对象内部结构的情况下&#xff0c;动态地给对象添加功能的一种设计模式。在软件开发中&#xff0c;有时候我们需要为已有对象添加一些额外的行为&#xff0c;但不希望修改该对象的代码&#xff0c;装饰器模式可以很好的满足这一需求。 在TypeScrip…...

【STL】pair 与 map:基础、操作与应用

C 标准库中提供了许多用于处理数据结构的容器和工具。pair 和 map 是两个非常有用的工具&#xff0c;广泛应用于存储和处理关联数据。在本文中&#xff0c;我们将详细介绍 pair 与 map 的相关操作&#xff0c;并结合代码实例为读者提供清晰的理解。 pair&#xff1a;成对数据的…...

深度学习-图像处理篇4VGG网络

CNN感受野...

初级css+初级选择器

一、css基础样式 html: 标签 > 网页骨架 css: 美化这个网页的骨架 >样式去装饰网页 1. css 层叠样式表 (英文全称: Cascading Style Sheets) >修饰网页内容 比如: 文字大小 颜色 网页排版 高宽等等 2. css写在哪里?——行内样式 内部样式 外部样…...

gitlab 的CI/CD (二)

前言 上文完成了gitlab-runner的基础配置及将gitlab的制品上传至软件包库&#xff08;产品库&#xff09;的脚本编写&#xff1b; 本文实现gitlab的ci/cd对远程服务器的操作&#xff1b; 介绍 要让Gitlab Runner部署到远程机器&#xff0c;远程机器必须信任gitlab runner账…...

【html】基础(一)

本专栏内容为&#xff1a;前端专栏 记录学习前端&#xff0c;分为若干个子专栏&#xff0c;html js css vue等 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;js专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &am…...

【网站架构部署与优化】Nginx优化

文章目录 Nginx服务优化一、隐藏Nginx版本号&#xff0c;避免安全漏洞泄漏方法一&#xff1a;通过修改配置文件方法二&#xff1a;通过修改源码并重新编译安装 修改Nginx的用户和组修改用户与组 配置Nginx网页缓存时间配置Nginx连接保持的超时时间KeepAlive模式简介Nginx中的超…...

gitlab修改访问端口

目录 1.找到gitlab.rb文件&#xff0c;一般在/etc/gitlab/路径下 2.打开配置文件&#xff0c;加上代码 3.重新配置 4.重启gitlab 1.找到gitlab.rb文件&#xff0c;一般在/etc/gitlab/路径下 2.打开配置文件&#xff0c;加上代码 打开文件 sudo vi gitlab.rb 加上默认端口配…...

分库分表-分页排序查询

优质博文&#xff1a;IT-BLOG-CN 背景&#xff1a;我们系统上云后&#xff0c;数据根据用户UDL部分数据在国内&#xff0c;部分数据存储在海外&#xff0c;因此需要考虑分库查询的分页排序问题 一、分库后带来的问题 需求根据订单创单时间进行排序分页查询&#xff0c;在单表…...

【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的各个索引数据结构及其适用场景

一、引言 在数据库的世界中&#xff0c;索引是提升查询速度的超级英雄。就像图书馔的目录帮助我们快速找到书籍一样&#xff0c;MySQL中的索引加速了数据检索的过程。本文将带你深入了解MySQL索引的多种数据结构、它们的适用场景以及如何巧妙地使用它们来优化性能。 二、索引…...

解决IDEA出现:java: 程序包javax.servlet不存在的问题

问题截图&#xff1a; 解决如下&#xff1a; 1. 点击文件——>项目结构 2. 点击库——>点击——>点击java 3. 找到Tomcat的文件夹&#xff0c;找到lib文件夹中的servlet-api.jar&#xff0c;点击确定 4. 选择要添加的模块 5. 点击应用——>确定...

Comfyui控制人物骨骼,细节也能完美调整!

前言 本文涉及的工作流和插件&#xff0c;需要的朋友请扫描免费获取哦~ 在我们利用Comfyui生成图像的工作中&#xff0c;是否常常因为人物的动作无法得到精确的控制而感到苦恼&#xff0c;生成出来的图片常常达不到自己心中满意的效果。 今天给大家分享的这个工作流&#xff…...

mysql学习教程,从入门到精通,SQL LEFT JOIN 语句(23)

1、SQL LEFT JOIN 语句 在SQL中&#xff0c;LEFT JOIN&#xff08;也称为左连接&#xff09;是一种将左表&#xff08;LEFT JOIN左侧的表&#xff09;的所有记录与右表&#xff08;LEFT JOIN右侧的表&#xff09;中匹配的记录结合起来的查询方式。如果左表中的记录在右表中没有…...

VSCode远程切换Python虚拟环境

VSCode远程切换Python虚拟环境 引言 在现代开发环境中&#xff0c;使用虚拟环境来管理项目依赖是一种普遍的做法。它不仅可以避免不同项目间的依赖冲突&#xff0c;还能让开发者更好地控制和隔离各个项目的环境。Visual Studio Code&#xff08;VSCode&#xff09;是一款广受…...

【CSS in Depth 2 精译_038】6.2 CSS 定位技术之:绝对定位

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…...

828 华为云征文|华为 Flexus 云服务器搭建 SamWaf 开源轻量级网站防火墙

在当今数字化高速发展的时代&#xff0c;网络安全问题日益凸显。为了保障网站的稳定运行和数据安全&#xff0c;我们可以借助华为 Flexus 云服务器搭建 SamWaf 开源轻量级网站防火墙。这不仅是一次技术的挑战&#xff0c;更是为网站筑牢安全防线的重要举措。 一、华为 Flexus …...

基于二自由度汽车模型的汽车质心侧偏角估计

一、质心侧偏角介绍 在车辆坐标系中&#xff0c;质心侧偏角通常定义为质心速度方向与车辆前进方向的夹角。如下图所示&#xff0c;u为车辆前进方向&#xff0c;v为质心速度方向&#xff0c;u和v之间的夹角便是质心侧偏角。 质心侧偏角的作用有如下三点&#xff1a; 1、稳定性…...

前端html+css+js 基础总结

​​​HTML 行级元素 标签分为行级元素与块级元素 行级元素占据区域由其显示内容决定&#xff0c;如span&#xff0c;img(图片)&#xff0c;<a></a>基本格式: <a href"链接" target"_blank"></a>用于跳转到其他网站&#xff0c…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...