MyBatis的基本概念和核心组件
MyBatis的基本概念
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录
MyBatis的特点
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的ORM字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
- 提供xml标签,支持编写动态sql
MyBatis架构
我们把MyBatis架构分为三层
- API接口层的主要作用
- 定义接口方法:API接口层主要用于定义与数据库交互的方法。通常,每个接口方法对应一条SQL语句或一组相关的SQL语句,用于执行查询、插入、更新或删除等数据库操作
- 参数传递:API接口层可以定义方法的输入参数,用于传递查询条件、更新数据等操作所需的参数。MyBatis提供了各种方式来传递参数,包括基本类型、对象、Map等。
- 结果映射:API接口层可以定义方法的返回类型,用于接收数据库操作的结果。MyBatis支持将查询结果映射为Java对象或集合,并提供了丰富的结果映射规则和配置方式。
- SQL语句映射:API接口层可以通过注解或XML配置的方式,将SQL语句与接口方法进行映射。这样,在调用接口方法时,MyBatis会自动执行对应的SQL语句,并将结果返回给调用方。
- 事务支持:API接口层可以通过注解或XML配置的方式,添加事务的支持。这样,在接口方法执行期间,可以保证数据库操作的原子性,保证数据的一致性和完整性。
- 数据处理层的主要作用
- 定义映射关系:数据处理层使用映射文件或注解来定义数据库表与Java实体对象的映射关系。这些映射关系包括表名、字段名、主键、关联关系等。通过定义映射关系,MyBatis可以将查询结果自动映射为Java对象。
- 编写SQL语句:数据处理层使用SQL语句来执行数据库的增删改查操作。SQL语句可以使用MyBatis提供的映射文件或注解来定义,也可以使用动态SQL来实现灵活的条件查询。SQL语句可以包括普通的SQL语句、参数占位符、动态条件等。
- 执行数据库操作:数据处理层使用Mapper接口来执行数据库操作。Mapper接口定义了与数据库操作相关的方法,例如插入数据、更新数据、删除数据、查询数据等。通过调用Mapper接口的方法,可以执行对应的SQL语句并返回结果
- 事务管理:数据处理层可以通过注解或配置文件来管理事务。在需要保证多个数据库操作的原子性时,可以使用事务管理来确保数据的一致性和完整性。MyBatis提供了多种方式来配置和管理事务,例如使用注解、使用AOP、使用XML配置等。
- 基础支撑层的主要作用
- 数据源管理:基础支撑层负责管理应用程序连接数据库的数据源。它可以配置和管理连接池,提供数据库连接的分配和释放,以及数据库事务的管理等。
- SQL语句执行:基础支撑层提供了执行SQL语句的能力。它负责将SQL语句和参数传递给数据库,并获取执行结果。它还负责处理SQL语句的预编译、占位符替换、结果集的映射等操作。
- 对象-关系映射:基础支撑层负责将数据库中的记录映射为Java对象。它可以根据配置或注解,自动将查询结果集映射为Java对象,并提供对象与数据库记录之间的转换功能。
- 缓存管理:基础支撑层提供了缓存机制,用于提高数据库访问性能。它可以缓存查询结果,避免重复访问数据库,提高响应速度。MyBatis提供了不同级别的缓存配置,包括一级缓存和二级缓存。
- 异常处理:基础支撑层处理数据库操作过程中可能出现的各种异常,如数据库连接异常、SQL语句执行异常、事务回滚等。它负责将异常转换为可读的错误信息,并提供异常处理机制。
MyBatis核心组件
- SqlSessionFactory:SqlSessionFactory是MyBatis的核心接口之一,它负责创建SqlSession对象。SqlSession是与数据库交互的主要入口,通过SqlSessionFactory可以获取SqlSession实例,然后进行数据库操作。
- SqlSession:SqlSession是MyBatis与数据库交互的关键组件,它提供了执行SQL语句、获取映射器(Mapper)、管理事务等功能。通过SqlSession,可以执行数据库的增删改查操作,并获取操作结果。
- SqlSession:SqlSession是MyBatis与数据库交互的关键组件,它提供了执行SQL语句、获取映射器(Mapper)、管理事务等功能。通过SqlSession,可以执行数据库的增删改查操作,并获取操作结果。
- 映射器(Mapper):映射器是MyBatis实现动态代理的核心组件。MyBatis通过JDK动态代理或CGLIB动态代理,根据定义的Mapper接口,动态生成代理类,实现接口方法的具体逻辑。通过映射器,可以将Java对象与数据库记录进行映射,实现对象关系映射。
- Configuration配置对象:Configuration对象是MyBatis的配置文件解析和存储的核心组件。它负责解析MyBatis的配置文件,包括数据库连接信息、映射文件路径、插件、类型处理器等配置信息。MyBatis根据Configuration对象的配置,完成MyBatis的初始化和功能扩展。
- Executor执行器:Executor执行器是MyBatis执行SQL语句的核心组件。它负责根据SQL语句、参数和映射规则,将SQL语句发送到数据库,并获取结果。Executor可以分为SimpleExecutor、ReuseExecutor和BatchExecutor等类型,用于不同的场景和需求。
相关文章:
MyBatis的基本概念和核心组件
MyBatis的基本概念 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Pla…...
sql update执行返回0,能否判断数据不存在
答案:不能。 update执行返回0的情况 1、没有找到需要更新的数据,就是这条记录不存在 例如:where后面的条件是id0,那这条记录肯定是不存在的,返回结果是0 2、更新时的数据和要更新的数据完全一致时 例如:更…...
数据分析 | 调用Optuna库实现基于TPE的贝叶斯优化 | 以随机森林回归为例
1. Optuna库的优势 对比bayes_opt和hyperoptOptuna不仅可以衔接到PyTorch等深度学习框架上,还可以与sklearn-optimize结合使用,这也是我最喜欢的地方,Optuna因此特性可以被使用于各种各样的优化场景。 2. 导入必要的库及加载数据 用的是sklea…...
stm32单片机开关输入控制蜂鸣器参考代码(附PROTEUS电路图)
说明:这个buzzer的额定电压需要改为3V,否则不会叫,源代码几乎是完全一样的 //gpio.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file gpio.c* brief Thi…...
打印X型的图案
int main() {int n0;int i0;int j0;scanf("%d",&n);for(i0;i<n;i){for(j0;j<n;j){if(ij){printf("*");}else if((ij)n-1){printf("*");}elseprintf(" ");}printf("\n");}return 0; }...
不含数字的webshell绕过
异或操作原理 1.首先我们得了解一下异或操作的原理 在php中,异或操作是两个二进制数相同时,异或(相同)为0,不同为1 举个例子 A的ASCII值是65,对应的二进制值是0100 0001 的ASCII值是96,对应的二进制值是 0110 000…...
Mac上传项目源代码到GitHub的修改更新
Mac上传项目源代码到GitHub的修改更新 最近在学习把代码上传到github,不得不说,真的还挺方便 这是一个关于怎样更新项目代码的教程。 首先,在本地终端命令行打开至项目文件下第一步:查看当前的git仓库状态,可以使用git…...
Android6:片段和导航
创建项目Secret Message strings.xml <resources><string name"app_name">Secret Message</string><string name"welcome_text">Welcome to the Secret Message app!Use this app to encrypt a secret message.Click on the Star…...
ClickHouse AST is too big 报错问题处理记录
ClickHouse AST is too big 报错问题处理记录 问题描述问题分析解决方案1、修改系统配置2、修改业务逻辑 问题描述 项目中统计报表的查询出现 AST is too big 问题,报错信息如下: 问题分析 报错信息显示 AST is too big。 AST 表示查询语法树中的最大…...
DPDK系列之二十七DIDO
一、DIDO介绍 随着计算机技术发展,特别是应用技术的快速发展。应用场景对计算机的处理速度几乎已经到了疯狂的地步。说句大白话,再快的CPU也嫌慢。没办法,CPU和IO等技术基本目前都处在了瓶颈之处,大幅度提高,短时间内…...
《游戏编程模式》学习笔记(七)状态模式 State Pattern
状态模式的定义 允许对象在当内部状态改变时改变其行为,就好像此对象改变了自己的类一样。 举个例子 在书的示例里要求你写一个人物控制器,实现跳跃功能 直觉上来说,我们代码会这么写: void Heroine::handleInput(Input input…...
博客系统之功能测试
博客系统共有:用户登录功能、发布博客功能、查看文章详情功能、查看文章列表功能、删除文章功能、退出功能 1.登录功能: 1.1测试对象:用户登录 1.2测试用例 方法:判定表 用例 编号 操作步骤预期结果实际结果截图1 1.用户名正确…...
CJS和 ES6 的语法区别
CommonJS 使用 module.exports 导出模块。ES6 使用 export 导出模块。 示例代码: CommonJS(CJS)模块的导出: // 导出模块 module.exports {foo: bar,baz: function() {return qux;} }; ES6 模块的导出: // 导出模…...
ArcGIS Pro如何制作不规则形状图例
在默认的情况下,ArcGIS Pro生成的图例是标准的点、直线和矩形的,对于湖泊等要素而言,这样的表示方式不够直观,我们可以将其优化一下,制作不规则的线和面来代替原有图例,这里为大家介绍一下制作方法…...
微软Win11 Dev预览版Build23526发布
近日,微软Win11 Dev预览版Build23526发布,修复了不少问题。牛比如斯Microsoft,也有这么多bug,所以你写再多bug也不作为奇啊。 主要更新问题 [开始菜单] 修复了在高对比度主题下,打开开始菜单中的“所有应…...
【NEW】视频云存储EasyCVR平台H.265转码配置增加分辨率设置
关于视频分析EasyCVR视频汇聚平台的转码功能,我们在此前的文章中也介绍过不少,感兴趣的用户可以翻阅往期的文章进行了解。 安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求,让平台在内网、专网、VPN、广域网、互联网等各…...
【数据结构】如何用队列实现栈?图文详解(LeetCode)
LeetCode链接:225. 用队列实现栈 - 力扣(LeetCode) 本文默认读者已经掌握栈与队列的基本知识 或者先看我的另一篇博客:【数据结构】栈与队列_字节连结的博客-CSDN博客 做题思路 由于我们使用的是C语言,不能直接使用队…...
Linux 虚拟机Ubuntu22.04版本通过远程连接连接不上,输入ifconfig只能看到127.0.0.1的解决办法
之前给虚拟机配置静态IP之后,可以直接通过主机Vscode远程连接。但是前一段时间把主机的TCP/IPV4静态IP设置了一下之后,再连接虚拟机就连不上了,于是参考解决虚拟机不能上网ifconfig只显示127.0.0.1的问题,又可以连接上了ÿ…...
C语言刷题训练DAY.9
1.线段图案 解题思路: 这里非常简单,我们只需要用一个循环控制打印即可。 解题代码: #include<stdio.h> int main() {int n 0;while ((scanf("%d", &n)) ! EOF){int i 0;for (i 0; i < n; i){printf("*&…...
CTFHub php://input
1.首先看代码: 这里其实就应该想到的是php://伪协议: php://filter、php://input、php://filter用于读取源码 php://input用于执行php代码 2.其次,判断使用php://input伪协议 而执行php://input伪协议条件是allow_url_include是On 可以先利用…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...
