文章目录
- 一、前言
- 二、项目搭建
- 三、自动装配
- 四、总结
一、前言
Mybatis 官网 以及 本系列文章地址:
- Mybatis 源码 ① :开篇
- Mybatis 源码 ② :流程分析
- Mybatis 源码 ③ :SqlSession
- Mybatis 源码 ④ :TypeHandler
- Mybatis 源码 ∞ :杂七杂八
本系列基于 如下版本 :
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
二、项目搭建
为了方便介绍,我们这里首先简单基于 SpringBoot 搭建一个项目, 由于项目搭建并非本文重点,所以下面仅简单介绍下搭建过程。
-
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 生成对应的结构,最终项目结构如下:
-
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
-
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容器中引入了更多的类。我们这里简单介绍几个关键类,在后面的具体代码分析中会有更详细的分析。
-
SqlSessionFactory :用于创建与 DB 交互的 数据库会话,是 SqlSesion 创建的工厂类,同时内部保存了关于 Mybatis 的各种配置。默认情况下SpringBoot引入的类型是 DefaultSqlSessionFactory,生产出来的SqlSession 是 DefaultSqlSession 类型。
-
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
-
AutoConfiguredMapperScannerRegistrar :被 MapperScannerRegistrarNotFoundConfiguration 通过 @Import 引入,在容器中没有 MapperFactoryBean 和 MapperScannerConfigurer 是才会注入到容器。该类的作用是生成 MapperScannerConfigurer的BeanDefinition 并注册到容器中。而 MapperScannerConfigurer 会在创建时扫描 @Mapper 注解修饰的类生成 BeanDefinition 并注册到容器中。
-
MybatisProperties : 该类映射了 Mybatis 的配置属性。
四、总结
本文作为一个开篇内容,仅简单介绍了项目搭建和 自动装配的流程,具体流程后面的文章再进行分析。