持久层框架之Mybatis

news2025/2/25 15:31:36

概述

  • MyBatis是apache的一个开源项目iBatis,2010年改名为MyBatis,2013年11月迁移到Github
  • MyBatis是一款优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码
  • Mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回
  • MyBatis支持自定义SQL、存储过程以及高级映射

执行流程原理

  • 读取MyBatis的配置文件: mybatis-config.xml为MyBatis的全局配置文件,用于配置数据库连接信息
  • 加载映射文件: 映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表
  • 构造会话工厂: 通过MyBatis的环境配置信息构建会话工厂SqlSessionFactory
  • 创建会话对象: 由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法
  • Executor执行器: MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护
  • MappedStatement对象: 在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息
  • 输入参数映射: 输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程
  • 输出结果映射: 输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程

SQL映射文件(开发中关注的核心)

可参考官网:mybatis – MyBatis 3 | XML 映射器

MyBatis分页插件PageHelper

导入Maven依赖包

<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper</artifactId>
	<version>${pagehelper.version}</version>
</dependency>

<!--pageHelper使用了springboot的自动装配功能,
springboot启动时自动装配pageHelper相关的bean,所以在开发时无需手动添加任何注解,
spring.factories文件配置了自动配置类,Springboot启动时自动加载该对象到容器中 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-autoconfigure</artifactId>
    <version>${pagehelper-spring-boot-autoconfigure.version}</version>
</dependency>

<!--pagehelper-spring-boot-starter启动包,
该包通过spring.provides配置文件把需要依赖的相关Jar包导入的工程中。
因此在springboot工程中只需要把pagehelper-spring-boot-starter引入即可,相关Jar包会自动导入
provides内容: pagehelper-spring-boot-autoconfigure,pagehelper,mybatis-spring-boot-autoconfigure,mybatis,mybatis-spring;
实际上这个启动包非必要的,可要直接引入相关的jar即可
 -->
<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper-spring-boot-starter</artifactId>
	<version>${pagehelper-spring-boot-starter.version}</version>
</dependency>

启用分页(PageHelper会自动拼接sql查询数据)

核心类就是PageHelper和PageInfo

PageHelper.startPage(pageNum,pageSize);//设置分页属性pageNum(第几页)和pageSize(每页显示的条数)
List<Users> list = userMapper.getUserList();//查询总数
PageInfo<Users> pageInfo = new PageInfo<>(list);//把查询到的结果封装到PageInfo类中

SpringBoot整合MyBatis

可参考该博文:Spring Boot 整合 Mybatis 实践教程(干货) - 知乎 (zhihu.com)[目前公司微服务应用整合Mybatis过程和该博文介绍基本一致]

其他

JDBC VS MyBatis

传统方式JDBC访问数据库特点

  • 使用JDBC访问数据库有大量重复代码(如注册驱动、获取连接、获取传输器、释放资源等)
  • JDBC自身没有连接池,会频繁的创建连接和关闭连接,效率低
  • SQL是写死在程序中,一旦修改SQL,需要对类重新编译
  • 对查询SQL执行后返回的ResultSet对象,需要手动处,有时会特别麻烦

mybatis框架访问数据库的特点

  • Mybatis对JDBC对了封装,可以简化JDBC代码
  • Mybatis自身支持连接池(也可以配置其他的连接池),因此可以提高程序的效率
  • Mybatis是将SQL配置在mapper文件中,修改SQL只是修改配置文件,类不需要重新编译
  • 对查询SQL执行后返回的ResultSet对象,Mybatis会帮我们处理,转换成Java对象
  • JDBC中所有的问题(代码繁琐、有太多重复代码、需要操作太多对象、释放资源、对结果的处理太麻烦等)在Mybatis框架中几乎都得到了解决

Hibernate VS MyBatis 

  • ORM指的是对象关系映射,是一种持久化技术,将面向对象程序中的对象持久化到数据库中的技术; Hibernate和Mybatis属于ORM框架
  • Hibernate比较复杂、庞大,学习周期较长; Mybatis主要依赖于sql的书写,让开发者感觉更熟悉
  • Hibernate与数据库具体的关联都在XML中,适用于不同的数据库; Mybatis依赖数据库编写SQL,所以扩展性、迁移性比较差
  • 如果直接操作数据库表,没有过多的定制,建议使用Hibernate方式; 如果要灵活使用SQL语句,建议采用MyBatis方式

业务批量操作最佳实践

批量新增

