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

SSM - Springboot - MyBatis-Plus 全栈体系(十三)

第三章 MyBatis

一、MyBatis 简介

1. 简介

  • MyBatis 最初是 Apache 的一个开源项目 iBatis, 2010 年 6 月这个项目由 Apache Software Foundation 迁移到了 Google Code。随着开发团队转投 Google Code 旗下, iBatis3.x 正式更名为 MyBatis。代码于 2013 年 11 月迁移到 Github。

  • MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

在这里插入图片描述

  • 此处使用 3.5.11 版本

2. 持久层框架对比

  • JDBC

    • SQL 夹杂在 Java 代码中耦合度高,导致硬编码内伤
    • 维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见
    • 代码冗长,开发效率低
  • Hibernate 和 JPA

    • 操作简便,开发效率高
    • 程序中的长难复杂 SQL 需要绕过框架
    • 内部自动生成的 SQL,不容易做特殊优化
    • 基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。
    • 反射操作太多,导致数据库性能下降
  • MyBatis

    • 轻量级,性能出色
    • SQL 和 Java 编码分开,功能边界清晰。Java 代码专注业务、SQL 语句专注数据
    • 开发效率稍逊于 Hibernate,但是完全能够接受
  • 开发效率:Hibernate>Mybatis>JDBC

  • 运行效率:JDBC>Mybatis>Hibernate

3. 快速入门(基于 MyBatis3 方式)

3.1 准备数据模型
CREATE DATABASE `mybatis-example`;USE `mybatis-example`;CREATE TABLE `t_emp`(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id)
);INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("tom",200.33);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("jerry",666.66);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("andy",777.77);
3.2 项目搭建和准备
3.2.1 项目搭建

在这里插入图片描述

3.2.2 依赖导入
  • pom.xml
<dependencies><!-- mybatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version></dependency><!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency><!--junit5测试--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.3.1</version></dependency>
</dependencies>
3.2.3 实体类准备
public class Employee {private Integer empId;private String empName;private Double empSalary;//getter | setter
}
3.3 准备 Mapper 接口和 MapperXML 文件
  • MyBatis 框架下,SQL 语句编写位置发生改变,从原来的 Java 类,改成XML或者注解定义!
  • 推荐在 XML 文件中编写 SQL 语句,让用户能更专注于 SQL 代码,不用关注其他的 JDBC 代码。
  • 如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码!!
  • 一般编写 SQL 语句的文件命名:XxxMapper.xml Xxx 一般取表名!!
  • Mybatis 中的 Mapper 接口相当于以前的 Dao。但是区别在于,Mapper 仅仅只是建接口即可,我们不需要提供实现类,具体的 SQL 写到对应的 Mapper 文件,该用法的思路如下图所示:

在这里插入图片描述

3.3.1 定义 mapper 接口
  • 包:com.alex.mapper
package com.alex.mapper;import com.alex.pojo.Employee;/*** t_emp表对应数据库SQL语句映射接口!*    接口只规定方法,参数和返回值!*    mapper.xml中编写具体SQL语句!*/
public interface EmployeeMapper {/*** 根据员工id查询员工数据方法* @param empId  员工id* @return 员工实体对象*/Employee selectEmployee(Integer empId);}
3.3.2 定义 mapper xml
  • 位置: resources/mappers/EmployeeMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace等于mapper接口类的全限定名,这样实现对应 -->
<mapper namespace="com.alex.mapper.EmployeeMapper"><!-- 查询使用 select标签id = 方法名resultType = 返回值类型标签内编写SQL语句--><select id="selectEmployee" resultType="com.alex.pojo.Employee"><!-- #{empId}代表动态传入的参数,并且进行赋值!后面详细讲解 -->select emp_id empId,emp_name empName, emp_salary empSalary fromt_emp where emp_id = #{empId}</select>
</mapper>
  • 注意:
    • 方法名和 SQL 的 id 一致
    • 方法返回值和 resultType 一致
    • 方法的参数和 SQL 的参数一致
    • 接口的全类名和映射配置文件的名称空间一致
