Mybatis 源码 ① :开篇

news2024/12/24 0:55:55

文章目录

  • 一、前言
  • 二、项目搭建
  • 三、自动装配
  • 四、总结

一、前言

Mybatis 官网 以及 本系列文章地址:

  1. Mybatis 源码 ① :开篇
  2. Mybatis 源码 ② :流程分析
  3. Mybatis 源码 ③ :SqlSession
  4. Mybatis 源码 ④ :TypeHandler
  5. Mybatis 源码 ∞ :杂七杂八

本系列基于 如下版本 :

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

二、项目搭建

为了方便介绍,我们这里首先简单基于 SpringBoot 搭建一个项目, 由于项目搭建并非本文重点,所以下面仅简单介绍下搭建过程。

  1. Mysql 语句如下:

    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for sys_role
    -- ----------------------------
    DROP TABLE IF EXISTS `sys_role`;
    CREATE TABLE `sys_role`  (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
      `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
      `modify_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
      `role_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
      `status` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Table structure for sys_user
    -- ----------------------------
    DROP TABLE IF EXISTS `sys_user`;
    CREATE TABLE `sys_user`  (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
      `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
      `modify_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
      `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
      `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
      `status` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态',
      `is_delete` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否删除',
      `nick_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '昵称',
      `phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Table structure for sys_user_role
    -- ----------------------------
    DROP TABLE IF EXISTS `sys_user_role`;
    CREATE TABLE `sys_user_role`  (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
      `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
      `modify_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
      `user_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
      `role_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    SET FOREIGN_KEY_CHECKS = 1;
    

    使用 EasyCode-MybatisCodeHelper 生成对应的结构,最终项目结构如下:
    在这里插入图片描述

  2. application.yml 配置内容如下:

    # Spring DB 配置
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&serverTimezone=GMT
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
    # mybatis 配置
    mybatis:
      # Mapper.xml 对应的目录
      mapper-locations: classpath*:mapper/*/*.xml,classpath*:mapper/*.xml
      # Mapper 实体类对应的目录
      type-aliases-package: com.kingfish.dao
      configuration:
        # sql 打印:控制台打印
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    
  3. SysUserDao.xml 中增加一个查询方法, 并暴露出来 http 方法 (sysUser/queryById),如下:

        <!--查询单个-->
        <select id="queryById" resultMap="BaseResultMap">
            select
              id, create_time, modify_time, user_name, password, status, is_delete, nick_name, phone
            from sys_user
            where id = #{id}
        </select>
    

三、自动装配

我们在搭建上面的项目时引入了如下依赖:

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${version}</version>
        </dependency>

这里可以根据依赖名称判断 Mybatis 的引入依赖了 SpringBoot 的 自动装配功能,该依赖引入了如下依赖:

    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-autoconfigure</artifactId>
    </dependency>

其中 spring.factories 内容如下

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration,\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

因此,根据 SpringBoot 的自动装配原理:

当我们引入 mybatis-spring-boot-starter 依赖时 SpringBoot 会自动创建 MybatisLanguageDriverAutoConfiguration 和 MybatisAutoConfiguration 并注入到容器中。MybatisAutoConfiguration 作为一个配置类,向Spring容器中引入了更多的类。我们这里简单介绍几个关键类,在后面的具体代码分析中会有更详细的分析。

  1. SqlSessionFactory :用于创建与 DB 交互的 数据库会话,是 SqlSesion 创建的工厂类,同时内部保存了关于 Mybatis 的各种配置。默认情况下SpringBoot引入的类型是 DefaultSqlSessionFactory,生产出来的SqlSession 是 DefaultSqlSession 类型。

  2. SqlSessionTemplate : SqlSessionTemplate 是 SqlSession 接口的一个实现类,是由 Spring 管理的 SqlSession,线程安全。相较于 DefaultSqlSession,SqlSessionTemplate 将事务的管理交由 Spring框架来控制。默认情况下,SpringBoot 注入的 SqlSession类型是 SqlSessionTemplate。SqlSessionTemplate 会通过 DefaultSqlSessionFactory 创建DefaultSqlSession ,并委托创建的 DefaultSqlSession 来处理具体的DB 交互。这里需要注意 :经由 SqlSessionTemplate 处理的DB交互,其事务都交由 Spring框架来控制,因为 SqlSessionTemplate 在内部创建了一个 SqlSession代理类 sqlSessionProxy,在 sqlSessionProxy 中委托了DefaultSqlSession 来处理 DB

  3. AutoConfiguredMapperScannerRegistrar :被 MapperScannerRegistrarNotFoundConfiguration 通过 @Import 引入,在容器中没有 MapperFactoryBean 和 MapperScannerConfigurer 是才会注入到容器。该类的作用是生成 MapperScannerConfigurer的BeanDefinition 并注册到容器中。而 MapperScannerConfigurer 会在创建时扫描 @Mapper 注解修饰的类生成 BeanDefinition 并注册到容器中。

  4. MybatisProperties : 该类映射了 Mybatis 的配置属性。


四、总结

本文作为一个开篇内容,仅简单介绍了项目搭建和 自动装配的流程,具体流程后面的文章再进行分析。

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

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

相关文章

ubuntu1804系统ROS1和ROS2一键装机

备忘一下ROS1和ROS2的一键装机 原网址:小鱼的一键安装系列 指令: wget http://fishros.com/install -O fishros && . fishros如果想同时安装ROS1和ROS2, 运行两次. fishros, 工具会自动将ROS1和ROS2放在不同的文件目录下 安装完每次打开终端时, 会提示选择ROS1还是RO…

【Linux】应用层协议

【Linux】应用层协议 文章目录 【Linux】应用层协议1、协议作用1.1 应用层需求1.2 协议分类 2、HTTP & HTTPS2.1 HTTP/HTTPS 简介2.2 HTTP工作原理2.3 HTTPS工作原理2.4 区别 3、URL3.1 编码解码3.2 URI & URL 4、HTTP 消息结构4.1 HTTP请求方法4.2 HTTP请求头信息 5、…

思维导图在线制作,10款好用的思维导图在线制作网站推荐!

思维导图的强大作用在于它以直观、易理解的图形方式展现信息&#xff0c;让复杂的内容变得简单明了&#xff0c;极大地提升了我们的学习和工作效率。与传统的手绘思维导图相比&#xff0c;在线思维导图制作工具更具有灵活性和实用性&#xff0c;它们提供了丰富的功能&#xff0…

00|Java中常见错误或不清楚

00. 多变量声明并初始化 同时声明同类型的多变量 String a "Hello", c "hello"; int x 5, y 5;01. 变量类型 01.0 浮点类型 默认是double类型&#xff0c;如果需要指定float类型&#xff0c;可以float f 1.0F; 01.1 类型装换 如果将大的类型转为…

立秋至 | 共建智慧城,秋日硕果时

一缕缕阳光洒向大地 一股股热浪迎面拂来 一声声虫鸣清脆悦耳 一片片黄叶轻声而落 一份份清凉沁入心间 一个个硕果接踵而至 跟随我们一起来回顾下 往期铭控小伙伴们 在助力建设智慧城市 做了哪些努力呢 都做了哪些项目呢 得到了多少客户的认可呢 Part 1 智慧消防 消防…

关于网络入侵检测领域使用Spark/Flink等计算框架做分布式

关于网络入侵检测领域使用Spark/Flink等计算框架做分布式 0、引言1 基于LightGBM的网络入侵检测研究2 基于互信息法的智能化运维系统入侵检测Spark实现3 基于Spark的车联网分布式组合深度学习入侵检测方法4 基于Flink的分布式在线集成学习框架研究5 基于Flink的分布式并行逻辑回…

【AHB】初识 AHB 总线

AHB 与 APB、ASB同属于 AMBA 总线架构规范&#xff0c;该总线规范由 ARM 公司提出。 目录 一、AHB 总线 二、AHB 总线组成 三、AHB 主从通信过程 一、AHB 总线 AHB&#xff08;Advanced High Performance Bus&#xff09;,意为高级高性能总线&#xff0c;能将微控制器&…

excel 下载方法封装

1.首先需要拿到后端返回的URL下载地址 2.写个下载方法 // url 接口返回的下载地址。例如&#xff1a;https://cancer-research.oss-cn-beijing.aliyuncs.com/yuance-platform-permission/校内共享数据导入模板.xlsx // name 文件名称 例如&#xff1a; 校内共享数据导入模板 /…

Pytorch安装教程:最新保姆级教程

目录 概述 重要的事情说三遍&#xff1a;不需要装cuda、不需要装cuda、不需要装cuda 1.查看自己NVIDIA版本 2.创建一个conda 环境 3.安装pytorch 本文意在帮助即将步入深入学习领域的学子 在这之前首先你需要安装好anaconda&#xff0c;不懂的可以下面这篇文章 最新Anaco…

探索人工智能 | 智能推荐系统 未来没有人比计算机更懂你

前言 智能推荐系统&#xff08;Recommendation Systems&#xff09;利用机器学习和数据挖掘技术&#xff0c;根据用户的兴趣和行为&#xff0c;提供个性化推荐的产品、内容或服务。 文章目录 前言核心机器学习为什么说机器学习是智能推荐系统的基础呢&#xff1f; 数据挖掘数据…

布置Zabbix监控

一、在 Web 页面中添加 agent 主机 1.1打开Zabbix的Web页面 2.2在 Web 页面中添加 agent 主机 二、在 Web 页面创建自定义监控项模板 2.1创建模版

3.1 Qt样式选择器

本期内容 3.1 样式选择器 3.1.1 Universal Selector (通用选择器) 3.1.2 Type Selector (类型选择器) 3.1.3 Property Selector (属性选择器) 3.1.4 Class Selector (类选择器) 3.1.5 ID Selector (ID选择器) 3.1.6 Descendant Selector (后裔选择器) 3.1.7 Chil…

励志长篇小说《周兴和》书连载之十四 守诚信身负巨债

守诚信身负巨债 天色阴霾。看样子又要下雨了吧&#xff1f; 周兴和强打精神&#xff0c;送走了来谈业务的几个客人后&#xff0c;一下就瘫倒在了藤椅上&#xff0c;一动也不想动——几个月来没日没夜的工作&#xff0c;十几天以来在高原的奔波&#xff0c;他太疲惫了&#xff…

【C与C++的相互调用方法】

C与C的相互调用方法 C与C为什么相互调用的方式不同C中调用CC中调用C致谢 C与C为什么相互调用的方式不同 C 和 C 之间的相互调用方式存在区别&#xff0c;主要是由于 C 和 C 语言本身的设计和特性不同。 函数调用和参数传递方式不同&#xff1a;C 和 C 在函数调用和参数传递方面…

【力扣每日一题】88. 合并两个有序数组 双指针 辅助数组 8.13打卡

文章目录 题目思路代码 题目 88. 合并两个有序数组 难度&#xff1a; 简单 描述&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&am…

【Spark学习笔记】- 1Spark和Hadoop的区别

目录标题 Spark 是什么Spark and Hadoop首先从时间节点上来看:功能上来看: Spark or Hadoop Spark 是什么 Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 Spark and Hadoop 在之前的学习中&#xff0c;Hadoop 的 MapReduce 是大家广为熟知的计算框架&…

每天一道leetcode:300. 最长递增子序列(动态规划中等)

今日份题目&#xff1a; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] …

关于虚拟机网络故障的解决

关于虚拟机网络故障的解决 ⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我…

突破Poshmark成号率低难题,防封攻略大揭秘!

说到二手交易电商平台&#xff0c;这里就不得不说一下Poshmark了。Poshmark是美国最大的二手交易电商平台&#xff0c;访客量很大&#xff0c;所以平台的月均访问量也是非常高的。 Poshmark 是成立于2011 年的美国线上电商平台&#xff0c;也被称为美版“闲鱼”。平台上的产品…

无涯教程-Perl - rmdir函数

描述 此函数删除EXPR指定的目录,如果省略,则删除$_。如果目录为空,则仅删除目录。 语法 以下是此函数的简单语法- rmdir EXPRrmdir返回值 如果失败,此函数返回0,如果成功,则返回1。 例 以下是显示其基本用法的示例代码,在/tmp内创建一个目录testdir- #!/usr/bin/perl -…