MyBatis基础之概念简介

news2025/1/12 23:17:39

在这里插入图片描述

文章目录

  • 基本概念
    • 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 中的常用对象有 SqlSessionFactorySqlSession

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 configuration
  PUBLIC "-//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&amp;characterEncoding=utf-8&amp;useSSL=false&amp;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(数据源)
  • 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 类型是否支持数组
_bytebyteYbyteByteY
_shortshortYshortShortY
_intintYintIntegerY
_integerintYintegerIntegerY
_longlongYlongLongY
_floatfloatYfloatFloatY
_doubledoubleYdoubleDoubleY
_booleanbooleanYbooleanBooleanY
decimalBigDecimalYbigdecimalBigDecimalY
stringStringYdateDateY
objectObjectYcollectionCollection
mapMap——hashmapHashMap——

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=“…”/> 表示事务管理器配置,可选值有:JDBCMANAGED

属性值说明
JDBC这个配置表示 MyBatis 底层使用 JDBC 中的 Connection 对象进行事务的提交和回滚。
MANAGED这个配置表示 MyBatis 底层不进行任何事物的提交和回滚操作,而是由『别人』(容器)来进行事务的操作。
不过,默认情况下它会关闭连接,而有些容器并不希望如此,
所以通常使用子元素 <property name=closeConnection" value="false"/> 来取消这种行为。

在整合 Spring 和 MyBaits 时,不需要在此配置事务管理器,因为 Spring 会使用其自身的事务管理器来覆盖此处的配置。

<dataSource type=“…”> 表示数据源配置,其可选值有:UNPOOLEDPOOLEDJNDI

属性值说明
UNPOOLED表示不使用连接池,因此每次请求都会打开/关闭连接。
POOLED表示使用 MyBatis 内部的数连接池功能,此时在底层 Connection 对象会被复用。
JNDI这表示这数据库连接由容器维护。使用较少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-JavaScript - ISODD函数

描述 如果数字为奇数,则ISODD函数返回TRUE,如果数字为偶数,则返回FALSE。 语法 ISODD (number) 争论 Argument描述Required/OptionalNumber 要测试的值或表达式。 如果number不是整数,则将其截断。 Required Notes 您可以在执行计算之前使用此功能测试单元格的内容。 如果…

微服务 第一章 Java线程池技术应用

系列文章目录 第一章 Java线程池技术应用 文章目录 系列文章目录[TOC](文章目录) 前言1、Java创建线程方式回顾1.1、继承Thread类(只运行一次)1.1.1、改造成主线程常驻&#xff0c;每秒开启新线程运行1.1.2、匿名内部类1.1.3、缺点1.1.4、扩展知识&#xff1a;Java内部类1.1.4…

Python 内置函数详解 (2) 逻辑运算

近期在外旅游,本篇是出发编辑的,准备定时发布用,不完整,旅游回来后再补充。 Python 内置函数 Python3.11共有75个内置函数,其来历和分类请参考:Python 新版本有75个内置函数,你不会不知道吧_Hann Yang的博客-CSDN博客https://blog.csdn.net/boysoft2002/article/detai…

SOLIDWORKS PDM—数据库的备份计划

SOLIDWORKS产品数据管理 (PDM) 解决方案可帮助您控制设计数据&#xff0c;并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用 SOLIDWORKS PDM Professional&#xff0c;您的团队能够&#xff1a;1. 安全地存储和索引设计数据以实现快速检索&#xff1b;2. 打消关于…

Linux——进程间通信(管道及共享内存)

目录 0. 前言 1. 进程通信的目的 2. 进程通信发展及分类 3. 进程通信匿名管道 3.1 什么是管道&#xff1f; 3.2 匿名管道系统调用 3.3 fork后子进程继承&#xff08;基于内存级&#xff09; 3.4 站在文件描述符角度-深度理解管道 3.5 站在内核角度-管道本质 3.6 父子…

电动车彻底取代燃油车?瑞士限制,中国每天烧7辆,现实不乐观

随着新能源汽车在国内汽车市场的销量占比突破三成&#xff0c;业界对于电动汽车取代燃油车相当乐观&#xff0c;然而电动汽车存在的不少问题却不容忽视&#xff0c;这正逐渐成为电动汽车普及的巨大障碍。 电动汽车如今面临的问题不少&#xff0c;最让消费者吐槽的是充电问题&am…

python自学

自学第一步 第一个简单的基础&#xff0c;向世界说你好 启动python 开始 print是打印输出的意思&#xff0c;就是输出引号内的内容。 标点符号必须要是英文的&#xff0c;因为他只认识英文的标点符号。 exit&#xff08;&#xff09;推出python。 我们创建一个文本文档&…

删除数组中的重复项——双指针

