博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深度 Mybatis 3 源码分析(一)SqlSessionFactoryBuilder源码分析
阅读量:4695 次
发布时间:2019-06-09

本文共 4300 字,大约阅读时间需要 14 分钟。

MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

Mybatis环境快速入门

Maven依赖信息

4.0.0
sourceanalysis
com.brian
0.0.1-SNAPSHOT
mybatis3
com.brian
0.0.1-SNAPSHOT
源码分析 - mybatis3源码分析
mysql
mysql-connector-java
5.1.38
org.mybatis
mybatis
3.4.1

创建mybatis配置文件 mybatis.xml

Mapper配置文件

运行MyBatis代码

import mapper.UserMapper;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;import java.io.Reader;/** * @program: architect * @author: Brian Huang * @create: 2019-06-04 22 **/public class MybatisApp {    public static void main(String[] args) {        try {            //1.定义配置文件            String resource = "mybatis.xml";            //2.获取InputStreamReader IO流            Reader reader = Resources.getResourceAsReader(resource);            //3.获取SqlSessionFactory            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);            //4.获取Session            SqlSession session = sqlSessionFactory.openSession();            //5.执行mapper接口方法            UserMapper mapper = session.getMapper(UserMapper.class);            System.out.println("--result--: " + mapper.getUser(1).toString());        } catch (IOException e) {            e.printStackTrace();        }    }}

数据表结构

-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user`  (  `id` int(20) NOT NULL AUTO_INCREMENT,  `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',  `password` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码,加密存储',  `phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '注册手机号',  `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '注册邮箱',  `created` datetime(0) NOT NULL,  `updated` datetime(0) NOT NULL,  PRIMARY KEY (`id`) USING BTREE,  UNIQUE INDEX `username`(`username`) USING BTREE,  UNIQUE INDEX `phone`(`phone`) USING BTREE,  UNIQUE INDEX `email`(`email`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 36 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

Mybatis大体架构流程分析

1. 读取resources获取对应的Reader对象。

Reader reader = Resources.getResourceAsReader(resources);

2. 使用SqlSessionFactoryBuilder获取SqlSessionFactory

SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);

源码分析:

2.1.进入到build 传递reader有参数构造函数

最终执行

2.2. SqlSessionFactoryBuilder使用XMLConfigBuilder解析配置文件,封装成Configuration对象。

 

注意:parsed = false,避免maybatis.xml被加载多次,因为我们的configuration是全局的所以只能被解析一次

 2.3 执行environmentsElement()  方法

 

此处for循环是environment可能回配置多个运行环境如dev,test,prod等

 2.4 执行mapperElement()方法 解析mybatis.xml里面的<mappers>节点

 

这里的Mapper有两种扫描的方式 package和resource,根据我上面的mybatis.xml配置文件,这里会走第一个判断

2.5 执行XMLMapperBuilder的parse()方法,解析UserMapper.xml

2.5.1 isResourceLoaded() 判断避免mapper被重复解析

 

2.5.2 configurationElement()执行具体的解析UserMapper.xml逻辑

2.5.3 addLoadedResource()方法Mapper路径放入到loadedResoures中

 

 2.5.4 执行bingMapperForNamesapce() 将UserMapper.XML和UserMapper.java 进行映射

 

总环下流程图 (PS 图画的不是太好看) 红色框为SqlSessionFactoryBuilder的执行逻辑

 

转载于:https://www.cnblogs.com/hlkawa/p/10981542.html

你可能感兴趣的文章
Linux下安装Tomcat
查看>>
windows live writer 2012 0x80070643
查看>>
tomcat 和MySQL的安装
查看>>
git常用操作
查看>>
京东SSO单点登陆实现分析
查看>>
u-boot启动第一阶段
查看>>
MySQL批量SQL插入性能优化
查看>>
定义列属性:null,default,PK,auto_increment
查看>>
用户画像展示
查看>>
C#中StreamReader读取中文出现乱码
查看>>
使用BufferedReader的时候出现的问题
查看>>
批处理文件中的路径问题
查看>>
hibernate出现No row with the given identifier exists问题
查看>>
为什么wait()和notify()属于Object类
查看>>
配置NRPE的通讯
查看>>
shp系列(一)——利用C++进行shp文件的读(打开)与写(创建)开言
查看>>
匹配两个空格之间的字符。。。
查看>>
CSS 文字溢出 变成省略号 ...
查看>>
Spring事务
查看>>
java编程基础(三)流程控制语句
查看>>