【Spring Boot】数据库持久层框架MyBatis — MyBatis简介

news2025/1/23 17:40:52

MyBatis简介

本节首先会介绍什么是ORM、什么是MyBatis、MyBatis的特点以及核心概念,最后介绍MyBatis是如何启动、如何加载配置文件的?

1.什么是ORM

ORM(Object Relational Mapping,对象关系映射)是为了解决面向对象与关系数据库存在的互不匹配现象的一种技术。简单地说,ORM通过使用描述对象和数据库之间映射的元数据将程序中的对象自动持久化到关系数据库中。

当我们开发应用程序时,需要编写大量的数据访问层代码,用来操作数据库中的数据,这些代码要么是大量重复的代码,要么操作特别烦琐。针对这些问题,ORM提供了完善的解决方案,简化了将对象持久化到关系数据库中的操作。

ORM框架的本质是简化编程中操作数据库的编码,Java领域发展到现在,ORM框架层出不穷,但是,基本上还是Hibernate和Mybatis两个比较流行并被广泛使用。

Hibernate:全自动的框架,强大、复杂、笨重、学习成本较高。

Mybatis:半自动的框架(需要开发者了解数据库),必须要自己写SQL。

Hibernate宣称可以不用写一句SQL,而MyBatis以动态SQL见长,两者各有特点,开发者可以根据需求灵活使用。

有一个有趣的现象:传统企业大多喜欢使用Hibernate,而互联网行业则通常使用MyBatis。

2.什么是MyBatis

MyBatis是一款优秀的数据持久层ORM框架,被广泛地应用于应用系统。最早是Apache的一个开源项目iBatis,2010年这个项目由Apache Software Foundation迁移到了Google Code,并且改名为MyBatis,2013年11月又迁移到了GitHub。

MyBatis支持定制化的SQL、存储过程和高级映射,能够非常灵活地实现动态SQL,可以使用简单的XML或注解来配置和映射原生信息,能够轻松地将Java的POJO(Plain Ordinary Java Object,普通的Java对象)与数据库中的表和字段进行映射关联。

MyBatis作为一款使用广泛的开源软件,它的特点如下:

易学易用,没有任何第三方依赖。

SQL被统一提取出来,便于统一管理和优化。

SQL和代码解耦,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易进行单元测试。

灵活动态的SQL,支持各种条件来动态生成不同的SQL。

提供映射标签,支持对象与数据库的ORM关系映射。

提供对象关系映射标签,支持对象关系组件维护。

3.MyBatis的核心概念

MyBatis由Mapper配置文件、Mapper接口、执行器、会话等组件组成。下面就来介绍这些非常重要的组件和概念。

1)Mapper配置文件:可以使用基于XML的Mapper配置文件来实现,也可以使用基于Java注解的MyBatis注解来实现,甚至可以直接使用MyBatis提供的API来实现。

2)Mapper接口:是指自定义的数据操作接口,类似于通常所说的DAO接口。早期的Mapper接口需要自定义去实现,现在MyBatis会自动为Mapper接口创建动态代理对象。Mapper接口的方法通常与Mapper配置文件中的select、insert、update、delete等XML节点一一对应。

3)Executor(执行器):MyBatis中所有SQL语句的执行都是通过Executor进行的,Executor是MyBatis的一个核心接口。

4)SqlSession(会话):MyBatis的关键对象,类似于JDBC中的连接(Connection),SqlSession对象完全包含数据库相关的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句。

5)SqlSessionFactory(会话工厂):MyBatis的关键对象,它是单个数据库映射关系经过编译后的内存镜像。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得。

6)SqlSessionFactoryBuilder构建器:用于解析配置文件,包括属性配置、别名配置、拦截器配置、数据源和事务管理器等,可以从XML配置文件或一个预定义的配置实例进行构建。

4.MyBatis的启动流程

MyBatis的使用虽然简单,但是,它属于高度封装的框架,因此,我们必须熟悉MyBatis的启动和执行过程。具体的工作流程如图所示。

在这里插入图片描述

1)加载Mapper配置的SQL映射文件,或者注解的相关SQL内容。

2)创建会话工厂。MyBatis通过读取配置文件的数据源信息来构造会话工厂(SqlSessionFactory)。

