Mybatis使用详解
简介
MyBatis是一款优秀的持久层框架,它支持普通SQL查询,存储过程和高级映射。MyBatis通过简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Ordinary Java Object,普通的Java对象)映射成数据库中的记录。MyBatis可以自动注册驱动、建立连接、获取SQL执行对象、释放连接等操作,开发人员只需要关注SQL语句的编写即可,无需过多关注数据库连接问题。
MyBatis的优势在于它通过参数映射方式,将参数灵活地配置在SQL语句中的配置文件中,避免了在Java类中配置参数。此外,MyBatis通过输出映射机制,将结果集的检索自动映射成相应的Java对象,避免了手工检索结果集。MyBatis还支持动态SQL,可以通过条件判断进行查询实现SQL复用。
主要特点
MyBatis的主要特点包括:
- 简单易用:MyBatis的API非常简单,易于学习和上手。
- 灵活性强:MyBatis允许开发人员自定义SQL语句,满足各种复杂的查询和数据操作需求。
- 映射关系自由:MyBatis不强制要求实体类和数据库表之间的映射关系,开发人员可以灵活选择使用注解或XML配置文件来管理映射关系。
- 与Spring等框架整合方便:MyBatis提供了与Spring、Spring Boot等框架整合的支持,可以轻松地将MyBatis与这些框架无缝集成。
- 易于扩展:MyBatis插件机制可以让开发者增加自定义的功能,扩展性非常强。
- 轻量级:MyBatis自身不依赖其他任何JAR,但需要提供JDBC实现。
- 学习成本低:相比ORM框架而言,掌握MyBatis的使用是很轻松的。
- SQL代码从程序代码中彻底分离出来,可重用:提供XML标签,支持编写动态SQL,提供映射标签,支持对象与数据库的ORM字段关系映射。
然而,MyBatis也有一些缺点,如SQL语句编写工作量大,熟练度要高;数据库移植性差,比如从MySQL移植到Oracle,SQL语句会有差异从而引起错误。
应用场景
MyBatis主要适用于以下应用场景:
- 对性能要求高的场景:例如互联网项目,MyBatis可以提供灵活的SQL映射和优化,满足高性能的需求。
- 需求变化较多的项目:MyBatis允许开发人员自定义SQL语句,可以根据需求灵活修改和优化SQL语句,适用于需求变化较多的项目。
- 数据库操作复杂的场景:MyBatis支持自定义SQL、存储过程以及高级映射,可以处理复杂的数据库操作和数据映射。
- 需要减少JDBC代码量的场景:MyBatis可以自动注册驱动、建立连接、获取SQL执行对象、释放连接等操作,减少了大量的JDBC代码,简化了数据库操作。
总的来说,MyBatis适用于各种基于Java的持久层应用,特别是需要高效、灵活地进行数据库操作的应用场景。
Mybatis的原理
MyBatis的工作原理主要包括以下几个步骤:
- 读取MyBatis配置文件:MyBatis的配置文件为mybatis-config.xml,其中包含了MyBatis的全局配置信息,如数据库连接信息等。
- 加载映射文件:mybatis-config.xml配置文件中可以加载多个映射文件,每个映射文件对应数据库中的一张表。
- 构造会话工厂:通过MyBatis的环境等配置信息,可以构建一个会话工厂SqlSessionFactory。
- 创建会话对象:由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。
- Executor执行器:MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
在输入参数映射过程中,MyBatis将参数映射到SQL语句中,类似于JDBC对preparedStatement对象设置参数的过程。在输出结果映射过程中,MyBatis将查询结果映射到Java对象,类似于JDBC对结果集的解析过程。
SpringBoot集成Mybatis
将MyBatis与Spring Boot集成是一种常见的做法,它可以让你的应用程序更加易于管理、可维护性和高效。以下是集成MyBatis与Spring Boot的步骤:
- 添加依赖:在Spring Boot项目的pom.xml文件中,添加MyBatis和MyBatis-Spring的依赖。
<dependencies><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency>
</dependencies>
- 配置数据源:在Spring Boot的application.properties或application.yml文件中,配置数据库连接信息。
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=rootpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- 创建实体类:根据数据库表结构,创建对应的Java实体类。
- 创建Mapper接口:为每个实体类创建一个Mapper接口,并使用@Mapper注解进行标注。
- 创建Mapper XML文件:在resources/mapper目录下,为每个Mapper接口创建一个对应的XML文件,并在其中编写对应的SQL语句。
- 创建Service类:创建一个Service类,注入Mapper接口,并实现业务逻辑。
- 创建Controller类:创建一个Controller类,处理前端请求,调用Service类的方法,并返回结果。
- 配置MyBatis扫描路径:在application配置类上添加@MapperScan注解,指定MyBatis的扫描路径。
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
通过以上步骤,你就可以将MyBatis与Spring Boot成功集成。在实际开发中,你可以根据需要进一步优化和扩展集成方案,例如使用注解配置SQL语句、使用MyBatis Plus简化开发等。
Mybatis的架构设计
MyBatis的架构设计主要包括以下几个层次:
- 接口层:这是MyBatis与数据库交互的方式。可以使用传统的MyBatis提供的API,通过创建SqlSession对象实现。此外,还可以使用Mapper接口,其中声明的方法和跟节点中的<select|update|delete|insert>节点项对应。
- 核心处理层:这一层主要负责处理MyBatis的核心逻辑,包括配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件等。
- 基础支持层:这一层为MyBatis提供了基础支持,包括数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换、日志模块、资源加载和解析器模块等。
此外,MyBatis的插件机制允许开发者通过继承Interceptor接口自定义拦截器,对SQL语句执行过程中的某一点进行拦截。MyBatis还采用了责任链模式,使得插件的开发和使用更加灵活。
MyBatis的架构设计使其易于使用和扩展,同时还能提供高效的数据库操作。
Mybatis的核心处理层
MyBatis的核心处理层是负责处理接口层传进来的指令,并将这些指令转换成SQL语句,然后执行相关SQL,并对结果集进行封装映射。这一层的主要任务包括SQL执行与结果集映射,由Executor负责维护缓存和事务管理,并将数据库操作委托给StatementHandler。
核心处理层的两个关键类是Configuration和Executor。Configuration持有了Mybatis运行期间所有的数据,包括SQL模板,结果集映射数据等。Executor负责维护缓存和事务管理,并将数据库操作委托给StatementHandler。
核心处理层的StatementHandler接口是MyBatis的核心接口之一,它完成了MyBatis中最核心的工作,也就是如何去与使用原生JDBC数据库进行交互。StatementHandler的功能包括创建对应的Statement对象,为SQL绑定实参,执行各种SQL语句,批量执行SQL语句,将结果集映射到结果对象等。
核心处理层还包括一些其他组件,如ParameterHandler负责完成SQL语句的实参绑定,ResultSetHandler负责处理结果集的映射等。这些组件协同工作,共同完成了MyBatis的核心处理任务。
MyBatis的核心处理层包括以下几个关键类:
- SqlSessionFactoryBuilder:每个MyBatis应用程序的入口。通过XML配置文件创建Configuration对象,然后通过build方法创建SqlSessionFactory对象。
- SqlSessionFactory:用于创建SqlSession的工厂。SqlSession是MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能。
- SqlSession:执行增删改查操作,管理事务。
- Executor:MyBatis执行器,是MyBatis调度的核心,负责SQL语句的生成和查询缓存的维护。
- StatementHandler:封装了JDBC Statement操作,负责对JDBC Statement的操作,如设置参数、将Statement结果集转换成List集合。
- ResultSetHandler:处理查询结果。
Mybatis的常用插件
MyBatis提供了多种常用的插件,以扩展其功能和性能。以下是一些常用的MyBatis插件:
- 全局通用操作插件:支持全局通用方法注入,如Write once, use anywhere,方便开发者在多个地方复用相同的代码。
- 分页插件:基于Mybatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于写基本List查询。
- 性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询问题。
- 全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作。
- 代码生成插件:mybatis-generator可以针对数据库表自动生成MyBatis执行所需要的代码(如Mapper.java、Mapper.xml、POJO)。
这些插件可以帮助开发者提高开发效率、优化数据库查询性能、增强代码安全性等。在实际开发中,可以根据需要选择合适的插件,以提升MyBatis的应用效果。
Mybatis插件原理
MyBatis的插件原理是基于JDK的动态代理和责任链模式实现的。
MyBatis允许使用插件来拦截四个核心对象:Executor、StatementHandler、ParameterHandler和ResultSetHandler。这四个对象在MyBatis的底层源码中被创建时,都会调用interceptor.plugin方法,这就是插件的切入点。
MyBatis的插件机制采用了JDK的动态代理,当这些对象被创建时,MyBatis会为他们生成代理对象。这些代理对象会增强原始对象的方法,实现在方法执行前后进行拦截的功能。这种机制类似于AOP(切面编程),可以在不修改原始代码的情况下,对方法的执行进行增强。
当代理对象的方法被调用时,会先执行插件的拦截逻辑,然后再执行原始对象的方法。插件的拦截逻辑可以根据需要进行定制,比如添加日志、性能监控、事务管理等。
总的来说,MyBatis的插件机制提供了一种灵活的方式来扩展和定制MyBatis的功能,使得开发者可以更加方便地使用MyBatis进行数据库操作。
相关文章:
Mybatis使用详解
简介 MyBatis是一款优秀的持久层框架,它支持普通SQL查询,存储过程和高级映射。MyBatis通过简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Ordinary Java Object,普通的Java对象)映射成数据…...
云原生周刊:Karmada 成为 CNCF 孵化项目 | 2023.12.25
开源项目推荐 kubernetes-reflector Reflector 是一个 Kubernetes 的插件,旨在监视资源(secrets 和 configmaps)的变化,并将这些变化反映到同一命名空间或其他命名空间中的镜像资源中。 Lingo Lingo 是适用于 K8s 的 OpenAI 兼…...

