MyBatis源码初始

news2025/1/16 4:57:06

在这里插入图片描述
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏: MyBatis源码解读
✨特色专栏: MySQL学习
🥭本文内容:MyBatis源码初始
🖥️个人小站 :个人博客,欢迎大家访问
📚个人知识库: Leo知识库,欢迎大家访问

学习参考 : Mybatis3源码完全解读:从零到精通

大家好,我是Leo🫣🫣🫣,从今天开始跟着孙帅老师一起学习MyBatis3的源码学习,这个系列记录着MyBatis3源码学习的笔记和思考,

让我们开始吧😎😎😎。

1. MyBatis回顾

1.1 关于开发环境

下面是笔者本次学习MyBatis源码的开发环境,大家可以进行参考。

1. JDK8
2. IDEA2023.2
3. Maven3.8
4. MySQL 8.0.32 --> MySQL 8 即可
5. Mybatis 3.4.6

1.2 Mybatis开发的简单回顾

1. 什么是Mybatis

MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由 apache software foundation 迁移到了google code,并且改名为MyBatis。MyBatis是一个基于Java的持久层框架Mybatis是一个ORM类型框架,解决的数据库访问和操作的问题,对现有JDBC技术的封装。

2. 为什么使用MyBatis?

我们以前在没有ORM框架的情况下,如果你要开发一个Web应用程序的话,你就必须要使用传统的JDBC代码来操作数据库,我们除了需要自己提供 SQL 外,还必须操作 Connection、Statment、ResultSet等,不仅如此,为了访问不同的表,不同字段的数据,我们需要些很多雷同模板化的代码,而这些代码写起来往往是重复的,写起来又繁琐又枯燥。

1.3 搭建MyBatis开发环境

1.导入依赖
 <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
     </dependency>
     <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>8.0.32</version>
</dependency>
2.创建表以及编写实体类

表SQL

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(255) DEFAULT NULL COMMENT '名称',
  `password` varchar(255) DEFAULT NULL COMMENT '密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

编写实体类

package org.javatop.pojo;

/**
 * @author : Leo
 * @version 1.0
 * @date 2023-10-17 21:22
 * @description : 用户实体类
 */
public class User {
   private Integer id;
   
   private String name;


    public User() {
    }

    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
3.编写mapper文件以及mapper映射文件

mapper文件

package org.javatop.mapper;

import org.javatop.pojo.User;

import java.util.List;

/**
 * @author : Leo
 * @version 1.0
 * @date 2023-10-17 21:27
 * @description : mapper文件
 */

public interface UserMapper {


    /**
     * 查询所有用户信息
     * @return
     */
     List<User> selectUserList();
}

mapper映射文件

<select id="selectUserList" resultType="User">
        select id,name,password from user
</select>
4.准备配置文件

编写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 type="org.javatop.pojo.User" alias="User"/>
    </typeAliases>


    <environments default="default">
        <environment id="default">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/suns?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--<package name=""-->
        <mapper resource="UserMapper.xml"/>
    </mappers>

</configuration>
5.编写测试类

编写测试类TestMyBatis

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.javatop.mapper.UserMapper;
import org.javatop.pojo.User;
import org.junit.Test;

import org.apache.ibatis.io.Resources;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author : Leo
 * @version 1.0
 * @date 2023-10-17 9:55
 * @description : MyBatis基本开发测试
 */
public class TestMyBatis {

    /**
    * 用于测试: MyBatis基本开发的第一种
    */
    @Test
    public void test01() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        List<User> userList = userMapper.selectUserList();

        for (User user : userList) {
            System.out.println("user = " + user);
        }
    }
}

运行结果:

image-20231017215356172

思考:除了这种方式,是否还有其它方式呢?

其实对于大家来说,很多是没有见过这种方式开发方式的,往远的说,其实就是MyBtis的前身了,ibatis ,笔者公司的老项目用的正是ibatis,话不多说,直接上代码。

/**
    * 用于测试:MyBatis 基本开发的第二种方式
    */
    @Test
    public void test02() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<User> userList =  sqlSession.selectList("org.javatop.mapper.UserMapper.selectUserList");
        userList.forEach(System.out::println);
    }

这种方式是通过每个mapper文件中的 namespace + 接口名称 来确定我们的mapper接口。虽然也能实现我们查询所有用户的功能,但是这样看起来可读性是不是太差了。其实两种方式功能等价 ,实现效果也是一样的。

区别:

第一种方式好 表达概念更清晰
第一种开发,本质上就是对第二种开发的封装。

1. 编写实体类entity
2. 类型别名
3. 创建表table 
4. mapper接口
5. Mapper文件
6. Mapper文件的注册
7. JavaAPI编程 

2. MyBatis的核心对象

2.1 MyBatis的核心对象

1. 前言知识补充