3.4 准备 MyBatis 配置文件
  • mybatis 框架配置文件: 数据库连接信息,性能配置,mapper.xml 配置等!
  • 习惯上命名为 mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合 Spring 之后,这个配置文件可以省略,所以操作时可以直接复制、粘贴。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 --><environments default="development"><!-- environment表示配置Mybatis的一个具体的环境 --><environment id="development"><!-- Mybatis的内置的事务管理器 --><transactionManager type="JDBC"/><!-- 配置数据源 --><dataSource type="POOLED"><!-- 建立数据库连接的具体信息 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><!-- Mapper注册:指定Mybatis映射文件的具体位置 --><!-- mapper标签:配置一个具体的Mapper映射文件 --><!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 --><!--    对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 --><mapper resource="mappers/EmployeeMapper.xml"/></mappers></configuration>
3.5 运行和测试
/*** projectName: com.alex.test** description: 测试类*/
public class MyBatisTest {@Testpublic void testSelectEmployee() throws IOException {// 1.创建SqlSessionFactory对象// ①声明Mybatis全局配置文件的路径String mybatisConfigFilePath = "mybatis-config.xml";// ②以输入流的形式加载Mybatis配置文件InputStream inputStream = Resources.getResourceAsStream(mybatisConfigFilePath);// ③基于读取Mybatis配置文件的输入流创建SqlSessionFactory对象SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2.使用SqlSessionFactory对象开启一个会话SqlSession session = sessionFactory.openSession();// 3.根据EmployeeMapper接口的Class对象获取Mapper接口类型的对象(动态代理技术)EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);// 4. 调用代理类方法既可以触发对应的SQL语句Employee employee = employeeMapper.selectEmployee(1);System.out.println("employee = " + employee);// 4.关闭SqlSessionsession.commit(); //提交事务 [DQL不需要,其他需要]session.close(); //关闭会话}
}
  • 说明:

