当前位置: 首页 > news >正文

什么是MyBatis

MyBatis 简介

MyBatis 是一个流行的 Java 持久层框架(Persistence Framework),它主要用于简化数据库操作,提供了对数据库的映射支持,使得开发人员能够通过简单的配置和映射文件来执行数据库操作(如增、删、改、查等)。MyBatis 继承了传统的 JDBC 编程方式,但通过提供更高层次的抽象,简化了 SQL 执行的过程,避免了大量的样板代码。

主要特点

  1. SQL 映射: MyBatis 允许开发人员在 XML 文件或注解中编写原生的 SQL 语句,并将它们与 Java 对象进行映射。

  2. 灵活性: 与 Hibernate 等 ORM(对象关系映射)框架不同,MyBatis 不会自动生成 SQL,而是让开发者直接编写 SQL 语句,从而提供了更大的灵活性。

  3. 性能: 因为开发人员手动编写 SQL,所以 MyBatis 在 SQL 执行的效率上能获得更多控制,避免了一些 ORM 框架自动生成的低效查询。

  4. 支持复杂查询: MyBatis 对于复杂查询非常友好,可以直接写 SQL,尤其是涉及多表连接、子查询等情况时,MyBatis 会更加灵活和高效。

  5. 支持缓存机制: MyBatis 提供了一级缓存和二级缓存的支持,能够提升查询效率。

MyBatis 组件

  1. SqlSessionFactory: 负责创建 SqlSession 实例。通过读取配置文件来初始化数据库连接池以及相关设置。

  2. SqlSession: 执行 SQL 操作的主要接口,负责执行增、删、改、查等操作,以及提交和回滚事务。

  3. Mapper: Mapper 是一个接口,用于定义与数据库表相关的操作。开发人员可以通过接口方法来执行 SQL 操作,而 MyBatis 会根据 XML 配置文件或注解来自动生成具体的 SQL 执行语句。

  4. 映射文件(Mapper XML): 这是 MyBatis 的核心文件之一,它存储了 SQL 语句的映射。映射文件通常包括 SQL 语句和结果映射的配置。映射文件的每个 <mapper> 标签都对应一个接口,方法和 SQL 映射之间建立了关联。

  5. 动态 SQL: MyBatis 支持动态 SQL,可以根据不同条件生成不同的 SQL 语句,这对于复杂的查询场景特别有用。

  6. 插件: MyBatis 支持插件机制,开发人员可以通过自定义插件来扩展 MyBatis 的功能。例如,可以编写日志插件、性能监控插件等。

使用 MyBatis 的步骤

  1. 配置文件: 在 MyBatis 中,首先需要通过 XML 配置文件(通常是 mybatis-config.xml)来设置数据库连接池、全局配置项等信息。

  2. 创建映射文件(Mapper XML): 你需要定义一个 Mapper 映射文件,用于将 SQL 语句与 Java 方法进行映射。每个映射文件对应一个 Mapper 接口,接口中的方法将映射到具体的 SQL 语句。

  3. Mapper 接口: 创建一个 Java 接口,方法对应于数据库操作。这个接口会通过 MyBatis 生成的代理类来执行具体的 SQL 操作。

  4. 执行 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 持久层框架&#xff08;Persistence Framework&#xff09;&#xff0c;它主要用于简化数据库操作&#xff0c;提供了对数据库的映射支持&#xff0c;使得开发人员能够通过简单的配置和映射文件来执行数据库操作&#xff08;如增、删、…...

开发技术-Java改变图片格式

图片上传页未做控制&#xff0c;导致上传的是GIF格式&#xff0c;导致图片识别失败。需要将GIF格式转为JPEG格式。 代码&#xff0c;是找AI写的&#xff0c;记录一下&#xff1a; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; im…...

基于DockerCompose搭建Redis主从哨兵模式

linux目录结构 内网配置 哨兵配置文件如下&#xff0c;创建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端口测试

环境&#xff1a; aioice0.9.0 问题描述&#xff1a; aioice里面candidate固定UDP端口测试 解决方案&#xff1a; /miniconda3/envs/nerfstream/lib/python3.10/site-packages/aioice import hashlib import ipaddress import random from typing import Optional import…...

Git使用教程-分支使用/合并分支提交

Git使用教程-分支使用 文章目录 Git使用教程-分支使用一、分支&#xff08;branch&#xff09;的基本操作&#xff1a;二、查看分支&#xff1a;参考 一、分支&#xff08;branch&#xff09;的基本操作&#xff1a; git clone https://.git git status …...

单元测试使用记录