3)创建会话。MyBatis可以通过会话工厂来创建会话对象(SqlSession),会话对象是一个接口,该接口中包含对数据库操作的增、删、改、查方法。

4)创建执行器。因为会话对象本身不能直接操作数据库,所以它使用了一个叫作数据库执行器(Executor)的接口来帮它执行操作。

5)封装SQL对象。在这一步,执行器将待处理的SQL信息封装到一个对象(MappedStatement)中,该对象包括SQL语句、输入参数映射信息(Java简单类型、HashMap或POJO)和输出结果映射信息。

6)操作数据库。拥有了执行器和SQL信息封装对象就可以使用它们访问数据库,最后返回操作结果,结束流程。

总结起来,MyBatis主要有两大核心组件:SqlSessionFactory和Mapper。SqlSessionFactory负责创建数据库会话,Mapper主要提供SQL映射。

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

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

相关文章

抖音创作服务平台发布作品

最近分析了一下抖音创作服务平台发布作品的步骤 获取密钥等参数通过密钥等参数获取到上传视频需要的参数上传视频发布作品 需要的一些参数有a_bogus Signature crc32等 目前还没有校验a_bogus 只需要传入Cookie以及视频即可发布

C语言sscanf函数学习

sscanf()与scanf()相比&#xff0c;scanf()以键盘(stdin)为输入源&#xff0c;sscanf()以第一个参数的固定字符串为输入源&#xff1b; sscanf()的头文件是 #include <stdio.h>&#xff1b; 函数原型&#xff1a; int sscanf (char *str, char * format [, argument, ..…

纸贵科技连续三年蝉联IDC中国 FinTech 50榜单

近日&#xff0c;国际权威市场研究机构IDC公布了“2023 IDC中国FinTech 50榜单”。作为领先的区块链技术和解决方案服务商&#xff0c;纸贵科技凭借过硬的区块链技术和丰富的金融科技创新成果&#xff0c;连续第三年荣登IDC中国FinTech 50榜单。 IDC中国FinTech 50榜单是金融科…

广告电商模式

电商越来越渗透进我们的生活之中&#xff0c;网上医疗&#xff0c;网上订购电影票&#xff0c;车票等&#xff0c;未来绝不仅仅是网购这么简单&#xff0c;电商行业以后会与生活的方方面面更加精密结合在一起。因此&#xff0c;电商销售的发展是持续增长的&#xff0c;现在很多…

Oracle 查询(当天,月,年)的数据

Trunc 在oracle中&#xff0c;可利用 trunc函数 查询当天数据&#xff0c;该函数可用于截取时间或者数值&#xff0c;将该函数与 select 语句配合使用可查询时间段数据 查询当天数据 --sysdate是获取系统当前时间函数 --TRUNC函数用于截取时间或者数值&#xff0c;返回指定的…

[线程/C++(11)]线程池

文章目录 一、C实现线程池1. 头文件2. 测试部分 二、C11实现线程池1. 头文件2. 测试部分 一、C实现线程池 1. 头文件 #define _CRT_SECURE_NO_WARNINGS #pragma once #include<iostream> #include<string.h> #include<string> #include<pthread.h> #…

vue学习之热更新、单文件开发、插槽、作用域插槽

vue-cli 全局安装&#xff1a;-g&#xff0c;全局安装 vue-cli npm install -g vuecli 创建项目 vue create my-app 生成的文件结构&#xff1a; node-modules: 存放依赖src&#xff1a;源代码文件夹src- components&#xff1a;存放组件的位置 将上一篇中我们html的文件…

【SpringCloud技术专题】「Gateway网关系列」(1)微服务网关服务的Gateway组件的原理介绍分析

为什么要有服务网关? 我们都知道在微服务架构中&#xff0c;系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;难道要一个个的去调用吗&#xff1f;很显然这是不太实际的&#xff0c;我们需要有一个统一的接口与这些微服务打交道&#xf…

Android JNI系列详解之CMake配置库文件的输出目录

一、前提 阅读上一篇文章Android JNI系列详解之CMake编译工具的使用&#xff0c;里面讲到了需要配置两个文件&#xff1a;CMakeList.txt和build.gradle 二、配置CMake编译工具输出库文件的路径 1.默认的库文件输出路径&#xff1a;app/build/intermediates/cmake/debug/obj 由此…