Mybatis是对JDBC的封装,将JDBC封装成了一个核心的SQLSession对象。
JDBC当中的核心对象:Connection、Statement、ResultSet。

  • Statement:普通的Statement
  • PeparedStatement:预编译 Statement
  • CallableStatement:适用于存储过程Statement

注意:Mybatis中使用的是PeparedStatement预编译。

通过这些Statement与我们的数据库进行交互,然后由我们的结果集对象ResultSet对象进行封装。

SqlSession是对以上内容进行了封装。

相对于以上来讲,SQLSession是对JDBC的封装,SQLSessionFactory是创建SQLSession对象的工厂,我们还基于mybatis-config.xml配置

Mybatis,并且在Mapper.xml当中配置SQL,了解到这里我们对于Mybatis的认知就比较权限

在Java中,或者说在JVM当中对Mybatis相关的配置信息进行封装。这里边设计到很多的配置文件,我们不可能说用点就读一次文件,这样会有极大的

IO,IO是操作系统层面的资源,他的创建绝不是虚拟机单独完成的,是很耗时的,少操作或者能复用最好。 对于这种东西,我们都是在程序启动时一次性

读取,存储在Java对象当中

MyBatis当中的配置信息一共有两种:mybatis-config.xml和userMapper.xml。

其中mybatis-config.xml封装成了org.apache.ibatis.session.Configuration对象,DAOMapper.xml封装成了MapperdStatement部分数

据是在Configuration当中进行保存的。

基于以上,我们可以知道在Mybatis当中有两类对象:数据储存类对象 + 操作类对象。

2. 数据存储类对象
1.1 初始Configuration

概念:在Java中(JVM)对Mybatis相关的配置信息进行封装。

Configuration是数据存储类对象,是将Mybatis当中的mybatis-config.xml封装成Configuration对象,Mapper.xml封装成了MappedStatement对象,当然MappedStatement这样表述不是特别完整。

简单来讲Configuration的作用:

  1. 封装了mybatis-config.xml。
    1. 封装了mapper文件MappedStatement。
  2. 创建Mybatis其他相关的对象。
1.2 初始MapperSatement

对应的就是Mapper文件中的一个一个的配置标签

  <select id. -----> MappedStatement
  <insert id. -----> MappedStatement     
  注定 一个Mybatis应用中 N个MappedStament 对象 
  MappedStatment ---> Configuration 
1.3 mybatis-config.xml与Configuration属性的映射关系

我们打开Configuration的源码可以得知,在Configuration中定义了大量的mybatis-config.xml中的标签,比如: environmentssettingstypeAliasesMappers 等标签。

image-20201228204347155

分析:

caches,parameterMaps,resultMaps,MapperdStatement,keyGenerators 这些是把Mapper.xml文件中的内容进行了封装。
resultMaps:所有的Mapper.xml文件中resultMap标签。
parameterMaps:是对sql标签上的parameterMap是属性做了处理。

上边这些属性都加了S都代表了是复数,也就是他的数量不只一个。这玩意存储的不是公共的,而是所有的。里边存储了对于所有的Mapper.xml文件中的这些属性都封装到这里边了。

这些不仅仅要存还要用,所以是将他们存入到了一个Map中,他是有key的,他的key就是namespace.id。所以你就发现这一组。这些对象封装到Configuration对象中之后都是采用的Map<String,xxx>这样的形式,key是namespace.id 的形式。

1.4 Configuration对象的作用

作用1: 封装Mybatis-Config.xml先关的内容。
environments属性,封装的environments标签
typeAliases标签(实体全限定类型和简称的映射)这个也在Configuration当中也有封装
Mappers标签,我们在Configuration当中也是有对象进行对应的。其中对应的是 Set loadResources
到这,Mybatis-config.xml所有的标签,我们在configuration对象当中就都可以找到了。

作用二: Configuration将xxxMapper.xml封装成了MapperStatment对象组放到了Configurantion对象中进行引用。
Configuration中的属性是Map<String,MappedStatement> mappedStatements 其中的String还是nameSpace.id
Configuration对象还包括:还有其他的结果集,参数,使用返回参数key(caches,parameterMaps,resultMaps,MapperdStatement,keyGenerators )等等。

作用三: 他的第三个核心作用就是帮我们创建:Mybatis其他涉及到的核心对象也创建出来,所以我们认为他是Mybatis当中最为核心的对象。
在这里可以认为Configuration实现是这些对象的执行对象的工厂对象。

作用4: SQL映射配置管理:Configurationi对象负责管理应用程序的SQL映射配置信息。它可以读取和解析Mapper接口或XML文件,将SQL语句与数据库操作进行映射关联。Configuration对象维护了一个用于存储$QL映射配置的集合,其中包含了每个SQL语句的信息,如语句类型(INSERT、SELECT、UPDATE、DELETE)、参数映射、结果映射等。