什么是单元测试 简单来说就是对一个类中的方法进行测试&#xff0c;对输出的结果检查判断是否符合预期结果 但是在多年的工作中&#xff0c;从来没有哪个项目中真正系统的用到了单元测试&#xff0c;因此对它还是很陌生的&#xff0c;也就造成更加不会在项目中区使用它。 如何…...

LabVIEW实时信号采集与频谱分析

系统通过LabVIEW与PXIe硬件结合&#xff0c;实现高精度模拟信号的实时采集、频谱分析与可视化显示。核心功能包括采样率配置、快速傅里叶变换&#xff08;FFT&#xff09;、功率谱图生成及动态缩放调整&#xff0c;同时支持信号平均与噪声抑制。系统设计灵活&#xff0c;适用于…...

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))# 减法&#xff0c;相互减最小值只能为0 print(cv.subtract(x_1,y_1))图像加法 import cv2 as…...

基础2:值类型与右值引用

1.函数返回 在讲解右值之前&#xff0c;要知道下面这个函数要进行几次拷贝以及为什么&#xff1f; int get_x() {int x 20;return x; }int aget_x(); 答案&#xff1a;两次 # 第一次 int tmpa; # 第二次 int xtmp;2.左值与右值 &#x1f34f;2.1 能取地址操作的就是左值 …...

GitHub年度报告发布!Python首次超越JavaScript

全球开发者数量激增&#xff0c;GenAI 项目呈爆炸式增长趋势&#xff0c;推动编程语言的应用格局也发生了巨大变化&#xff0c;最新的 GitHub Octoverse 报告来了&#xff01; 1、Python 首次超越 JavaScript&#xff0c;成为 GitHub 平台最顶级编程语言 不同于流传“AI 即将取…...

EdgeX Message Bus 消息总线

EdgeX Message Bus 消息总线 一、概述 EdgeX MessageBus 内部消息总线,用于 EdgeX 服务之间的内部通信。 EdgeX 服务是指来自 EdgeX 的任何核心/支持/应用程序/设备服务或使用 EdgeX SDK 构建的任何自定义应用程序或设备服务。 EdgeX MessageBus 用于内部 EdgeX 服务与服务之间…...

【JavaEE进阶】关于Maven

目录 &#x1f334;什么是Maven &#x1f332;为什么要学Maven &#x1f38d;创建一个Maven项目 &#x1f384;Maven核心功能 &#x1f6a9;项目构建 &#x1f6a9;依赖管理 &#x1f38b;Maven Help插件 &#x1f340;Maven 仓库 &#x1f6a9;本地仓库 &#x1f6a…...

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是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.…...

谷歌浏览器 安装谷歌浏览器特定版本后禁止自动更新

问题描述 我们通过离线安装谷歌浏览器后&#xff0c;第一次打开浏览器时会默认下载最新版本&#xff0c;等到我们重启浏览器后它会自动更新。在项目中为了能固定浏览器版本&#xff0c;所以要禁止谷歌浏览器的更新&#xff0c;网上找了好多方法都没用&#xff0c;自己摸索出来…...

Linux计算时间差

Linux计算时间差 1、Linux计算时间差2、时间差的应用 1、Linux计算时间差 在Linux中&#xff0c;计算时间差通常是为了统计、监控或调试。时间差可以用来衡量任务执行的时间&#xff0c;或者两个事件之间的间隔。例如&#xff0c;响应时间、执行时间、定时任务与延时处理等 以…...

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&#xff08;npm registry manager&#xff09;是一个 npm 源管理器&#xff0c;它允许用户快速地在不同的 npm 源之间进行切换&#xff0c;以提高包管理的速度和效率。以下是对 nrm 使用的详细介绍&#xff1a; 1、安装nrm 在使用 nrm 之前&#xff0c;需要先确保已经安装…...

【SQL/MySQL 如何使用三种触发器】SQL语句实例演示

触发器介绍 – 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前(BEFORE)或之后(AFTER)&#xff0c;触发并执行触发器中定义的SQL语句集合。 – 使用别名OLD和NEW来引用触发器中发生变化的记录内容&#xff0c;这与其他的数据库是相似的。现在触发器还只…...

Docker容器五种网络驱动模式详解

Docker 网络用于在容器之间以及容器与外部网络之间提供通信功能。它允许容器在隔离的网络环境中运行&#xff0c;同时也能根据需要与其他容器或外部网络进行交互。通过使用网络驱动&#xff0c;Docker 可以创建不同类型的网络&#xff0c;以满足各种应用场景的需求。 传统上&am…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...