springboot整合rabbitmq发布确认高级

在生产环境中由于一些不明原因&#xff0c;导致 rabbitmq 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c;导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们如何才能进行 RabbitMQ 的消息可靠投递。 发布确认 发布确认方案 架构 配置…

poi带表头多sheet导出

导出工具类 package com.hieasy.comm.core.excel;import com.hieasy.comm.core.excel.fragment.ExcelFragment; import com.hieasy.comm.core.utils.mine.MineDateUtil; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import org.apache.po…

android studio安装教程

1、android studio 下载 下载网址&#xff1a;Download Android Studio & App Tools - Android Developers 2、开始安装 因为不需要每次连接手机进行调试&#xff0c;android studio给我们提供了模拟器调试环境。 一般选择自定义安装&#xff0c;这样可选sdk以及下载路径…

IT运维:使用数据分析平台监控 Kafka 服务

Apache Kafka 是由 LinkedIn 开发&#xff0c;并于2011年开源的分布式消息队列服务。但是通过快速持续的演进&#xff0c;目前它发展成为成熟的事件流处理平台&#xff0c;可用于大规模流处理、实时数据管道和数据集成等场景。 Kafka 的服务端组件包括一个或者多个 broker。Bro…

视频云存储/安防监控AI视频智能分析平台——智慧煤矿解决方案

一、方案背景 煤矿业是一个高风险行业&#xff0c;存在着许多潜在的安全隐患和风险。互联网、物联网、人工智能等新兴技术高速发展&#xff0c;为传统行业带来颠覆性变革&#xff0c;将高新技术与传统技术装备、管理相融合&#xff0c;实现产业转型升级已经成为煤矿行业发展趋…

【0824作业】C++ 拷贝赋值函数、匿名对象、友元、常成员函数和常对象、运算符重载

一、思维导图 二、作业&#xff1a;实现关系运算符的重载 关系运算符重载 概念&#xff1a; 种类&#xff1a;>、>、< 、< 、 、!表达式&#xff1a;L#R (L表示左操作数&#xff0c;R表示有操作数&#xff0c;#表示运算符)左操作数&#xff1a;既可以是左值也可以…

BSN与中国食品药品企业质量安全促进会达成战略合作协议

2023年8月18日至20日&#xff0c;“首届中国食品药品医疗器械化妆品高质量发展大会”在北京召开&#xff0c;本届大会以“树立新发展理念&#xff0c;服务构建新发展格局&#xff0c;助力食药行业高质量发展”为主题&#xff0c;聚焦食药监管和行业发展的热点、难点问题&#x…

R语言主成分分析

R语言主成分分析 之前介绍过怎么用SPSS进行主成分分析(PCA)&#xff0c;已经忘了的朋友们可以到主页看看 今天主要介绍下R语言主成分分析的几种方法。都是入门级别&#xff0c;跟着我一步步走&#xff0c;一点都不难哈~ 首先调用R语言自带的数据集&#xff0c;USArrests。这…

嵌入式linux之QT交叉编译环境搭建(最简单实测通用版)

这里总结下用于嵌入式linux下的QT交叉编译环境搭建&#xff0c;留作备忘&#xff0c;分享给有需要的小伙伴。不管你的是什么嵌入式linux环境&#xff0c;实测过的通用方法总结。 环境准备 需要准备的环境要求如下&#xff1a; 1.虚拟机(vmvare15.5) 2.ubuntu18.04-x64的linu…

4.网络设计与redis、memcached、nginx组件(一)

网络组件系列文章目录 第四章 网络设计与redis、memcached、nginx组件 文章目录 网络组件系列文章目录文章的思维导图前言一、网络相关的问题&#xff0c;网络开发中要处理那些问题&#xff1f;网络操作IO连接建立连接断开消息到达消息发送网络操作IO特性 二、网络中IO检测IO函…

【Java】基础练习(十一)

1.Poker 定义两个数组&#xff0c;一个数组存储扑克牌花色&#xff0c;另一个数组存储扑克牌&#xff08;A~K&#xff09;&#xff0c;输出52张扑克牌&#xff08;除大小王&#xff09; ♥A、♥2...&#xff08;1&#xff09;Poker类&#xff1a; package swp.kaifamiao.cod…