MyBatis基础之概念简介
文章目录
- 基本概念
- 1. 关于 MyBatis
- 2. MyBatis 的体系结构
- 3. 使用 XML 构建 SqlSessionFactory
- 4. SqlSession
- 5. 默认的别名
- 6. 补充
[注意] 放前面前
很多人可能在使用 MyBatis-plus 进行代码开发,MyBatis的这部分内容是用来更好的讲述之后的内容。
基本概念
1. 关于 MyBatis
『持久层』可以将业务数据存储到磁盘,具备长期存储能力,只要磁盘不损坏,即便实在断电情况下,重新开启系统仍然可以读取到这些数据。
『数据库系统』是最常见的执行持久化工作的工具。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis 的成功主要有 3 点:
-
不屏蔽 SQL,意味着可以更为精准地定位 SQL 语句,可以对其进行优化和改造。
-
提供强大、灵活的映射机制,方便 Java 开发者使用。提供了动态动态 SQL 的功能,允许使用者根据不同条件组装 SQL 语句。
-
在 MyBatis 中,提供了使用 Mapper 的接口编程,进一步简化了使用者的工作,使开发者能集中于业务逻辑,而非 Dao 层的编写。
MyBatis 的持久化解决方案将用户从原始的 JDBC 访问中解放出来,用户只需要定义需要操作的 SQL 语句,无须关注底层的 JDBC 操作,就能以面向对象的方式进行持久化层操作。底层数据库连接的获取、数据访问的实现、事务控制等都无须用户关心。
<!-- mysql 数据库驱动包 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version> <!-- 最新8.0.33 -->
</dependency><!-- mybatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version> <!-- 最新3.5.13 -->
</dependency>
2. MyBatis 的体系结构
MyBatis 中的常用对象有 SqlSessionFactory 和 SqlSession 。
SqlSessionFactory 对象是 MyBatis 的关键对象,它对应着单个数据库。
XML 配置文件
└── SqlSessionFactoryBuilder└── SqlSessionFactory└── SqlSession
整个关系可以如下述这样"反推":
-
最终是需要获得一个 SqlSession 对象来操作数据库。SqlSession 对象代表着与数据库之间的连接。
-
要"弄"到 SqlSession 对象,首先要先"弄"到一个 SqlSessionFactory 对象。
-
要"弄"到 SqlSessionFactory 对象,首先要先"弄"到一个 SqlSessionFactoryBuilder 对象。
-
而在这个整个过程中,需要用到 “1 + N” 个配置文件。
// 这是一个相对于 classpath 的文件路径名。而且,不需要使用 / 。
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
SqlSession session = factory.openSession(true);...
[!warning] 注意
使用完 SqlSession 之后『关闭 Session 很重要』,应该确保使用 finally 块来关闭它。
- 一个 MyBatis 应用程序只需要一个 SqlSessionFactory 的对象。因此,SqlSessionFactory 对象应该是『单例对象』。在将 Mybatis 和 Spring 整合后,毫无疑问,SqlSessionFactory 单例对象的创建工作就交到了 Spring 手里。
` - SqlSession 是线程不安全的,所以 SqlSession 对象是非单例的。
3. 使用 XML 构建 SqlSessionFactory
MyBatis 中的 XML 文件分为两类,一类是『基础配置文件』(也叫『核心配置文件』),它只有一个。另一类是『映射文件』,它至少有一个。合计是 1 + N
个配置文件。
『基础配置文件』通常叫做 mybatis-config.xml 文件。
<?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><!-- 别名。非必须。<typeAliases><typeAlias alias="dept" type="com.xja.scott.bean.Department"/></typeAliases>
--><!-- 数据库环境。必须。--><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/scott?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai"/><property name="username" value="root" /><property name="password" value="123456" /></dataSource></environment></environments><!-- 映射文件。必须。--><mappers><!--这是一个相对于 classpath 的路径名。另外,不需要使用 / 。 --><mapper resource="mapper/DeptMapper.xml" /></mappers></configuration>
-
<typeAlias> 元素为一个类定义了一个别名,这样在后续使用该类时,可以直接使用别名,而不是它的完全限定名。
-
<environment> 元素描述了一个数据库相关信息。
-
它里面的 <transactionManager> 元素配置了『事务管理器』 ,这里采用的是 MyBatis 的 JDBC 管理器方式。
-
它里面的 <dataSource> 元素配置了数据库连接的相关信息,其中属性 type=“POOLED” 表示采用 MyBatis 内部提供的连接池方式。
-
-
<mapper> 元素代表引入指定的 Mapper 配置文件。
为了加载 XML 配置文件来构建 SqlSessionFactory 对象。MyBaits 专门提供了 Resources 类来加载配置文件。
String resource = "mybatis-config.xml";
SqlSessionFactory factory = null;
InputStream is = null;try {is = Resources.getResourceAsStream(resource);factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {e.printStackTrace();
}
[!attention] 注意
Mybatis 对核心配置文件中的内容(子元素) 出现的『先后顺序有要求』,你可以没有使用到某个子元素,但是如果你用到了,那么必须符合固定的先后顺序:
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
4. SqlSession
SqlSession 是 MyBatis 的核心接口。SqlSession 的作用类似于 JDBC 中的 Connection 对象,代表着一个数据库的连接。
它的作用有 3 个:
-
获取 Mapper 接口。
-
发送 SQL 给数据库。
-
控制数据库事务。
有了 SqlSessionFactory 创建 SqlSession 就十分简单了:
SqlSession sqlSession = factory.openSession();
// 相当于
SqlSession sqlSession = factory.openSession(false);
由此可见,SqlSession 默认『未开启』事务的自动提交(autoCommit)功能。因此需要程序员手动操作事务。
另外,如果在建表时,有意或无意使用的是 MyIsam 引擎,那么此处无论是 true ,或者 false ,都无法回滚,因为 MyIsam 数据库引擎本身就不支持事务功能(这是它与 InnoDB 引擎的重要区别之一)。
对初学者而言,建表是错误地使用了数据库引擎,而导致『事务不回滚』的常见原因。
SqlSession session = null;try {session = factory.openSession();// some code ...session.commit(); // 提交事务
} catch (Exception e) {session.rollback(); // 回滚事务
} finally {if (session != null)session.close(); // 务必确保关闭 session
}
5. 默认的别名
别名 | Java 类型 | 是否支持数组 | 别名 | Java 类型 | 是否支持数组 |
---|---|---|---|---|---|
_byte | byte | Y | byte | Byte | Y |
_short | short | Y | short | Short | Y |
_int | int | Y | int | Integer | Y |
_integer | int | Y | integer | Integer | Y |
_long | long | Y | long | Long | Y |
_float | float | Y | float | Float | Y |
_double | double | Y | double | Double | Y |
_boolean | boolean | Y | boolean | Boolean | Y |
decimal | BigDecimal | Y | bigdecimal | BigDecimal | Y |
string | String | Y | date | Date | Y |
object | Object | Y | collection | Collection | — |
map | Map | —— | hashmap | HashMap | —— |
6. 补充
<environments default="..."><environment id="..."><transactionManager type="..."/><dataSource type="..."><property name="driver" value="..."/><property name="url" value="..."/><property name="username" value="..."/><property name="password" value="..."/></dataSource></environment>
</environments>
<transactionManager type=“…”/> 表示事务管理器配置,可选值有:JDBC 和 MANAGED 。
属性值 | 说明 |
---|---|
JDBC | 这个配置表示 MyBatis 底层使用 JDBC 中的 Connection 对象进行事务的提交和回滚。 |
MANAGED | 这个配置表示 MyBatis 底层不进行任何事物的提交和回滚操作,而是由『别人』(容器)来进行事务的操作。 不过,默认情况下它会关闭连接,而有些容器并不希望如此, 所以通常使用子元素 <property name=closeConnection" value="false"/> 来取消这种行为。 |
在整合 Spring 和 MyBaits 时,不需要在此配置事务管理器,因为 Spring 会使用其自身的事务管理器来覆盖此处的配置。
<dataSource type=“…”> 表示数据源配置,其可选值有:UNPOOLED 、POOLED 和 JNDI 。
属性值 | 说明 |
---|---|
UNPOOLED | 表示不使用连接池,因此每次请求都会打开/关闭连接。 |
POOLED | 表示使用 MyBatis 内部的数连接池功能,此时在底层 Connection 对象会被复用。 |
JNDI | 这表示这数据库连接由容器维护。使用较少。 |
相关文章:

MyBatis基础之概念简介
文章目录 基本概念1. 关于 MyBatis2. MyBatis 的体系结构3. 使用 XML 构建 SqlSessionFactory4. SqlSession5. 默认的别名6. 补充 [注意] 放前面前 很多人可能在使用 MyBatis-plus 进行代码开发,MyBatis的这部分内容是用来更好的讲述之后的内容。 基本概念 1. 关于…...

解决 SQLyog 连接 MySQL8.0+ 报错:错误号码2058
文章目录 一、问题现象二、原因分析三、解决方案1. 方案1:更新SQLyog版本2. 方案2:修改用户的授权插件3. 方案3:修复my.cnf 或 my.ini配置文件 四、最后总结 本文将总结如何解决 SQLyog 连接 MySQL8.0 时报错:错误号码2058 一、问…...

Linux内核4.14版本——drm框架分析(11)——DRM_IOCTL_MODE_ADDFB2(drm_mode_addfb2)
目录 1. drm_mode_addfb2 2. drm_internal_framebuffer_create 3. drm_fb_cma_create->drm_gem_fb_create->drm_gem_fb_create_with_funcs 4. drm_gem_fb_alloc 4.1 drm_helper_mode_fill_fb_struct 4.2 drm_framebuffer_init 5. 调用流程图 书接上回,使…...
mysql的date_format()函数格式月份的坑
问题背景 我表中有个字段存的是“年-月”格式的字符串,格式是这样的:‘2023-08’ 在查询这个表数据时,我使用了如下sql语句: select * from car where date_format(car_start_month,%Y-%m)<2023-08 意思是查询 car_start_mo…...

保姆级式教程:教你制作电子画册
在这个数字化时代,电子画册成为了展示和分享作品的一种流行方式。制作一个精美的电子画册不仅可以展示你的创意和才华,还可以吸引更多人的关注和欣赏。下面告诉大家一些小步骤,带你一步步学习如何制作电子画册。 1.收集和整理作品 接下来&am…...

探究Nginx应用场景
1 静态资源 Nginx是一个流行的Web服务器和反向代理服务器,它可以用于托管静态资源。下面是一个简单的案例,展示了如何使用Nginx来提供静态资源。 假设你有一个名为example.com的域名,并且你希望使用Nginx来托管位于/var/www/html目录下的静…...

sklearn中的数据集使用
导库 from sklearn.datasets import load_iris 实现 # 加载数据集 iris load_iris() print(f查看数据集:{iris}) print(f查看数据集的特征:{iris.feature_names}) print(f查看数据集的标签:{iris.target_names}) print(f查看数据集的描述…...

LLM在电商推荐系统的探索与实践
本文对LLM推荐的结合范式进行了梳理和讨论,并尝试将LLM涌现的能力迁移应用在推荐系统之中,利用LLM的通用知识来辅助推荐,改善推荐效果和用户体验。 背景 电商推荐系统(Recommend System,RecSys)是一种基于用…...
Linux 文本操作指令
Linux操作系统提供了许多用于处理文本文件的命令和工具。以下是一些常用的Linux文本命令: cat: 用于查看文本文件的内容,也可以用于合并多个文件。 cat 文件名more和less: 用于逐页查看文本文件,特别是对于大型文件。 …...

GIS地图服务数据可视化
GIS地图服务数据可视化 OSM(Open Street Map,开放街道地图)Bing地图(必应地图)Google地图(谷歌地图) 地图服务数据可视化是根据调用的地图服务请求Web服务器端的地图数据,实现地图数…...
java 获取实体类的反射 Field用法(获取对象的字段名和属性值) 包含注解值 - 如何用枚举类映射获取数据库字段名
实体类映射数据库字段的设计思路 初始思路: 使用 java 的反射 Field 通过注解方法获取实体类属性的注解值,但是如果遇到不是标准的数据库映射的注解方法,那么就无法拿到对应的数据库映射字段名,所以这一点被笔者舍弃了。 什么是标准的映射注解方法,即导入方法后带 anno…...

日志平台搭建第六章:logstash通过kafka通道采集日志信息
1.修改文件/opt/app/elk/logstash-7.5.1/config.d/config1.conf,在input下添加kafka采集配置 #192.168.128.130:9103:kafka地址 #topics:主题 kafka {bootstrap_servers > ["192.168.128.130:9103"]group_id > "logstash"topics > [&…...

mysql的索引分类
索引分类 在 MySQL 数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。 分类 含义 特点 关键字 主键 索引 针对于表中主键创建的索引 默认自动创建 , 只能 有一个 PRIMARY 唯一 索引 避免同一个表中某数据列中…...

【校招VIP】java语言考点之并发相关
考点介绍: 并发在操作系统中是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。并发相关问题在校招面试中出现频次很高。 java语言考点之并发相…...

nginx实现路由重定向功能 避免服务器出现 404 Not Found
首先 到服务器上 vue react等项目路由的重定向已解决不了带后缀的访问 这个重定向需要 nginx 来实现 我们先执行 scp -r 用户名 如果没设置过就是root服务器公网地址:/etc/nginx/nginx.conf E:/拷贝地址这里 我将服务器上的nginx配置文件 拷贝到了本地的 E盘下的 拷贝地址目录…...
Flask+pyecharts+SQLAlchemy,统计图的数据存放在mysql中,综合版
ISEE小语 有人问:“世上最廉价的东西是什么?” 在网上看到这样一个回答说: “大概就是付出吧,一贫如洗的真心、一事无成的温柔、一厢情愿的等待。” 回顾上篇 此篇是在【Flask+pyecharts结合,html统计图呈现在前端页面】和【Flask+pyecharts结合,优化前端加导航栏显示】的…...

SQL注入类型判断
SQL注入的类型分为字符型和数字型,以sqli-labs靶场1、2关为例: 第一关 第一关注入一个1’,错误回显出下面内容,其中1’是注入的内容,0,1后面的单引号和最前面的单引号是一对,剩下的两个单引号是一对&#…...

ElasticSearch的安装部署-----图文介绍
文章目录 背景什么是ElasticSearch使用场景 ElasticSearch的在linux环境下的安装部署前期准备分配权限(正式实操)启动ElasticSearch创建用户组创建用户,并设置密码用户添加到elasticsearch用户组指定用户操作目录的一个操作权限切换用户 解压elasticsearch修改es的配…...
Unity粒子系统ParticleSystem各模块及其参数学习
粒子系统控制面板默认有4个模块:Particle System(主模块),Emission(发射模块), Shape(形状模块),Renderer(渲染器模块) 1.Particle …...
vue3实现卡片翻牌
vue3实现塔罗牌翻牌 前言一、操作步骤1.布局2.操作3.样式 总结 前言 最近重刷诡秘之主,感觉里面的塔罗牌挺有意思,于是做了一个简单的塔罗牌翻牌动画(vue3vitets) 一、操作步骤 1.布局 首先我们定义一个整体的塔罗牌盒子&…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...