双指针法&#xff0c;说是双指针其实就是在一个数组中定义两个数组下标变量&#xff0c;通过两个下标的移动和赋值来实现 代码&#xff1a; int removeDuplicates(int* nums, int numsSize){int left1; int right1; while(left<numsSize) {if(nums[left]!nums[left-1]){num…

耐蚀合金连续油管最新版 学习记录

声明 本文是学习GB-T 42858-2023 耐蚀合金连续油管. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了耐蚀合金连续油管的订货、材料、制造、检验试验、标记等。 本文件适用于油气井用耐蚀合金连续油管(以下简称"油管")…

2023备战秋招Java面试八股文合集

Java就业大环境仍然根基稳定&#xff0c;市场上有很多机会&#xff0c;技术好的人前景就好&#xff0c;就看你有多大本事了。小编得到了一份很不错的资源&#xff0c;建议大家可以认真地来看看以下的资料&#xff0c;来提升一下自己的核心竞争力&#xff0c;在面试中轻松应对面…

易基因: MeRIP-seq等揭示组蛋白乙酰化和m6A修饰在眼部黑色素瘤发生中的互作调控|肿瘤研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 组蛋白去乙酰化抑制剂(HDACis)在多种恶性肿瘤中显示出令人鼓舞的结果。N6-甲基腺嘌呤(m6A)是最普遍的mRNA修饰&#xff0c;在肿瘤发生调控中起重要作用。然而&#xff0c;对组蛋白乙酰化…

美国海运价格,美国专线直达怎么收费?

美国海运价格是根据多个因素来确定的&#xff0c;包括货物的重量、体积、目的地、起运港口和目的港口之间的距离、运输方式(整箱或拼箱)以及货物的特殊要求等。以下是一些常见的影响美国海运价格的因素&#xff1a; 一、货物重量和体积&#xff1a; 货物的重量和体积是计算海运…

esxi扩容磁盘

esxi扩容磁盘 fdisk -l没用扩容 登录Esxi管理界面扩容磁盘 进入服务器查看 没用变化 &#xff08;有些可能进去磁盘就是更新&#xff0c;直接就是扩容的&#xff0c;但是没扩容就需要执行下面的命令&#xff09; [root234-ces /]# fdisk -l Disk /dev/sda: 85.9 GB, 858993…

uniapp 轮播列表左右滑动,滑动到中间放大

html <!-- 轮播 --><view class"heade"><swiper class"swiper" display-multiple-items3 circulartrue previous-margin1rpxnext-margin1rpx current0 change"swiperChange" ><block v-for"(item,index) in list"…

武汉便宜的ov通配符https证书

通配符https证书是一种特殊的数字证书&#xff0c;可以用于保护单个域名的所有一级子域名。这意味着&#xff0c;使用单个通配符证书&#xff0c;您可以保护主域名及其所有一级子域名的安全&#xff0c;而无需为每个子域名购买独立的证书。 而通配符https证书中的OV企业型证书能…

投放ASA广告的注意事项

ASA展示位置已不仅仅局限于传统的搜索结果&#xff0c;还包括“today”选项卡、“搜索”选项卡和单个应用产品页面上的广告。ASA的最终目标是帮助我们的应用程序呈现给更多用户并增加下载量。虽然创建和运行Apple Search Ads广告系列看似简单&#xff0c;但细节决定成败。 1、…

【面试小姿势】数据库设计的三大范式及其应用

前言&#xff1a; 今天和大家探讨一道最近的面试题&#xff0c;面试回答描述的不是很清楚&#xff0c;所以在此记录一下。本篇文章主要讲解Java类加载机制的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff…

扩展pytest接口自动化框架-MS数据解析功能

开篇 MeterSphere的数据源通过html页面上传后&#xff0c;需要将请求方式进行拆分。 get接口的参数&#xff0c;常以params的方式进行传参&#xff0c;也就是在url后带上参数。 post接口一般是以json字符串的形式传参&#xff0c;也有params方式进行传参的。而在MeterSphere里…

三方检测-渗透测试问题及问题处理

文章目录 省流具体问题信息遍历【高风险】描述举例解决方案 任意文件上传【高风险】描述解决方案 邮箱验证码等轰炸【中风险】描述解决方案 用户名轰炸【高风险】描述解决方案 错误信息返回敏感信息【高风险】描述举例解决方案 明文传输漏洞【高风险】描述举例解决方案 点击劫持…

优思学院|防呆防错的英语怎么说?

许多学生都曾经问过一个常见而有趣的问题&#xff1a;防呆的英文究竟是什么&#xff1f;他们之所以感到困惑&#xff0c;是因为在不同的场合听到了很多不同的表述&#xff0c;比如Mistake Proofing、Error Proofing、Fool Proofing等等。在本文中&#xff0c;我们将详细解答这个…