MyBatis:简化数据库操作的持久层框架

news2025/5/23 4:32:45

1、什么是Mybatis?

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由

apachesoftwarefoundation 迁移到了google code,由谷歌托管,并且改名为MyBatis 。

2013年11月迁移到Github。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS

提供的持久层框架包括SQL Maps和Data Access Objects(DAO)

MyBatis是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java POJO到数据库中的记录。

Object Relational Mapping,简称ORM,翻译过来是对象关系映射。一般用于实现面向对象编程语言里的对象和数据库中的之间的转换。

Mybatis官方文档:MyBatis中文网

2、Mybatis的优点

  1. 简化数据库操作:MyBatis可以通过XML或注解配置来映射Java对象与数据库表之间的关系,从而避免了手动编写大量的JDBC代码。这使得数据库操作变得简单、直观,并且易于维护。
  2. 灵活的SQL控制: MyBatis允许开发者直接编写SQL语句,而不是像一些ORM框架那样自动生成SQL语句。这使得开发者可以更灵活地优化和调整SQL语句,以满足特定的性能需求。
  3. 高度可定制化:MyBatis的插件机制和丰富的配置选项,使得它非常灵活且高度可定制化。开发者可以根据项目需求来选择和配置功能,从而实现个性化的数据访问层。
  4. 轻量级: MyBatis是一个轻量级的框架,它不依赖于其他复杂的框架,只需引入MyBatis的相关依赖即可。这使得项目部署和运行时的资源消耗较小。
  5. 优秀的性能: MyBatis的直接SQL控制和缓存支持,使得它在处理大量数据时表现出色,具有很好的性能。
  6. 一级和二级缓存: MyBatis支持一级缓存(默认开启)和二级缓存(可配置),这些缓存可以减少数据库的访问次数,提高查询性能。
  7. 支持原生SQL: MyBatis允许开发者在XML文件中直接编写原生的SQL语句,这样对于一些复杂的查询或特殊需求,可以更容易地实现。
  8. 与现有项目集成:MyBatis不会强制你按照特定的开发模式或架构来进行开发,它可以与现有的Java项目很好地集成,适用于各种场景。

3、Mybatis的缺点

  1. 繁琐的配置:MyBatis需要通过XML或注解来配置SQL映射和数据库连接等信息,这可能导致配置文件变得庞大而复杂,特别是对于大型项目而言。
  2. SQL维护: 直接编写SQL语句可以提供更大的灵活性,但也可能导致SQL的维护问题。当数据库模式发生变化时,可能需要手动修改大量的SQL语句,这可能会增加开发和维护的工作量。
  3. 缺乏全面的ORM支持:MyBatis在对象关系映射(ORM)方面相对较弱。与一些全面的ORM框架相比,MyBatis在处理复杂关系和对象图时可能需要更多的手动操作。
  4. 依赖于SQL:MyBatis的灵活性使得开发者可以直接编写SQL语句,但也可能导致开发者过度依赖于SQL,而忽略了一些ORM框架所提供的便利功能。
  5. 缓存管理:尽管MyBatis支持缓存,但对于复杂的分布式环境或大规模系统,缓存管理可能变得复杂,需要开发者注意缓存的清理和更新机制。

4、Mybatis和Hibernate比较

Hibernate和Mybatis都是ORM框架,都支持JDBC和JTA事务处理,它们创建的目的都是为了简化Java原生程序操作数据库的步骤,增加开发者的开发效率。

不同点有以下几点

1、Hibernate是全自动的,Mybatis是半自动的。 在Hibernate当中,开发者只需要定义好数据库的表字段和Java DO的映射关系和规则即可,Hibernate会开放出来接口自动去处理数据库表的CURD,并按照规定好的规则映射到DO对象中,这个过程中操作者完全不需要感知Sql逻辑的。但是在Mybatis中则完全不是这样,Mybatis不会帮助开发者编写sql逻辑,Mybatis只会按照定义好的规则将数据库字段映射到Java的DO中,但是具体的sql逻辑还是需要开发者自己编写的。

