什么是MyBatis
MyBatis 简介
MyBatis 是一个流行的 Java 持久层框架(Persistence Framework),它主要用于简化数据库操作,提供了对数据库的映射支持,使得开发人员能够通过简单的配置和映射文件来执行数据库操作(如增、删、改、查等)。MyBatis 继承了传统的 JDBC 编程方式,但通过提供更高层次的抽象,简化了 SQL 执行的过程,避免了大量的样板代码。
主要特点
-
SQL 映射: MyBatis 允许开发人员在 XML 文件或注解中编写原生的 SQL 语句,并将它们与 Java 对象进行映射。
-
灵活性: 与 Hibernate 等 ORM(对象关系映射)框架不同,MyBatis 不会自动生成 SQL,而是让开发者直接编写 SQL 语句,从而提供了更大的灵活性。
-
性能: 因为开发人员手动编写 SQL,所以 MyBatis 在 SQL 执行的效率上能获得更多控制,避免了一些 ORM 框架自动生成的低效查询。
-
支持复杂查询: MyBatis 对于复杂查询非常友好,可以直接写 SQL,尤其是涉及多表连接、子查询等情况时,MyBatis 会更加灵活和高效。
-
支持缓存机制: MyBatis 提供了一级缓存和二级缓存的支持,能够提升查询效率。
MyBatis 组件
-
SqlSessionFactory: 负责创建
SqlSession
实例。通过读取配置文件来初始化数据库连接池以及相关设置。 -
SqlSession: 执行 SQL 操作的主要接口,负责执行增、删、改、查等操作,以及提交和回滚事务。
-
Mapper: Mapper 是一个接口,用于定义与数据库表相关的操作。开发人员可以通过接口方法来执行 SQL 操作,而 MyBatis 会根据 XML 配置文件或注解来自动生成具体的 SQL 执行语句。
-
映射文件(Mapper XML): 这是 MyBatis 的核心文件之一,它存储了 SQL 语句的映射。映射文件通常包括 SQL 语句和结果映射的配置。映射文件的每个
<mapper>
标签都对应一个接口,方法和 SQL 映射之间建立了关联。 -
动态 SQL: MyBatis 支持动态 SQL,可以根据不同条件生成不同的 SQL 语句,这对于复杂的查询场景特别有用。
-
插件: MyBatis 支持插件机制,开发人员可以通过自定义插件来扩展 MyBatis 的功能。例如,可以编写日志插件、性能监控插件等。
使用 MyBatis 的步骤
-
配置文件: 在 MyBatis 中,首先需要通过 XML 配置文件(通常是
mybatis-config.xml
)来设置数据库连接池、全局配置项等信息。 -
创建映射文件(Mapper XML): 你需要定义一个
Mapper
映射文件,用于将 SQL 语句与 Java 方法进行映射。每个映射文件对应一个 Mapper 接口,接口中的方法将映射到具体的 SQL 语句。 -
Mapper 接口: 创建一个 Java 接口,方法对应于数据库操作。这个接口会通过 MyBatis 生成的代理类来执行具体的 SQL 操作。
-
执行 SQL: 在代码中使用
SqlSession
来执行数据库操作,MyBatis 会根据映射文件中的 SQL 执行查询、插入、更新或删除操作。
代码示例
1. 配置文件 (mybatis-config.xml
)
<configuration><settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydb"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><mappers><mapper resource="com/example/mapper/UserMapper.xml"/></mappers>
</configuration>
2. 映射文件 (UserMapper.xml
)
<mapper namespace="com.example.mapper.UserMapper"><select id="getUserById" parameterType="int" resultType="com.example.model.User">SELECT * FROM users WHERE id = #{id}</select><insert id="insertUser" parameterType="com.example.model.User">INSERT INTO users (name, age) VALUES (#{name}, #{age})</insert>
</mapper>
3. Mapper 接口 (UserMapper.java
)
package com.example.mapper;import com.example.model.User;public interface UserMapper {User getUserById(int id);void insertUser(User user);
}
4. 使用 MyBatis 执行 SQL 操作
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class Main {public static void main(String[] args) {SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper userMapper = session.getMapper(UserMapper.class);User user = userMapper.getUserById(1);System.out.println(user);}}
}
总结
MyBatis 是一个非常灵活且强大的持久层框架,适用于那些希望精确控制 SQL 执行的 Java 开发者。它通过 SQL 映射的方式与数据库交互,可以根据实际需求编写高效、可维护的 SQL 代码,并且避免了 ORM 框架自动生成的低效查询。
相关文章:
什么是MyBatis
MyBatis 简介 MyBatis 是一个流行的 Java 持久层框架(Persistence Framework),它主要用于简化数据库操作,提供了对数据库的映射支持,使得开发人员能够通过简单的配置和映射文件来执行数据库操作(如增、删、…...
Docker如何运行一个Java的jar包程序
Docker如何运行一个Java的jar包程序 1、jar包程序 2、start.sh运行jar包脚本 #!/bin/bash #进入目录 cd /app #1.下载SDK并安装 java -jar SDKDown1.4.jar #2.加载环境变量 export LD_LIBRARY_PATH/opt/casb/CipherSuiteSdk_linux/lib echo $LD_LIBRARY_PATH #3.执行SDK java …...
c语言----顺序结构
顺序结构的基本概念 定义:顺序结构是C语言程序中最基本的结构,它按照语句的先后顺序依次执行。就像我们日常做事一样,一步一步地按照顺序来完成任务。在C语言程序中,从程序的第一条语句开始,逐句向下执行,…...
BERT采用双向训练
BERT采用双向训练 定义 BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer架构的预训练语言模型。它在自然语言处理(NLP)领域具有极其重要的地位,由谷歌在2018年提出,能够对文本进行深度的语义理解,从而广泛应用于各种语言相关的任务…...
流程引擎Activiti性能优化方案
流程引擎Activiti性能优化方案 Activiti工作流引擎架构概述 Activiti工作流引擎架构大致分为6层。从上到下依次为工作流引擎层、部署层、业务接口层、命令拦截层、命令层和行为层。 基于关系型数据库层面优化 MySQL建表语句优化 Activiti在MySQL中创建默认字符集为utf8&…...
安卓 文件管理相关功能记录
文件管理细分为图片、视频、音乐、文件四类 目录 权限 静态声明权限 动态检查和声明权限方法 如何开始上述动态申请的流程 提示 图片 获取图片文件的对象列表 展示 删除 视频 获取视频文件的对象列表 获取视频file列表 按日期装载视频文件列表 展示 播放 删除…...
监控视频汇聚融合云平台一站式解决视频资源管理痛点
随着5G技术的广泛应用,各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据,并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而,随着数字化建设和生产经营管理活动的长期开展࿰…...
【jvm】主要参数
Java 虚拟机(JVM)有许多参数用于控制其行为和性能,下面是一些 主要的 JVM 启动参数,这些参数通常分为以下几类: 内存管理相关参数 这些参数主要用来配置 JVM 的内存分配策略、堆内存、栈内存等。 -Xms 设置 JVM 启动…...
在Ubuntu中配置mysql,并允许外部访问数据库
在虚拟机中安装 MySQL 并允许外部访问,可以按照以下步骤操作: 1. 更新系统包 首先,确保你的系统是最新的,使用以下命令更新包列表: sudo apt update sudo apt upgrade2. 安装 MySQL Server 安装 MySQL 服务&#x…...
Golang的向前兼容性和toolchain规则,Go1.21.0
在 Go 1.21 中,在工具上新增了两个变化:增强了向前兼容性;工具链管理。 向前兼容性 在以前的版本中,Go 工具链尝试编译依赖于新版本的代码时,可能会遇到兼容性问题。例如,如果你的代码依赖于 Go 1.18 引入…...
如何有效修复ffmpeg.dll错误:一站式解决方案指南
当您遇到提示“ffmpeg.dll文件丢失”的错误时,这可能导致相关的应用程序无法启动或运行异常。本文将详细介绍如何有效地解决ffmpeg.dll文件丢失的问题,确保您的应用程序能够恢复正常运行。 ffmpeg.dll是什么?有哪些功能? ffmpeg.…...
更频繁的 Android SDK 发布:更快的创新、更高的质量和更完善
Android 一直致力于让创新更快地进入用户手中。除了每年的平台发布之外,我们还投资了Project Treble、Mainline、Google Play 服务、每月安全更新和季度发布,为 Pixel Drops 提供支持。 未来,Android 将更频繁地发布 SDK,计划于 …...
远程连接:构建智能家居舒适生活
远程连接技术让智能家居从梦想照进现实,为人们构建了舒适便捷的生活环境。通过家庭网络与各种智能设备的远程连接,用户可以在外出时,使用手机 APP 轻松控制家中的灯光、窗帘、空调、电视等设备。 例如,在炎热的夏天,下…...
Python 爬取网页文字并保存为 txt 文件教程
引言 在网络数据获取的过程中,我们常常需要从网页中提取有用的文字信息。Python 提供了强大的库来帮助我们实现这一目标。本教程将以https://theory.gmw.cn/2023 - 08/31/content_36801268.htm为例,介绍如何使用requests库和BeautifulSoup库爬取网页文字…...
多协议视频监控汇聚/视频安防系统Liveweb搭建智慧园区视频管理平台
智慧园区作为现代化城市发展的重要组成部分,不仅承载着产业升级的使命,更是智慧城市建设的重要体现。随着产业园区竞争的逐渐白热化,将项目打造成完善的智慧园区是越来越多用户关注的内容。 然而我们往往在规划前期就开始面临众多难题&#…...
InnoDB 查询成本
1. 单表查询成本 连接查询总成本 IO 成本 CPU 成本对于 InnoDB 存储引擎来说,页是磁盘和内存之间交互的基本单位,设计MySQL的大叔规定读取一个页面花费的成本默认是 1.0,读取以及检测一条记录是否符合搜索条件的成本默认是 0.2。1.0、0.2 …...
C++的高精度减法 分步详解
高精度减法计算原理 在读小学时,我们做减法都采用竖式方法,如图 1 所示。 这样,我们可以写出两个整数相减的算法。 我们就可以用 C 语言来模拟这个竖式减法的过程。我们可以考虑利用 C 的数组来存储对应数据,假设用数组 A 存储被…...
linux cpu 管理
视频教程:ubuntu cpu 管理_哔哩哔哩_bilibili 概述 平均负载,CPU 使用率,CPU上下文 1 平均负载 #查看命令: rootzyb:~# uptime 18:21:47 up 1:09, 2 users, load average: 0.00, 0.00, 0.00 依次则是过去 1 分钟、5 分钟、1…...
大批量URL去重的架构设计(redis-bitmap+redisson)
1. 引言 什么是数据去重? 在大数据处理中,去重是指消除重复数据,只保留唯一的数据记录。 去重的重要性 提高数据处理效率,节省存储空间,提升数据分析的准确性。 常见的去重技术 基于哈希函数、布隆过滤器、位图等方法…...
WebGPU跨平台应用开发
对于 Web 开发人员来说,WebGPU 是一个 Web 图形 API,可提供对 GPU 的统一和快速访问。WebGPU 公开了现代硬件功能,并允许在 GPU 上进行渲染和计算操作,类似于 Direct3D 12、Metal 和 Vulkan。 虽然这是真的,但这个故事…...
Proteus(8.15)仿真下载安装过程(附详细安装过程图)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、Proteus是什么? 二、下载链接 三、下安装步骤 1.解压,有键管理员运行 2.点击Next,进行下一步 3.勾选I accept…&#…...
vlan和vlanif
文章目录 1、为什么会有vlan的存在2、vlan(虚拟局域网)1、vlan原理1. 为什么这样划分了2、如何实现不同交换机相同的vlan实现互访呢3、最优化的解决方法,vlan不同交换机4、vlan标签和vlan数据帧 5、vlan实现2、基于vlan的划分方式1、基于接口的vlan划分方式2、基于m…...
Unity开发哪里下载安卓Android-NDK-r21d
google的东西,居然是完全开源的 真的不是很多公司能做到,和那种伪搜索引擎是不同的 到底什么时候google才会开始造车 不过风险很多,最好不要合资,风险更大...
期末速成C++【初识C++】
目录 1.英文单词 2.C的特点 3.C对C语言的补充 3.1命名空间和域操作符 🎇3.2控制台输入输出 3.3类型增强 3.3.1const常变量 3.3.2const与指针 3.3.3布尔类型与枚举类型 3.4默认参数 🎇3.5函数重载 🎇引用 3.6.1引用做函数参数 …...
爬虫案例学习6
获取淘宝商品数据2024-12-18 参考学习: 大佬博客 视频教程 通过搜索发现,数据是通过发送请求过来的,不是静态存在源代码的 所以我们需要请求这个接口获取数据:比如标题,价格,图片等信息 https://h5api.m…...
28、论文阅读:基于像素分布重映射和多先验Retinex变分模型的水下图像增强
A Pixel Distribution Remapping and Multi-Prior Retinex Variational Model for Underwater Image Enhancement 摘要介绍相关工作基于模型的水下图像增强方法:无模型水下图像增强方法:基于深度学习的水下图像增强方法: 论文方法概述像素分布…...
[BJDCTF2020]ZJCTF,不过如此 1
[BJDCTF2020]ZJCTF,不过如此 1 打开实例发现代码审计 需要GET传入text和file参数,然后执行文件包含 text需要读取到I have a dream文本,这边采用data流进行绕过 ?textdata://,I have a dream&filenext.php成功绕过,接下来…...
Hive的in与not in 值中有null的时候注意事项,join where条件等问题
在进行hive SQL查询数据的时候,where条件中使用了in或者not in,但是该值内有null空。 这时,无论是in还是not in,空值都不会进入该条件内,但是使用not in的时候只是希望把自己不想要的数据给排除掉,这时会同…...
大语言模型画图(流程图、框架图)
第一步:向随意大语言模型,描述内容,推荐豆包 豆包 加上下面Prompt 通过Mermaid语法,描述上面流程图 第二步:将生成Mermaid输入流程图生成网站 中文Mermaid - 流程图、关系图在线画图、生成和编辑器...
Oracle创建逻辑目录
Oracle 在执行逻辑备份及还原时,需要用到逻辑目录。 本文就来简单介绍一下逻辑目录相关的操作,希望对大家有所帮助。 1.登录到Oracle数据库 使用具有足够权限的数据库用户登录到Oracle数据库。通常,这需要是管理员账号,如SYS…...
[react] 优雅解决typescript动态获取redux仓库的类型问题
store.getState()是可以获取总仓库的 先拿到函数的类型 再用ReturnType<T> 它是 TypeScript 中的一个内置条件类型,用于获取某个函数类型 T 的返回值类型 代码 // 先拿总仓库的函数类型type StatefuncType typeof store.getState;//再拿函数类型T的返回值类…...
python如何获取excel单元格文字是否加粗
是的,Python 可以获取 Excel 单元格中的文字是否加粗。通常,这需要使用 openpyxl 库,它允许你读取和写入 Excel 文件(.xlsx 格式)。 以下是一个示例代码,展示如何检查某个单元格的文字是否加粗:…...
我的性能优化经验
专业方向:App cpu/memory/gpu/流畅度/响应时间的优化,Anr,Framework CarPowerManagementService模块的(STR),从0~1完成性能监控体系搭建,完成3大版本迭代高质量性能交付 响应时间: …...
【Vulkan入门】16-IndexBuffer
TOC 先叨叨 上篇介绍了如何使用VertexBuffer传入顶点信息。两个多星期了我们一直在玩三个点,本篇介绍如何渲染更多的点。 在渲染前考虑一个问题,渲染一个三角形需要三个点,渲染两个相接的三角形需要几个点? 答案是6个点…...
如何通过HTTP API新建Collection
本文介绍如何通过HTTP API创建一个新的Collection。 前提条件 已创建Cluster:创建Cluster。 已获得API-KEY:API-KEY管理。 Method与URL HTTP POST https://{Endpoint}/v1/collections 使用示例 说明 需要使用您的api-key替换示例中的YOUR_API_KEY、…...
excel 使用vlook up找出两列中不同的内容
当使用 VLOOKUP 函数时,您可以将其用于比较两列的内容。假设您要比较 A 列和 B 列的内容,并将结果显示在 C 列,您可以在 C1 单元格中输入以下公式: 这个公式将在 B 列中的每个单元格中查找是否存在于 A 列中。如果在 A 列中找不到…...
实验16 循环神经网络(3)
目录 1.数据处理 1.1.数据集下载 1.2.数据加载 1.2.1读取数据 1.2.2词表转换 1.2.3封装数据 2. 模型构建 2.1汇聚层算子 2.2模型汇总 3. 模型训练 3.1模型训练 3.2绘制准确率和损失函数图像 4. 模型评价 5. 模型预测 6. 基于Torch的单向LSTM 6.1模型修改-只返…...
Docker 清理命令
Docker 清理命令 删除停止的容器:停止的容器仍然会占用磁盘空间,可以使用以下命令删除所有停止的容器: docker container prune删除无用的网络:Docker 创建的网络,如果不再使用,也可以被清理: d…...
游泳溺水识别数据集,对9984张原始图片进行YOLO,COCO JSON, VOC XML 格式的标注,平均识别率在91.7%以上
游泳溺水识别数据集: 对9984张原始图片进行YOLO,COCO JSON, VOC XML 格式的标注,平均识别率在91.7%以上 ,可识别泳池或者水库中是否有人溺水。 数据集分割 训练组98% 9818图片 有效集%…...
【计算机网络】应用层
1. 域名系统 DNS 1.1 域名系统概述 域名系统 DNS (Domain Name System) : 互联网使用的命名系统。 用来把人们使用的机器名字(域名)转换为 IP 地址。 为互联网的各种网络应用提供了核心服务。 域名采用层次树状结构的命名方法。 DNS 是…...
计算机组成原理的学习笔记(1)
学习笔记 前言 本文主要是对于b站尚硅谷的计算机组成原理的学习笔记,仅用于学习交流。 一、hello.c如何运行起来? 1. 预处理阶段 在编译 C 程序时,预处理器首先处理代码。预处理器会: 插入头文件:例如,…...
挑战一个月基本掌握C++(第六天)了解函数,数字,数组,字符串
一 C函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上ÿ…...
《薄世宁医学通识50讲》以医学通识为主题,涵盖了医学的多个方面,包括医学哲学、疾病认知、治疗过程、医患关系、公共卫生等
《薄世宁医学通识50讲》是一门由薄世宁医生主讲的医学通识课程,该课程旨在通过深入浅出的方式,向广大听众普及医学知识,提升公众对医学的认知和理解。 晓北斗推荐-薄世宁医学通识 以下是对该课程的详细介绍: 一、课程概述 《薄世…...
Golang囊地鼠gopher
开发知识点-golang 介绍红队专题-Golang工具Fscan简介主要功能ubuntu 安装windows 安装常用命令:项目框架源文件common目录Plugins目录Webscan目录入口点插件扫描类型爆破插件common.ScantypeWebtitle函数webpoc扫描POC 执行CEL-GO 实践CEL指纹识别免杀源码特征参考链接红队专…...
关于如何正确在测试用例中mock静态方法的问题
文章目录 情况一:希望在测试用例中直接执行静态方法的逻辑情况二:不希望在测试用例中执行静态方法的逻辑插桩方法坑1: 报错SubclassByteBuddyMockMaker原因与解决方案坑2:报错 the existing static mock registration must be deregistered原…...
深度学习0-前置知识
一、背景 AI最大,它的目的是通过让机器模仿人类进而超越人类; ML次之,它是AI的一个分支,是让机器模仿人类的一种方法。开发人员用大量数据和算法“训练”机器,让机器自行学会如何执行任务,它的成功取决于…...
web网页前后端交互方式
参考该文, 一、前端通过表单<form>向后端发送数据 前端是通过html中的<form>表单,设置method属性定义发送表单数据的方式是get还是post。 如使用get方式,则提交的数据会在url中显示;如使用post方式,提交…...
电商大数据的几种获取渠道分享!
在当今数字化时代,电商大数据已成为企业决策和运营的重要基础。如何高效地获取、分析和利用这些数据,对于提升电商企业的竞争力至关重要。本文将详细介绍几种电商大数据的获取渠道,帮助电商从业者更好地掌握数据资源,提升业务洞察…...
【图像配准】方法总结
图像配准(Image registration)就是将不同时间、不同传感器(成像设备)或不同条件下(天候、照度、摄像位置和角度等)获取的两幅或多幅图像进行匹配、叠加的过程,就是找到1幅图像像素到另1幅图像像素间的空间映射关系它已…...
SSM 超市管理系统
🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…...