当前位置: 首页 > 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…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

从零手写Java版本的LSM Tree (一):LSM Tree 概述

&#x1f525; 推荐一个高质量的Java LSM Tree开源项目&#xff01; https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree&#xff0c;专为高并发写入场景设计。 核心亮点&#xff1a; ⚡ 极致性能&#xff1a;写入速度超…...

CMS内容管理系统的设计与实现:多站点模式的实现

在一套内容管理系统中&#xff0c;其实有很多站点&#xff0c;比如企业门户网站&#xff0c;产品手册&#xff0c;知识帮助手册等&#xff0c;因此会需要多个站点&#xff0c;甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...

【Java】Ajax 技术详解

文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…...

02-性能方案设计

需求分析与测试设计 根据具体的性能测试需求&#xff0c;确定测试类型&#xff0c;以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通&#xff0c;初步确定压测方案及具体的性能指标QA完成性能测试设计后&#xff0c;需产出测试方案文档发送邮件到项目组&…...

更新 Docker 容器中的某一个文件

&#x1f504; 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法&#xff0c;适用于不同场景。 ✅ 方法一&#xff1a;使用 docker cp 拷贝文件到容器中&#xff08;最简单&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…...