总的来说,Configuration对象在MyBatis框架中承担着配置管理和资源管理的职责,负责管理数据源、SQL映射配置、对象工厂、对象包装器和插件等重要组件,以保证MyBatis的正常运行和提供灵活的配置和扩展能力。

1.5 MappedStatement对象

我们可以打开Configuration的源码中可以找到MapperStatement

image-20231018100247991

通过ctrl + B 点进去查看

image-20231018100336038

可以发现 MappedStatement对象,也是一个存储了对象,存储的是Mapper文件中的Statement也就是我们定义的SQL标签,其中封装的是我们Mapper文件中的一个个标签,举例来讲 其中一个标签就会被封装成MappedStatement对象

我们的标签当中肯定会有id的属性,在我们的MappedStatement当中也会有id的属性。id属性完全唯一,他存储的是namespace.id所以,也是唯一,注定了在一个Mabatis当中会有N个MapperStatement对象。

这里边的statementType是什么意思,指的就是普通,预编译,存储过程。默认使用的就是preparedStatement,所以在我们的SQL标签上也肯定有这个属性,这个属性默认一定是prepared。

注意:MappedStatement当中可以找到Configuration对象,Configurantion对象可以找到MapperdStatement对象,他俩互相引用,双向关联,可以互相找到。

3.总结

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。

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

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

相关文章

首饰上亚马逊合规认证RSL报告

首饰 首饰是一种古老而又流行的装饰品&#xff0c;它们不仅可以点缀女性的美丽&#xff0c;还可以表达个人的品味和风格。首饰的种类繁多&#xff0c;有耳环、项链、手镯、戒指等&#xff0c;每一种都有自己的特点。 随着人们对珠宝首饰的要求越来越高&#xff0c;为了确保珠宝…

uni-app小程序使用DCloud(插件市场)流程

一、DCloud&#xff08;插件市场&#xff09; DCloud 是uni-app官方插件市场&#xff0c;里面有官方、团队、个人发布的众多插件&#xff0c;包括uni-ui、uni-pay 等。而像uni-ui这种大型组件库都有官方文档可参考&#xff0c;但一些团队或个人发布的小型插件没有文档&#xf…

Python调用c++生成的dll