<insert id="batchSave" parameterType="java.util.List">
insert into User(title,content) values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.title},#{item.content})
</foreach>
</insert>
<!-- 参数类型是List<User>,实体集合 -->
  • MyBatis利用For循环批量插入: 一万条数据总耗时:26348ms
  • MyBatis以集合方式(xml中采用<foreach>)批量新增(推荐): 一万条数据总耗时:521ms
  • MyBatis-Plus提供的SaveBatch方法: 一万条数据总耗时:24674ms,该问题解决方案可以在数据库配置的uri后面加上该属性后启用批量更新语句的优化rewriteBatchedStatements=true,可以将耗时降低为500ms

批量更新

<update id="batchUpdate" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update User
<set>
title = #{item.title}, content = #{item.content}
</set>
where id = #{item.id}
</foreach>
</update>
<!-- 参数类型是List<User>,实体集合 -->

批量删除

<delete id="batchDel" parameterType="java.util.List">
delete from User where id in
<foreach collection="list" index="index" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</delete>
<!-- 参数类型是List<String>,id集合 -->

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

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

相关文章

软件设计模式系列之二——抽象工厂模式

1 抽象工厂模式的定义 抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一种创建一组相关或相互依赖对象的方式&#xff0c;而无需指定它们的具体类。该模式以一组抽象接口为核心&#xff0c;包括抽象工厂接口和一组抽象产品接口&#xff0c;每个具体工厂类负责创建特定…

More Effective C++学习笔记(5)

目录 条款25&#xff1a;将构造函数和非成员函数虚化条款26&#xff1a;限制某个类所能产生的对象数量条款27&#xff1a;要求&#xff08;或禁止&#xff09;对象产生于heap&#xff08;堆&#xff09;之中条款28&#xff1a;智能指针条款29&#xff1a;引用计数条款30&#x…

uview indexList 按字母跳转不了

点击字母跳转不到位的问题&#xff1a;在<u-index-list>添加方法select“clickSelect“ 锚点要加id&#xff0c;用对应的字母做为id值&#xff0c; <u-index-anchor :id"key" :index"key"/> <template><view><view class&qu…

法国新法案强迫 Firefox 等浏览器审查网站

导读Mozilla 基金会已发起了一份请愿书&#xff0c;旨在阻止法国政府强迫 Mozilla Firefox 等浏览器审查网站。 据悉&#xff0c;法国政府正在制定一项旨在打击网络欺诈的 SREN 法案 (“Projet de loi Visant scuriser et reguler lespace numrique”)&#xff0c;包含大约 2…

将本地jar包手动添加到Maven仓库依赖处理

一、起因 在日常开发中&#xff0c;经常会遇到一些情况&#xff0c;就是在更新Maven时&#xff0c;从网上下载jar包的时候网络不稳定或者其他原因导致jar包数据缺失而导致的依赖无法正常引入的情况. 还有一些其他情况如个人jar包一类的。 二、解决 以前以上这些情况&#x…

三维模型3DTile格式轻量化压缩处理效率提高的技术方浅析

三维模型3DTile格式轻量化压缩处理效率提高的技术方浅析 随着三维模型在各个领域的广泛应用&#xff0c;对于其格式的轻量化压缩处理和效率提高的需求也越发迫切。本文将介绍一些技术方法&#xff0c;帮助实现三维模型3DTile格式的轻量化压缩处理并提高处理效率。 首先&#x…

手写Spring:第14章-自动扫描Bean对象注册

文章目录 一、目标&#xff1a;自动扫描Bean对象注册二、设计&#xff1a;自动扫描Bean对象注册三、实现&#xff1a;自动扫描Bean对象注册3.0 引入依赖3.1 工程结构3.2 Bean生命周期中自动加载包扫描注册Bean对象和设置占位符属性类图3.3 主力占位符配置3.4 定义拦截注解3.4.1…

从零到MySQL性能优化大师

一.MySQL架构 二.优化与执行 执行计划是MySQL优化器为了优化查询而生成的一种数据结构&#xff0c;它记录了数据库系统执行查询时所采取的操作流程&#xff0c;即对查询语句的各部分如何进行处理以最终得到查询结果的过程。执行计划通常被表示为一棵树状结构&#xff0c;节点代…

编程语言的类型划分

汇编语言 低级语言&#xff0c;通过汇编器翻译成机器语言 MOV、PUSH、ADD等 特点&#xff1a; 对机器友好、执行效率高、移植性差。 人类操作不太方便&#xff0c;需要专业人员。 高级语言 C、C、Java、Python、Golang等 最终还是会转化成为机器语言。 执行过程划分 编译型 ●…