【开源】基于JAVA的学校热点新闻推送系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新闻留言模块2.4 新闻评论模块2.5 新闻收藏模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 新闻类型表3.2.2 新闻表3.2.3 新闻留言表3.2.4 新闻评论表3.2.5 新闻收藏表 四、系统展…...

Java基于TCP网络编程的群聊功能
服务端 import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List;public class Server2 {public static List<Socket> onlineList new ArrayList<>();public static void main(String[] args) throws Except…...
CentOS+ISCSI
九、配置iSCSI 添加1块大小为10G的虚拟硬盘; 安装iSCSI服务端targetcli; 使用新增加的硬盘创建卷组,名称为iscsivg,再创建iSCSI共享逻辑卷,逻辑 卷名称为iscsistore,大小为5G; 使用上述逻辑卷创建后端存储,名称为serverc.iscsistore; 定义iSCSI的IQN为iqn.2022-…...

RHCE9学习指南 第11章 网络配置
11.1 网络基础知识 一台主机需要配置必要的网络信息,才可以连接到互联网。需要的配置网络信息包括IP,子网掩码,网关和DNS。 11.1.1 IP地址 在计算机中对IP的标记使用的是32bit的二进制,例如, 11000000 10101000 00…...
Qt如何在控制台项目中使用opencv打开视频
Qt如何在控制台项目中使用opencv打开视频? 重要代码: 1、在pro文件中这样设置: QT - gui QT core widgets serialport 2、不要继承和使用:QCoreApplication #include pro文件: cpp QT - gui QT core widgets seria…...
Node.js 默认包管理器 npm 详解
目录 npm 概念 npm 命令 npm init npm install npm update npm uninstall npm search npm run other npm 安装 yarn npm 安装 yarn 和 npm 安装项目依赖 websocket 本质区别 npm 概念 npm(Node Package Manager)是一个用于管理 JavaScript 包…...
vue利用深拷贝解决修改不能取消的问题
vue利用深拷贝解决修改不能取消的问题 在对某数据进行修改时考虑还需要进行“确认”、“取消”操作,那么在取消时就需要返回保留的数据内容,那么如何将原有数据保留一份则是关键性问题。 显然修改值不能直接进行原值的赋值操作,因为这样无法取…...

MATLAB - 使用 YOLO 和基于 PCA 的目标检测,对 UR5e 的半结构化智能垃圾箱拣选进行 Gazebo 仿真
系列文章目录 前言 本示例展示了在 Gazebo 中使用 Universal Robots UR5e cobot 模拟智能垃圾桶拣选的详细工作流程。本示例提供的 MATLAB 项目包括初始化、数据生成、感知、运动规划和积分器模块(项目文件夹),可创建完整的垃圾桶拣选工作流…...

个性化定制的知识付费小程序,为用户提供个性化的知识服务,知识付费saas租户平台
明理信息科技知识付费saas租户平台 在当今数字化时代,知识付费已经成为一种趋势,越来越多的人愿意为有价值的知识付费。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。同时,开发和…...

基于flask和echarts的新冠疫情实时监控系统源码+数据库,后端基于python的flask框架,前端主要是echarts
介绍 基于flask和echarts的新冠疫情实时监控系统 软件架构 后端基于python的flask框架,前端主要是echarts 安装教程 下载到本地,在python相应环境下运行app.py,flask项目部署请自行完成 使用说明 flaskProject文件夹中 app.py是flask项目主运行文…...

总结js中遍历对象属性的方法
方法介绍 1、 forin循环:遍历对象自身的和原型链上的可枚举属性。 2、Object.getOwnPropertySymbols()方法:返回一个数组,包含对象自身的所有Symbol类型的属性。 3、 Object.getOwnPropertyNames()方法:返回一个数组࿰…...

编写fastapi接口服务
FastAPI是一个基于 Python 的后端框架,该框架鼓励使用 Pydantic 和 OpenAPI (以前称为 Swagger) 进行文档编制,使用 Docker 进行快速开发和部署以及基于 Starlette 框架进行的简单测试。 step1:安装必要库 pip install fastapi uvicorn st…...

RasaGPT对话系统的工作原理
RasaGPT 结合了 Rasa 和 Langchain 这 2 个开源项目,当超出 Rasa 现有意图(out_of_scope)的时候,就会执行 ActionGPTFallback,本质上就是利用 Langchain 做了一个 RAG,调用 LLM API。RasaGPT 涉及的技术栈比较多而复杂,…...

C++设计模式 #7 工厂方法(Factory Method)
“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持创建的稳定。它是接口抽象之后的第一步工作。 动机 在软件系统中,经常面临着创…...
信息网络协议基础-接入网技术
文章目录 概述***基于ATM架构虚电路PVC和SVC信元格式为什么信元格式由AAL决定?网络架构传统电信网络:点对点链路PPP协议协议内容消息过程多协议封装功能电话网接入Internet(DSL 数字用户线路)主要接入技术ADSL关键技术DMTDSLAM体系结构PPPOE帧格式过程特点局域网定义参考模型L…...
springboot 自动装配原理
在理解springboot自动装配之前需要了解spring的Configuration原理和Conditional两个注解原理。可以看下以前写的这两篇文章 spring 源码阅读之Configuration解析 spring使用Conditional进行条件装配 spring的SPI机制之使用SpringFactoriesLoader加载服务实现 SpringBootApp…...
前端---表格标签
1. 表格的结构 表格是由行和列组成,好比一个excel文件 2. 表格标签 <table>标签:表示一个表格 <tr>标签:表示表格中的一行 <td>标签:表示表格中的列<th>标签:表示表格中的表头 示例代码: &l…...

【软件工程】可执行文件和数据分离
一、概述 可执行文件和数据分离是一种软件设计策略,旨在将程序代码和程序使用的数据分离存储。这种方法通常用于提高软件的模块化程度和灵活性,以及方便软件的管理和维护。 在可执行文件和数据分离中,程序代码通常以可执行文件的形式存储&a…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...

数据分析六部曲?
引言 上一章我们说到了数据分析六部曲,何谓六部曲呢? 其实啊,数据分析没那么难,只要掌握了下面这六个步骤,也就是数据分析六部曲,就算你是个啥都不懂的小白,也能慢慢上手做数据分析啦。 第一…...