Python调用c生成的dll 1.简单例子1.1 vs2019 c生成dll1.2 Python端调用 2.调用c类生成的dll2.1 vs cpp端生成dll2.2 Python端调用 参考文献 1.简单例子 1.1 vs2019 c生成dll 项目中添加add.cpp文件 extern "C" int __declspec(dllexport) add(int x, int y) {retu…

SpringBoot + Disruptor 实现特快高并发处理,支撑每秒 600 万订单无压力!

背景 工作中遇到项目使用Disruptor做消息队列&#xff0c;对你没看错&#xff0c;不是Kafka也不是rabbitmq。Disruptor有个最大的优点就是快&#xff0c;还有一点它是开源的哦&#xff0c;下面做个简单的记录。 Disruptor介绍 Disruptor 是英国外汇交易公司LMAX开发的一个高…

中国式复杂报表制作工具及技巧,解决90%效率问题

最大的数据杀手——中国式复杂报表 作为资料人&#xff0c;在日常生活和工作之中&#xff0c;我们是否经常被要求制作如下图所示的一些数据统计表格&#xff1a; 总的来看&#xff0c;很多人经常发现自己虽然有数据&#xff0c;却不知道用什么图表来进行数据最佳形式的价值表…

「我在淘天做技术」一篇文章告诉你商品团队在做哪些有意思的事?

作者:许令波(君山) 近期淘天集团秋季 2024 届校园招聘正式启动&#xff0c;预计将发放 2000 多个 offer&#xff0c;其中技术类岗位占比超过 50%。为了方便大家更真实地了解淘天技术的布局和现状&#xff0c;我们策划了「我在淘天做技术」系列&#xff0c;首次全面分享淘天技术…

【限时优惠】RHCE9.0培训考证-红帽官方授权中心

【微|信|公|众|号&#xff1a;厦门微思网络】 官网&#xff1a; www.xmws.cn 相信关注红帽认证的小伙伴都已经知道了&#xff1a;2022 年 5 月 18 日&#xff0c;红帽公司宣布推出红帽企业 Linux 9 (RHCE 9)&#xff0c;这是世界领先的企业 Linux 平台的最新版本。 特别提醒的是…

怎样成功部署CRM销售管理系统?

部署CRM销售管理系统可以是自上而下的落实&#xff0c;也可以自下而上让基层员工提出他们的建议&#xff0c;毕竟他们才是系统的使用者。成功部署CRM销售管理系统离不开以下几点要素&#xff1a; 1、全渠道沟通 在通讯技术发达的今天&#xff0c;人们可以在任何地方进行视频通…

Unity3D Shader新手入门教程:3D溶解与腐蚀特效详解

引言 在游戏开发中&#xff0c;特效是非常重要的一部分&#xff0c;它能够增加游戏的趣味性和可玩性。其中&#xff0c;Shader特效是一种非常常见和常用的特效&#xff0c;它能够通过改变物体表面的渲染方式来实现各种各样的特效效果。本文将详细介绍Unity3D中的Shader 3D溶解与…

华为云应用中间件DCS系列—Redis实现(电商网站)秒杀抢购示例

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;应用中间件系列之Redis实现&#xff08;电商网站&#xff09;秒杀抢购示例 1 什么是DEVKIT 华为云开发者插件&#xff08;Huawei Cloud Toolkit&#xff09;&…

游戏设计模式专栏(十二):在Cocos游戏开发中运用代理模式

点击上方亿元程序员关注和★星标 引言 大家好&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。 本系列是《和8年游戏主程一起学习设计模式》&#xff0c;让糟糕的代码在潜移默化中升华&#xff0c;欢迎大家关注分享收藏订阅。 代理模式&#xff08…

【Tomcat】为Tomcat服务配置本地Apr库以提升性能

关于 apr 和 apr-util 对 Tomcat 服务的性能提升的说明&#xff1a; 要测APR给tomcat带来的好处最好的方法是在慢速网络上&#xff08;模拟Internet&#xff09;&#xff0c;将Tomcat线程数开到300以上的水平&#xff0c;然后模拟一大堆并发请求。如果不配APR&#xff0c;基本…

el-pagination怎么修改样式,分页修改样式

/* 分页距离右边20&#xff0c;距离底边20 */ .pagination-container .el-pagination{position:absolute;right:20px;bottom:20px;} 自己写一个分页组件&#xff0c;用到绝对定位和相对定位

Cornerstone for Mac:高效SVN管理的黄金标准

在当今的软件开发领域&#xff0c;版本控制系统是不可或缺的一部分。其中&#xff0c;Subversion&#xff08;SVN&#xff09;是一个广泛使用的版本控制系统&#xff0c;有助于团队协同工作&#xff0c;实现代码的版本管理和追踪。对于Mac用户来说&#xff0c;Cornerstone是一款…

PLC寄存器基础知识

这篇博客介绍的内容其实是微机原理的相关知识&#xff0c;如果没有修过微机原理&#xff0c;可以找相关书籍看一看&#xff0c;众所知周PLC也是属于微控制器。下面我们看下西门子PLC常用的寄存器地址关系。 1、西门子寄存器地址关系 待续......

togaf入门介绍

TOGAF标准是一个开放的、行业共识的企业架构框架。 它是一个基础框架&#xff0c;这意味着它适用于任何环境下的任何类型的架构的开发。这一基础框架是由The Open Group TOGAF补充的库&#xff0c;该库是一个广泛和不断增长的指导材料组合&#xff0c;为在具体情况下应用TOGAF …

SAP S4 BAPI更新BP税号类型CN0自动覆盖CN5

BAPI更新BP税号类型CN0自动覆盖CN5 使用cl_md_bp_maintain>maintain更新BP税号CN0的数据&#xff0c;更新结果都会变成CN5类型&#xff0c;CN1类型一切正常。 1、BP税号 2、跟踪方法中代码 查看底层逻辑&#xff0c;发现CN0都被强制替换成CN5了&#xff0c;BP GUI界面还能…

MultiPlayerShoot----C++学习记录01打包测试项目

首先将多人游戏插件plug文件夹移至项目目录 打开config/DefaultEngine.ini&#xff08;5.0的虚幻引擎内容略不一样&#xff09;和Game.ini对里边的内容进行编辑。 DefaultEngine.ini [/Script/Engine.GameEngine] NetDriverDefinitions(DefName"GameNetDriver",Driv…

win 10怎么录屏?教你轻松捕捉屏幕活动

在当今科技快速发展的时代&#xff0c;录屏已成为信息分享、教学、游戏直播等方面的重要工具。无论是为了制作教程、分享游戏过程还是保存重要信息&#xff0c;录屏功能都发挥着举足轻重的作用。可是很多人不知道win 10怎么录屏&#xff0c;本文将详细介绍win10的三种常用录屏方…

物流监管:智慧仓储数据可视化监控平台

随着市场竞争加剧和市场需求的不断提高&#xff0c;企业亟需更加高效、智能且可靠的仓储物流管理方式&#xff0c;以提升企业的物流效率&#xff0c;减少其输出成本&#xff0c;有效应对市场上的变化和挑战。 图扑自研 HT for Web 产品搭建的 2D 智慧仓储可视化平台&#xff0c…