华为云云耀云服务器L实例评测|使用Linux系统与Docker部署.net/c#项目

目录 前言 如何在CentOS运行项目 登录CentOS 使用Rider打包 使用Visual Studio打包 项目运行 后台运行 开放端口 如何在Docker中运行项目 项目运行 前言 本章详细介绍&#xff0c;.net Core项目从打包到部署上华为云云耀云服务器L实例的过程与一些细节问题。在这里…

XFF漏洞利用([SWPUCTF 2021 新赛]Do_you_know_http)

原理 常见的存在HTTP头注入的参数 User-Agent&#xff1a;使得服务器能够识别客户使用的操作系统&#xff0c;浏览器版本等.&#xff08;很多数据量大的网站中会记录客户使用的操作系统或浏览器版本等存入数据库中&#xff09; Cookie&#xff1a;网站为了辨别用户身份进行se…

前端js下载zip文件异常问题解决

目录 一&#xff0c;本文解决问题如下 二&#xff0c;原下载代码 1&#xff0c;ajax get 下载文件 2&#xff0c;下载异常图&#xff1a; 三&#xff0c;成功下载的 1&#xff0c; JQuery 实现文件下载xhr 2&#xff0c;图例 引言&#xff1a; 本人使用的ajax 下载&…

量化:基于支持向量机的择时策略

文章目录 参考机器学习简介策略简介SVM简介整体流程收集数据准备数据建立模型训练模型测试模型调节参数 参考 Python机器学习算法与量化交易 利用机器学习模型&#xff0c;构建量化择时策略 机器学习简介 机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。…

Mybatis日期检索格式报错

问题复现 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String ##…

适用于Linux的Windows子系统(PHP搭建lmap、redis、swoole环境)

目录 前言 一、Windows安装Linux子系统 二、Ubuntu搭建PHP开发环境 1.PHP 安装 2.Apache2 安装 3.MySQL安装 4.Redis安装 5.Swoole安装 总结 前言 系列分为三章&#xff08;从安装到项目使用&#xff09;&#xff1a; 一、适用于Linux的Windows子系统&#xff08;系统安装步骤…

提升你的Android开发技能:从AR/VR沉浸到UI设计和故障排除

文章目录 探索最新AR/VR应用在教育、游戏、医疗等领域的应用教育领域游戏领域医疗领域 深入了解Android内存管理与性能优化的方法与技巧垃圾回收机制内存泄漏使用弱引用避免过度渲染内存优化图像优化延迟加载Android中的调试技术应用程序分析 分享如何提高Android应用的易用性和…

服贸会2023 | 希尔贝壳入选“智赋百业”人工智能融合发展与安全应用典型案例

9月6日&#xff0c;服贸会&#xff08;中国国际服务贸易交易会&#xff09;“2023人工智能融合发展与安全应用”论坛在国家会议中心举行&#xff0c;论坛由国家工业信息安全发展研究中心、世界贸易网点联盟主办&#xff0c;旨在促进人工智能领域贸易合作&#xff0c;充分发挥人…

生动理解深度学习精度提升利器——测试时增强(TTA)

测试时增强&#xff08;Test-Time Augmentation&#xff0c;TTA&#xff09;是一种在深度学习模型的测试阶段应用数据增强的技术手段。它是通过对测试样本进行多次随机变换或扰动&#xff0c;产生多个增强的样本&#xff0c;并使用这些样本进行预测的多数投票或平均来得出最终预…

OpenCV(二十九):图像腐蚀

1.图像腐蚀原理 腐蚀操作的原理是将一个结构元素&#xff08;也称为核或模板&#xff09;在图像上滑动&#xff0c;并将其与图像中对应位置的像素进行比较。如果结构元素的所有像素与图像中对应位置的像素都匹配&#xff0c;那么该位置的像素值保持不变。如果结构元素的任何一个…

【软考】系统集成项目管理工程师(三)信息系统集成专业技术知识③

一、云计算 1、定义 通过互联网来提供大型计算能力和动态易扩展的虚拟化资源&#xff1b;云是网络、互联网的一种比喻说法。是一种大集中的服务模式。 2、特点 &#xff08;1&#xff09;超大规模&#xff08;2&#xff09;虚拟化&#xff08;3&#xff09;高可扩展性&…