什么是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),它主要用于简化数据库操作,提供了对数据库的映射支持,使得开发人员能够通过简单的配置和映射文件来执行数据库操作(如增、删、…...
开发技术-Java改变图片格式
图片上传页未做控制,导致上传的是GIF格式,导致图片识别失败。需要将GIF格式转为JPEG格式。 代码,是找AI写的,记录一下: import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; im…...
基于DockerCompose搭建Redis主从哨兵模式
linux目录结构 内网配置 哨兵配置文件如下,创建3个哨兵配置文件 # sentinel26379.conf sentinel26380.conf sentinel26381.conf 内容如下 protected-mode no sentinel monitor mymaster redis-master 6379 2 sentinel down-after-milliseconds mymaster 60000 s…...
aioice里面candidate固定UDP端口测试
环境: aioice0.9.0 问题描述: aioice里面candidate固定UDP端口测试 解决方案: /miniconda3/envs/nerfstream/lib/python3.10/site-packages/aioice import hashlib import ipaddress import random from typing import Optional import…...
Git使用教程-分支使用/合并分支提交
Git使用教程-分支使用 文章目录 Git使用教程-分支使用一、分支(branch)的基本操作:二、查看分支:参考 一、分支(branch)的基本操作: git clone https://.git git status …...
单元测试使用记录
什么是单元测试 简单来说就是对一个类中的方法进行测试,对输出的结果检查判断是否符合预期结果 但是在多年的工作中,从来没有哪个项目中真正系统的用到了单元测试,因此对它还是很陌生的,也就造成更加不会在项目中区使用它。 如何…...
LabVIEW实时信号采集与频谱分析
系统通过LabVIEW与PXIe硬件结合,实现高精度模拟信号的实时采集、频谱分析与可视化显示。核心功能包括采样率配置、快速傅里叶变换(FFT)、功率谱图生成及动态缩放调整,同时支持信号平均与噪声抑制。系统设计灵活,适用于…...
OpenCV(python)从入门到精通——运算操作
加法减法操作 import cv2 as cv import numpy as npx np.uint8([250]) y np.uint8([10])x_1 np.uint8([10]) y_1 np.uint8([20])# 加法,相加最大只能为255 print(cv.add(x,y))# 减法,相互减最小值只能为0 print(cv.subtract(x_1,y_1))图像加法 import cv2 as…...
基础2:值类型与右值引用
1.函数返回 在讲解右值之前,要知道下面这个函数要进行几次拷贝以及为什么? int get_x() {int x 20;return x; }int aget_x(); 答案:两次 # 第一次 int tmpa; # 第二次 int xtmp;2.左值与右值 🍏2.1 能取地址操作的就是左值 …...
GitHub年度报告发布!Python首次超越JavaScript
全球开发者数量激增,GenAI 项目呈爆炸式增长趋势,推动编程语言的应用格局也发生了巨大变化,最新的 GitHub Octoverse 报告来了! 1、Python 首次超越 JavaScript,成为 GitHub 平台最顶级编程语言 不同于流传“AI 即将取…...
EdgeX Message Bus 消息总线
EdgeX Message Bus 消息总线 一、概述 EdgeX MessageBus 内部消息总线,用于 EdgeX 服务之间的内部通信。 EdgeX 服务是指来自 EdgeX 的任何核心/支持/应用程序/设备服务或使用 EdgeX SDK 构建的任何自定义应用程序或设备服务。 EdgeX MessageBus 用于内部 EdgeX 服务与服务之间…...
【JavaEE进阶】关于Maven
目录 🌴什么是Maven 🌲为什么要学Maven 🎍创建一个Maven项目 🎄Maven核心功能 🚩项目构建 🚩依赖管理 🎋Maven Help插件 🍀Maven 仓库 🚩本地仓库 Ὢ…...
YOLOv9-0.1部分代码阅读笔记-autoanchor.py
autoanchor.py utils\autoanchor.py 目录 autoanchor.py 1.所需的库和模块 2.def check_anchor_order(m): 3.def check_anchors(dataset, model, thr4.0, imgsz640): 4.def kmean_anchors(dataset./data/coco128.yaml, n9, img_size640, thr4.0, gen1000, verboseTrue…...
Electronjs+Vue如何开发PC桌面客户端(Windows,Mac,Linux)
electronjs官网 https://www.electronjs.org/zh/ Electron开发PC桌面客户端的技术选型非常适合已经有web前端开发人员的团队。能够很丝滑的过渡。 Electron是什么? Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.…...
谷歌浏览器 安装谷歌浏览器特定版本后禁止自动更新
问题描述 我们通过离线安装谷歌浏览器后,第一次打开浏览器时会默认下载最新版本,等到我们重启浏览器后它会自动更新。在项目中为了能固定浏览器版本,所以要禁止谷歌浏览器的更新,网上找了好多方法都没用,自己摸索出来…...
Linux计算时间差
Linux计算时间差 1、Linux计算时间差2、时间差的应用 1、Linux计算时间差 在Linux中,计算时间差通常是为了统计、监控或调试。时间差可以用来衡量任务执行的时间,或者两个事件之间的间隔。例如,响应时间、执行时间、定时任务与延时处理等 以…...
Python的3D可视化库【vedo】2-5 (plotter模块) 坐标转换、场景导出、添加控件
文章目录 4 Plotter类的方法4.7 屏幕和场景中的坐标点转换4.7.1 屏幕坐标转为世界坐标4.7.2 世界坐标转为屏幕坐标4.7.3 屏幕坐标取颜色 4.8 导出4.8.1 导出2D图片4.8.2 导出3D文件 4.9 添加控件4.9.1 添加内嵌子窗口4.9.2 添加选择区4.9.3 添加比例尺4.9.4 为对象添加弹出提示…...
【VUE】13、安装nrm管理多个npm源
nrm(npm registry manager)是一个 npm 源管理器,它允许用户快速地在不同的 npm 源之间进行切换,以提高包管理的速度和效率。以下是对 nrm 使用的详细介绍: 1、安装nrm 在使用 nrm 之前,需要先确保已经安装…...
【SQL/MySQL 如何使用三种触发器】SQL语句实例演示
触发器介绍 – 触发器是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的SQL语句集合。 – 使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只…...
Docker容器五种网络驱动模式详解
Docker 网络用于在容器之间以及容器与外部网络之间提供通信功能。它允许容器在隔离的网络环境中运行,同时也能根据需要与其他容器或外部网络进行交互。通过使用网络驱动,Docker 可以创建不同类型的网络,以满足各种应用场景的需求。 传统上&am…...
OpenMC多群截面计算深度解析:传输修正合并的3种解决方案与性能优化实战
OpenMC多群截面计算深度解析:传输修正合并的3种解决方案与性能优化实战 【免费下载链接】openmc OpenMC Monte Carlo Code 项目地址: https://gitcode.com/gh_mirrors/op/openmc 你是否在使用OpenMC进行多群蒙特卡洛计算时,遇到模拟结果与参考值偏…...
如何快速上手PCL点云库:10个核心模块详解与实践
如何快速上手PCL点云库:10个核心模块详解与实践 【免费下载链接】pcl-learning 🔥PCL(Point Cloud Library)点云库学习记录 项目地址: https://gitcode.com/gh_mirrors/pc/pcl-learning PCL(Point Cloud Librar…...
视觉暂留与嵌入式编程:打造动态LED光影艺术装置
1. 项目概述:当LED阵列在空中“作画”如果你见过夜晚挥舞的LED光剑在空中留下绚烂的图案,或者火舞者手中的Poi(火球)划出复杂的光轨,那么你已经亲眼目睹了动态成像(Kinetic Persistence of Vision, Kinetic…...
动态路由协议与BGP路径属性:网络工程师的核心必修课
1. 从“路标”到“地图”:动态路由协议的核心价值 在网络世界里,路由器就像一个个十字路口的交通警察。如果每个路口都需要手动设置去往所有目的地的路牌,那不仅工作量巨大,一旦某条路临时施工或封闭,整个城市的交通都…...
让你的电脑静下来:FanControl风扇智能控制完全指南
让你的电脑静下来:FanControl风扇智能控制完全指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/Fa…...
黑金AX301开发板+HS-04模块:FPGA超声波测距从原理到数码管显示的保姆级教程
黑金AX301开发板实战:基于HS-04模块的FPGA超声波测距系统设计 当超声波传感器遇到FPGA,我们能创造出怎样的精准测距系统?本文将带你从硬件连接到Verilog编码,完整实现一个基于黑金AX301开发板和HS-04超声波模块的测距系统。不同于…...
Shoelace赞助支持:打造开源项目可持续发展的终极指南
Shoelace赞助支持:打造开源项目可持续发展的终极指南 【免费下载链接】shoelace Shoelace is now Web Awesome. Come see what’s new! 项目地址: https://gitcode.com/gh_mirrors/sh/shoelace Shoelace(现已更名为Web Awesome)作为一…...
终极指南:CodeGuide领域建模中的事件风暴与用例分析实践
终极指南:CodeGuide领域建模中的事件风暴与用例分析实践 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如…...
从手机耗电到网络覆盖:深入浅出聊聊LTE PUCCH功率控制那点事
从手机耗电到网络覆盖:深入浅出聊聊LTE PUCCH功率控制那点事 你有没有遇到过这种情况:在地下车库刷视频时,手机电量像开了闸的水龙头一样往下掉?或者在高层建筑的电梯里,明明信号满格,手机却烫得能煎鸡蛋&…...
资源管理器老崩溃?可能是combase.dll在捣鬼,手把手教你用DISM和干净启动搞定它
深度解析Win10资源管理器崩溃:combase.dll故障诊断与系统级修复指南 当你在Windows 10中拖拽文件时突然遭遇黑屏闪烁,随后资源管理器自动重启,这种看似随机的崩溃往往与一个关键系统组件——combase.dll密切相关。作为COM基础库的核心文件&am…...