2、正是因为Mybatis需要自己编写Sql逻辑,这是一个包袱,因为开发者需要根据不同的DB,选择不同的SQL语句(DB移植性不高),而且正是因为要自己写SQL,项目初期的开发工作量要比Hibernate大一点。但是这也是优点,通过Mybatis开发者就可以定制sql,譬如多表join、sql优化等操作是Hibernate不具备的。

3、Hibernate的缓存系统要优于Mybatis,如果二级缓存出现数据,Hibernate会及时报错,但是Mybatis就需要开发者自己去感知。

总的来说,MyBatis是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,Hibernate是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。

5、Mybatis的功能架构

1) API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。

2) 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

3) 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

6、Mybatis的运行原理

(1)加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

(2)SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。

(3)SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。

(4)结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。

7、Mybatis运行总体流程

(1)加载配置并初始化

触发条件:加载配置文件

处理过程:将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

(2)接收调用请求

触发条件:调用Mybatis提供的API

传入参数:为SQL的ID和传入参数对象

处理过程:将请求传递给下层的请求处理层进行处理。

(3)处理操作请求

触发条件:API接口层传递请求过来

传入参数:为SQL的ID和传入参数对象

处理过程:

(A)根据SQL的ID查找对应的MappedStatement对象。

(B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。

(C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。

(D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。

(E)释放连接资源。

(4)返回处理结果将最终的处理结果返回。

8、Mybatis的缓存

1、一级缓存: 基于PerpetualCache的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close之后,该Session中的所有 Cache 就将清空。

SqlSession级别的缓存,缓存数据存储在HashMap中,在进行第一次查询时,首先会从数据库中查询出结果,然后将结果存在一级缓存中;当我们第二次查询时,首先会查询一级缓存,如果一级缓存没有在查询数据库。在进行CUD操作并执行了commit或关闭Sqlsession后会将缓存清空,如果二级缓存是开启的那么会将数据缓存到二级缓存中。默认一级缓存是开启的

2、二级缓存:是在应用级别上工作的,这意味着它跨越多个 SqlSession实例。当一个查询被执行时,MyBatis首先检查这个查询的结果是否已经存在于二级缓存中。如果存在,则直接从缓存返回结果,而不必执行实际的数据库查询。这可以显著减少数据库负载和提高查询性能。默认二级缓存未开启

MyBatis 二级缓存的默认状态

MyBatis 的二级缓存默认是「全局可用但局部未启用」的状态,具体表现为:

  1. 全局开关 (cacheEnabled) 默认是 true
    • <setting name="cacheEnabled" value="true"/> 是默认行为
    • 这个配置项只是表示「允许」使用二级缓存,而不是「强制启用」
  1. 但单个 Mapper 默认不缓存
    • 即使全局允许缓存,每个 Mapper 仍需要 显式声明 <cache/>@CacheNamespace 才会真正启用缓存
<!-- 推荐显式声明而非依赖默认值 -->
<settings>
  <setting name="cacheEnabled" value="true"/> <!-- 其实可省略 -->
</settings>
<!-- 按需启用缓存 -->
<mapper namespace="com.example.UserMapper">
  <!-- 只有添加这行才会真正缓存 -->
  <cache eviction="LRU" size="1024"/>
</mapper>
<!-- 关键场景禁用缓存 -->
<select id="getRealTimeData" useCache="false">
  SELECT * FROM realtime_table
</select>

9、Mybatis标签

1. 基本映射标签

1、<mapper>

根元素,定义XML映射文件的命名空间

namespace 属性:对应Mapper接口的全限定名

<mapper namespace="com.mybatis.mybatisdemo.mapper.UserMapper">
2、<resultMap>

定义数据库结果集到Java对象的映射关系

属性

id:唯一标识符

type:映射的Java类型

extends:继承其他resultMap

子元素

<id>:主键字段映射

<result>:普通字段映射

<collection>:一对多关联

<association>:一对一关联

<!-- 基本结果映射 -->
<resultMap id="BaseResultMap" type="com.mybatis.mybatisdemo.entity.User">
  <id column="id" property="id"/>
  <result column="username" property="username"/>
  <result column="password" property="password"/>
  <result column="email" property="email"/>
  <result column="phone" property="phone"/>
  <result column="create_time" property="createTime"/>
  <result column="update_time" property="updateTime"/>
  <result column="status" property="status"/>
</resultMap>

<!-- 包含订单的映射 extends="BaseResultMap"表示该结果映射继承自另一个名为 BaseResultMap 的结果映射 -->
<resultMap id="WithOrdersResultMap" type="com.mybatis.mybatisdemo.entity.User" extends="BaseResultMap">
  <collection property="orders" ofType="com.mybatis.mybatisdemo.entity.Order" columnPrefix="order_">
    <id column="id" property="id"/>
    <result column="user_id" property="userId"/>
    <result column="order_no" property="orderNo"/>
    <result column="amount" property="amount"/>
    <result column="status" property="status"/>
    <result column="create_time" property="createTime"/>
    <result column="update_time" property="updateTime"/>
    <result column="remark" property="remark"/>
  </collection>
</resultMap>

<!-- 基本结果映射 -->
<resultMap id="BaseResultMap" type="com.mybatis.mybatisdemo.entity.Order">
  <id column="id" property="id"/>
  <result column="user_id" property="userId"/>
  <result column="order_no" property="orderNo"/>
  <result column="amount" property="amount"/>
  <result column="status" property="status"/>
  <result column="create_time" property="createTime"/>
  <result column="update_time" property="updateTime"/>
  <result column="remark" property="remark"/>
</resultMap>

<!-- 包含用户信息的映射 -->
<resultMap id="WithUserResultMap" type="com.mybatis.mybatisdemo.entity.Order" extends="BaseResultMap">
  <association property="user" javaType="com.mybatis.mybatisdemo.entity.User">
    <id column="user_id" property="id"/>
    <result column="username" property="username"/>
    <result column="email" property="email"/>
    <result column="phone" property="phone"/>
  </association>
</resultMap>
3、<select>
  • 定义查询语句
  • 关键属性:
    • id:方法名
    • parameterType:参数类型
    • resultMap/resultType:返回类型
    • useCache:是否使用二级缓存
<!-- 根据ID查询用户 -->
<select id="selectById" parameterType="int" resultMap="BaseResultMap">
  SELECT * FROM user WHERE id = #{id}
</select>

4、<insert>

  • 定义插入语句
  • 特殊属性:
    • useGeneratedKeys:是否使用自增主键
    • keyProperty:指定将生成的主键值赋给参数对象的哪个属性
    <!-- 插入用户 -->
    <insert id="insert" parameterType="com.mybatis.mybatisdemo.entity.User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user (username, password, email, phone, status)
        VALUES (#{username}, #{password}, #{email}, #{phone}, #{status})
    </insert>
5、<update>

定义更新操作

    <update id="update" parameterType="com.mybatis.mybatisdemo.entity.User">
        UPDATE user
        SET username = #{username},
            password = #{password},
            email = #{email},
            phone = #{phone},
            status = #{status}
        WHERE id = #{id}
    </update>
6、<delete>

定义删除操作

    <!-- 根据ID删除用户 -->
    <delete id="deleteById" parameterType="int">
       

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

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

相关文章

【001】RenPy打包安卓apk 流程源码级别分析

1. 入口在下图 2. SDK版本及代码入口 &#xff08;renpy-8.3.7-sdk&#xff09; 由于SDK一直在升级&#xff0c;本文采用 标题中的版本进行分析&#xff0c;整体逻辑变化不太大。 实际执行逻辑是调用的rapt 2.1 点击按钮实际执行逻辑 def AndroidIfState(state, needed, acti…

物理信息神经网络(PINNs)在悬臂梁分析中的应用研究

一、引言 物理信息神经网络(Physics-Informed Neural Networks, PINNs)是近年来兴起的一种结合深度学习与传统物理建模的创新方法。本文将探讨PINNs在悬臂梁力学分析中的应用&#xff0c;展示如何利用这一技术解决工程力学中的经典问题。 二、PINNs基本原理 PINNs的核心思想是…

论文浅尝 | HOLMES:面向大语言模型多跳问答的超关系知识图谱方法(ACL2024)

笔记整理&#xff1a;李晓彤&#xff0c;浙江大学硕士&#xff0c;研究方向为大语言模型 论文链接&#xff1a;https://arxiv.org/pdf/2406.06027 发表会议&#xff1a;ACL 2024 1. 动机 多跳问答&#xff08;Multi-Hop Question Answering, MHQA&#xff09;技术近年来在自然语…

jenkins使用Send build artifacts over SSH发布jar包目录配置

本测试用ruoyi-plus的代码。 1 [GitLab 自动触发 Jenkins 构建_jenkins构建触发器没有build when a change is pushed to git-CSDN博客](https://blog.csdn.net/wangyiyungw/article/details/81776972) 2 [jenkins使用Send build artifacts over SSH遇到的坑-CSDN博客](https…

uni-app小程序登录后…

前情 最近新接了一个全新项目&#xff0c;是类似商城的小程序项目&#xff0c;我负责从0开始搭建小程序&#xff0c;我选用的技术栈是uni-app技术栈&#xff0c;其中就有一个用户登录功能&#xff0c;小程序部分页面是需要登录才可以查看的&#xff0c;对于未登录的用户需要引…

【深度学习基础】从感知机到多层神经网络:模型原理、结构与计算过程全解析

【深度学习基础】从感知机到多层神经网络&#xff1a;模型原理、结构与计算过程全解析 1. 引言 神经网络的重要性&#xff1a; 作为人工智能的核心技术之一&#xff0c;神经网络通过模拟人脑神经元的工作机制&#xff0c;成为解决复杂模式识别、预测和决策任务的利器。从图像分…

解决Power BI Desktop导入Excel数据第一行不是列标题问题

选中第一行不是列标题的表→鼠标右键→选择编辑查询→进入Power Query界面→点击“将第一行用作标题”→点击左边的“关闭并应用” 第一行就提升为标题了

springboot3.x只需两步快速整合nacos作配置中心

一、下载依赖 我在网上找了各种资料&#xff0c;都是要先确定springcloud版本&#xff0c;实际操作却可能由于版本或者镜像或者maven等问题报红&#xff0c;出现各种情况。 实际只需要指定特定版本号就行&#xff0c;添加下面两个依赖 <dependency><groupId>com.…

<uniapp><vuex><状态管理>在uniapp中,如何使用vuex实现数据共享与传递?

前言 本专栏是基于uniapp实现手机端各种小功能的程序&#xff0c;并且基于各种通讯协议如http、websocekt等&#xff0c;实现手机端作为客户端&#xff08;或者是手持机、PDA等&#xff09;&#xff0c;与服务端进行数据通讯的实例开发。 发文平台 CSDN 环境配置 系统&…

数据湖和数据仓库的区别

在当今数据驱动的时代&#xff0c;企业需要处理和存储海量数据。数据湖与数据仓库作为两种主要的数据存储解决方案&#xff0c;各自有其独特的优势与适用场景。本文将客观详细地介绍数据湖与数据仓库的基本概念、核心区别、应用场景以及未来发展趋势&#xff0c;帮助读者更好地…

【论文阅读 | AAAI 2025 | FD2-Net:用于红外 - 可见光目标检测的频率驱动特征分解网络】

论文阅读 | AAAI 2025 | FD2-Net&#xff1a;用于红外 - 可见光目标检测的频率驱动特征分解网络 1.摘要&&引言2. 方法2.1总体架构2.2特征分解编码器2.3多模态重建机制2.4训练损失 3.实验3.1实验设置3.2主要结果3.3消融研究 4.结论 题目&#xff1a;FD2-Net: Frequency-…

济南国网数字化培训班学习笔记-第三组-1-电力通信传输网认知

电力通信传输网认知 电力通信基本情况 传输介质 传输介质类型&#xff08;导引与非导引&#xff09; 导引传输介质&#xff0c;如电缆、光纤&#xff1b; 非导引传输介质&#xff0c;如无线电波&#xff1b; 传输介质的选择影响信号传输质量 信号传输模式&#xff08;单工…

OAT 初始化时出错?问题可能出在 PAM 配置上|OceanBase 故障排查实践

本文作者&#xff1a;爱可生数据库工程师&#xff0c;任仲禹&#xff0c;擅长故障分析和性能优化。 背景 某客户在使用 OAT 初始化OceanBase 服务器的过程中&#xff0c;进行到 precheck 步骤时&#xff0c;遇到了如下报错信息&#xff1a; ERROR - check current session ha…

1-机器学习的基本概念

文章目录 一、机器学习的步骤Step1 - Function with unknownStep2 - Define Loss from Training DataStep3 - Optimization 二、机器学习的改进Q1 - 线性模型有一些缺点Q2 - 重新诠释机器学习的三步Q3 - 机器学习的扩展Q4 - 过拟合问题&#xff08;Overfitting&#xff09; 一、…

Hass-Panel - 开源智能家居控制面板

文章目录 ▎项目介绍&#xff1a;预览图▎主要特性安装部署Docker方式 正式版Home Assistant Addon方式详细安装方式1. Home Assistant 插件安装&#xff08;推荐&#xff09;2. Docker 安装命令功能说明 &#xff1a;3. Docker Compose 安装升级说明Docker Compose 版本升级 功…

Ubuntu搭建NFS服务器的方法

0 工具 Ubuntu 18.041 Ubuntu搭建NFS服务器的方法 在Ubuntu下搭建NFS&#xff08;网络文件系统&#xff09;服务器可以让我们像访问本地文件一样访问Ubuntu上的文件&#xff0c;例如可以把开发板的根文件系统放到NFS服务器目录下方便调试。 1.1 安装nfs-kernel-server&#…

网感驱动下开源AI大模型AI智能名片S2B2C商城小程序源码的实践路径研究

摘要&#xff1a;在数字化浪潮中&#xff0c;网感已成为内容创作者与商业运营者必备的核心能力。本文以开源AI大模型、AI智能名片及S2B2C商城小程序源码为技术载体&#xff0c;通过解析网感培养与用户需求洞察的内在关联&#xff0c;提出"数据驱动-场景适配-价值重构"…

COMPUTEX 2025 | 广和通5G AI MiFi解决方案助力移动宽带终端迈向AI新未来

随着5G与AI不断融合&#xff0c;稳定高速、智能的移动网络已成为商务、旅行、户外作业等场景的刚需。广和通5G AI MiFi方案凭借领先技术与创新设计&#xff0c;重新定义5G移动网络体验。 广和通5G AI MiFi 方案搭载高通 4nm制程QCM4490平台&#xff0c;融合手机级超低功耗技术…

防范Java应用中的恶意文件上传:确保服务器的安全性

防范Java应用中的恶意文件上传&#xff1a;确保服务器的安全性 在当今数字化时代&#xff0c;Java 应用无处不在&#xff0c;而文件上传功能作为许多应用的核心组件&#xff0c;却潜藏着巨大的安全隐患。恶意文件上传可能导致服务器被入侵、数据泄露甚至服务瘫痪&#xff0c;因…

STM32H7时钟树

时钟树分析 STM32H7共有6个外部时钟源,分别是&#xff1a; HSI&#xff08;高速内部振荡器&#xff09;时钟&#xff1a;~ 8 MHz、16 MHz、32 MHz 或 64 MHzHSE&#xff08;高速外部振荡器&#xff09;时钟&#xff1a;4 MHz 到 48 MHzLSE&#xff08;低速外部振荡器&#xff…