Mybatis 源码 ① :开篇

一、前言

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 的配置属性。


四、总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫吻鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值