    • SqlSession:代表 Java 程序和数据库之间的会话。(HttpSession 是 Java 程序和浏览器之间的会话)
    • SqlSessionFactory:是“生产”SqlSession 的“工厂”。
    • 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。
3.6 SqlSession 和 HttpSession 区别
  • HttpSession:工作在 Web 服务器上,属于表述层。
    • 代表浏览器和 Web 服务器之间的会话。
  • SqlSession:不依赖 Web 服务器,属于持久化层。
    • 代表 Java 程序和数据库之间的会话。
      在这里插入图片描述

相关文章:

SSM - Springboot - MyBatis-Plus 全栈体系(十三)

第三章 MyBatis 一、MyBatis 简介 1. 简介 MyBatis 最初是 Apache 的一个开源项目 iBatis, 2010 年 6 月这个项目由 Apache Software Foundation 迁移到了 Google Code。随着开发团队转投 Google Code 旗下&#xff0c; iBatis3.x 正式更名为 MyBatis。代码于 2013 年 11 月迁…...

Python|OpenCV-访问并修改图片像素值,鉴别彩色和灰色图像(6)

前言 本文是该专栏的第6篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在使用OpenCV对图像进行操作的时候,通常需要熟练掌握一些Numpy知识点。因为有的时候需要用到Numpy和OpenCV结合去实现图像的操作,所以说想要写出较好的OpenCV代码的最好方法,就需要有Nump…...

【Python基础】if __name__ == ‘__main__‘:和assert函数

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

设计模式——1. 单例模式

原理 单例模式(Singleton Pattern)用于确保一个类只有一个实例,并提供一个全局访问点以访问该实例。这意味着无论在何处请求该类的实例,都将返回相同的唯一实例。单例模式常常用于需要共享资源,或需要限制某些资源在系统中的访问次数的情况下。 使用的场景 单例模式在许…...

操作文档的用户故事怎么写,敏捷开发

文章目录 操作文档的用户故事怎么写&#xff0c;敏捷开发例子的标准就是操作文档的角色是最终用户 操作文档的用户故事怎么写&#xff0c;敏捷开发 在敏捷开发中&#xff0c;用户故事&#xff08;User Stories&#xff09;是一种简洁、人性化的方式来描述功能需求。这通常有助…...

14.抽象工厂模式

UML 代码 #include <iostream> #include <list> using namespace std;class AbstractProductA { public:virtual void showa() 0; }; class ProductA1:public AbstractProductA { public:virtual void showa(){cout << "我是A1" << endl;}…...

铁路用热轧钢轨

声明 本文是学习GB-T 2585-2021 铁路用热轧钢轨. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了铁路用钢轨的订货内容、分类、尺寸、外形、质量及允许偏差、技术要求、试验方法、检 验规则、标志及质量证明书。 本标准适用于3…...

win11+wsl+git+cmake+x86gcc+armgcc+clangformat+vscode环境安装

一、安装wsl &#xff08;1&#xff09;打开power shell 并运行&#xff1a; Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform &#xff08;2&#xff0…...

HDLBits-Edgedetect

刚开始写的代码如下&#xff1a; module top_module (input clk,input [7:0] in,output [7:0] pedge );reg [7:0] in_pre;always (posedge clk)begin in_pre < in;endassign pedge in & ~in_pre; endmodule但是提交结果是错误的。猜想原因如下&#xff1a; assign p…...

云计算与大数据——部署Hadoop集群并运行MapReduce集群(超级详细!)

云计算与大数据——部署Hadoop集群并运行MapReduce集群(超级详细&#xff01;) Linux搭建Hadoop集群(CentOS7hadoop3.2.0JDK1.8Mapreduce完全分布式集群) 本文章所用到的版本号&#xff1a; CentOS7 Hadoop3.2.0 JDK1.8 基本概念及重要性 很多小伙伴部署集群用hadoop用mapr…...

基于jenkins+k8s实现devops

1、背景 由于jenkins运行在k8s上能够更好的利用动态agent进行构建。所以写了个部署教程&#xff0c;亲测无坑 2、部署 1、创建ns kubectl create namespace devops 2、kubectl apply -f jenkins.yml apiVersion: v1 kind: ServiceAccount metadata:name: jenkinsnamespace…...

一文了解企业如何实现文件自动化实时同步

在当今的数字化时代&#xff0c;数据是企业的核心资产&#xff0c;也是企业竞争力的重要体现。数据的传输、共享、协作、备份等都需要依赖文件同步技术&#xff0c;实现数据在不同平台和设备之间的一致性和可用性。文件同步是指将一个或多个文件夹中的内容复制或更新到另一个或…...

低代码系统哪里好

低代码作为近些年来被热议的话题&#xff0c;一直备受争议。低代码的出现更多的是用来辅助那些没有太多技能的人士而使用&#xff0c;在某些方面依然需要强大的代码来解决生产革新。所以低代码也不是浑水猛兽&#xff0c;也需要根据实际情况加以利用。那么为什么低代码会收到如…...

C#WPF通知更改公共类使用实例

本文实例演示C#WPF通知更改公共类使用实例,通过使用公共类简化了代码。其中的代码中也实现了命令的用法。 定义: INotifyPropertyChanged 接口:用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知。 首先创建WPF项目,添加按钮和文本控件 <Window x:C…...

解决高并发问题

在处理项目中的高并发问题时&#xff0c;可以采取以下几种方法&#xff1a; 后端处理&#xff1a;大部分的高并发处理是在后端进行的。可以通过优化数据库查询、增加缓存机制&#xff08;如集成Redis&#xff09;、使用分布式技术&#xff08;如分布式缓存、分布式锁&#xff…...

B+树的定义以及查找

1.B树的定义 一棵m阶的B树需满足下列条件: 每个分支结点最多有m棵子树(孩子结点)。非叶根结点至少有两棵子树&#xff0c;其他每个分支结点至少有「m/2]棵子树。结点的子树个数与关键字个数相等。所有叶结点包含全部关键字及指向相应记录的指针&#xff0c;叶结点中将关键字按…...

InputAction的使用

感觉Unity中InputAction的使用&#xff0c;步步都是坑。 需求点介绍 当用户长按0.5s 键盘X或者VR left controller primaryButton (即X键)时&#xff0c;显示下一个图片。 步骤总览 创建InputAction资产将该InputAction资产绑定到某个GameObject上在对应的script中&#xf…...

Bug排查思路

遇到一个Bug&#xff0c;怎么排查&#xff1f;以下几个思路&#xff0c;希望能对大家有所启发 一、环境问题 1、开发的代码是否已更新 2、是否是缓存原因导致的&#xff08;强刷&#xff0c;手动清除缓存&#xff0c;web甚至可以直接用无恒模式查看页面&#xff09; 3、是否…...

独立站引流,如何在Reddit进行营销推广?

Reddit是目前最被忽视却最具潜力的社交媒体营销平台之一&#xff0c;它相当于国内的百度贴吧&#xff0c;是美国最大的论坛&#xff0c;也是美国第五大网站&#xff0c;流量仅次于Google、Youtube、Facebook以及亚马逊。 如果会玩&#xff0c;Reddit也可以跟其他的社交媒体营销…...

文件拖拽上传功能已经烂大街了,你还不会吗?

说在前面 &#x1f5bc;文件拖拽上传功能现在已经随处可见&#xff0c;大家应该都用过了吧&#xff0c;那么它具体是怎么实现的大家有去了解过吗&#xff1f;今天我们一起来实现一下这个功能&#xff0c;并封装一个拖拽上传组件吧。 效果展示 体验地址&#xff1a;http://jyeon…...

Pro Workflow:基于SQLite持久化记忆的AI编程助手智能协作系统

1. 项目概述&#xff1a;从重复纠正到智能协作的进化如果你和我一样&#xff0c;每天都在用Claude Code、Cursor这类AI编程助手&#xff0c;那你肯定经历过这个场景&#xff1a;周一你告诉它“测试里别用Mock数据库”&#xff0c;它点头答应&#xff1b;周五你写新功能&#xf…...

手把手教你用STM32F103驱动DS3231高精度时钟模块(附完整源码与避坑指南)

手把手教你用STM32F103驱动DS3231高精度时钟模块&#xff08;附完整源码与避坑指南&#xff09; 1. 硬件准备与连接 DS3231作为一款高精度实时时钟模块&#xff0c;其内部集成了温度补偿晶体振荡器(TCXO)&#xff0c;在-40C到85C范围内精度可达2ppm。与STM32F103的硬件连接主…...

使用 Taotoken 后 API 调用延迟与稳定性体验分享

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用 Taotoken 后 API 调用延迟与稳定性体验分享 作为一名日常需要频繁调用大模型 API 的开发者&#xff0c;服务的稳定性和响应速…...

Zynq MPSoC实战:从官方Base TRD里,只抠出HDMI输入+DP显示这一个功能(Vivado 2020.1 + Petalinux)

Zynq MPSoC实战&#xff1a;精准剥离HDMI输入与DP显示功能的工程精简指南 面对Xilinx官方提供的Base TRD参考设计&#xff0c;许多开发者都会被其庞大的规模所震撼——12000行代码、数十个功能模块交织在一起&#xff0c;就像一个功能齐全但臃肿不堪的"瑞士军刀"。本…...

efinance:Python量化交易的免费金融数据终极解决方案

efinance&#xff1a;Python量化交易的免费金融数据终极解决方案 【免费下载链接】efinance efinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库&#xff0c;回测以及量化交易的好帮手&#xff01;&#x1f680;&#x1f680;&#x1f680; 项目地址: https…...

MATLAB 2024 升级指南:彻底卸载旧版,高效部署新版

1. 为什么需要彻底卸载旧版MATLAB&#xff1f; 每次MATLAB大版本更新都会带来新功能和性能优化&#xff0c;但很多用户直接覆盖安装后常遇到各种奇怪问题。我去年帮实验室处理过几十台电脑的升级故障&#xff0c;90%的问题都源于旧版残留文件。比如有位同学复现图像处理代码时&…...

办公自动化__简单日历工具

办公自动化__简单日历工具 一、概述用python编写的获取日历工具&#xff0c;输入年份并将在屏幕上打印全年12一个月&#xff0c;星期、日期、第几周对应关系。 利用到calendar、datetime、msvcrt三个库。 二、主要涉及思路 按照输入年份&#xff0c;循环使用clendar库显示日…...

英雄联盟Akari助手:从青铜到王者的智能游戏效率革命

英雄联盟Akari助手&#xff1a;从青铜到王者的智能游戏效率革命 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟游戏中的重复操…...

小红书内容采集全攻略:XHS-Downloader开源工具完整指南

小红书内容采集全攻略&#xff1a;XHS-Downloader开源工具完整指南 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果作品、用户链接&am…...

093、Python自动化测试:pytest框架

093、Python自动化测试:pytest框架 上周排查一个线上问题,凌晨两点盯着日志发现某个数据校验函数漏了边界条件。手动复现、加打印、重启服务,折腾到天亮才定位到是类型转换时的浮点精度问题。同事早上看到我黑眼圈,扔过来一句:“早用pytest写个参数化测试,这种边界问题跑…...