我是靠谱客的博主 温柔电脑,最近开发中收集的这篇文章主要介绍mybatis全局配置文件详解一,orm介绍2,JDBC三,mybatis功能架构四,mybatis源码解析五,总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

mybatis全局配置文件详解

  • 一,orm介绍
  • 2,JDBC
    • 2.1四大核心对象
    • 2.1 JDBC出现一些的问题
  • 三,mybatis功能架构
  • 四,mybatis源码解析
    • 1,构造对象流程
    • 2,加载流程源码分析
  • 五,总结

一,orm介绍

o <===> object
r <===> relational
m <===> mapping

MyBatis:是一个持久层框架,使用简单,学习成本较低。可以执行自己手写的sql语句,比较灵活,但是mybatis的自动程度画不高,移植性也不高,从一个数据库迁移到另外一个数据库的时候需要修改配置,所以被称为半自动化ORM框架

Hibernate:底层实现了很多add方式,所以被称为全自动ORM框架

2,JDBC

2.1四大核心对象

1,加载驱动

Class.forName("com.mysql.jdbc.Driver")

2,创建连接

COnnection con = DriverManager.getConnection(...)

3,获取sql执行者,执行操作

con.prepareStament(sql)

4,执行查询

execute();

5,关闭数据库,关闭连接

.close()

2.1 JDBC出现一些的问题

1,数据库配置,sql语句在代码中出现硬编码的问题,mybatis通过xml解决
2,jdbc频繁的创建和关闭数据库链接,对数据库是一个很大的消耗,mybatis通过数据库连接池解决。
3,参数设置不方便,mybatis 通过动态sql查询
4,处理结果集不方便,mybatis 可以自定义 resultMap 进行映射

三,mybatis功能架构

API接口层:提供给外部使用的接口api,可以通过这些api来操纵数据库

数据处理层:负责具体的sql查找、解析、执行和映射结果处理等

基础支撑层:负责最基础功能的支撑,如一些连接管理,事务管理,配置加载,缓存等。

可以通过这份笔记来对这个mybatis有一个基本的了解:https://note.youdao.com/ynoteshare/index.html?id=5d41fd41d970f1af9185ea2ec0647b64&type=notebook&_time=1662564167792

四,mybatis源码解析

1,构造对象流程

String resource = "mybatis-config.xml";
Reader reader;
//将XML配置文件构建为Configuration配置类
reader = Resources.getResourceAsReader(resource);
// 通过加载配置文件流构建一个SqlSessionFactory  DefaultSqlSessionFactory
SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);
// 数据源 执行器  DefaultSqlSession
SqlSession session = sqlMapper.openSession();
//解析配置类
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
//其底层就是专门用来解析xml的,xml里面的任何一个配置文件,都是通过node存储的
//可以通过node来获取里面的属性和里面的值,可以获取配置文件下面的所有的值
Node node = (Node)new XPathParser();
//调用parse方法解析 这个全局配置文件
parser.parse()
//解析mybatis-config.xml的node节点
parseConfiguration(parser.evalNode("/configuration"))

2,加载流程源码分析

1,先查看这个SqlSessionFactoryBuilder看看底层的具体流程,其主要就是加载配置文件,将这些文件加载一个configuration的一个对象里面。

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

2,这个Configuration会包含很多东西,如一些环境,缓存等等等

public class Configuration {
    //环境
 	protected Environment environment;	
 	protected boolean safeRowBoundsEnabled;
 	protected boolean safeResultHandlerEnabled = true;
 	protected boolean mapUnderscoreToCamelCase;
 	protected boolean aggressiveLazyLoading;
 	protected boolean multipleResultSetsEnabled = true;
 	protected boolean useGeneratedKeys;
 	protected boolean useColumnLabel = true;
    //缓存
 	protected boolean cacheEnabled = true;
 	protected boolean callSettersOnNulls;
 	protected boolean useActualParamName = true;
 	protected boolean returnInstanceForEmptyRow;
    ...
}

3,其build方法如下,主要是通过这个责任链模式,单参调双参,双参调三参。

public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    try {
        //获取配置文件
    	XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
      	//解析配置文件
        return build(parser.parse());
    }finally{
        reader.close();
    }
}

在这个解析配置文件的方法里面,会有一个parseConfiguration的类

public Configuration parse() {
	parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
}

接下来主要查看这个parseConfiguration类,就是对应xml里面的configuration标签里面的一些标签
在这里插入图片描述

private void parseConfiguration(XNode root) {
    //解析properties标签
    propertiesElement(root.evalNode("properties"));
    //解析settings标签
    Properties settings = settingsAsProperties(root.evalNode("settings"));
    //解析environments环境标签
    environmentsElement(root.evalNode("environments"));
    //解析typeAliases别名标签
    typeAliasesElement(root.evalNode("typeAliases"));
    //解析typeHandlers标签
    typeHandlerElement(root.evalNode("typeHandlers"));
    //解析mappers标签
    mapperElement(root.evalNode("mappers"));
}

4,解析这个配置文件的propertiesElement方法如下,里面的parse解析方法采用的是一个责任链模式

private void propertiesElement(XNode context) throws Exception {
	if (context != null) {
        //获取子结点
		Properties defaults = context.getChildrenAsProperties();
		//获取资源
        String resource = context.getStringAttribute("resource");
        //最后将这个Properties对象加入到这个configuration的配置文件里面
        configuration.setVariables(defaults);
    }
}

其他的标签也是会通过这个责任链模式,对这些标签进行解析,并最终会加入到这个configuration的配置里面

5,一直到最后一个,会去解析这个mapper里面的mappers这个配置文件。会通过这个mapper的这个类,比如说UserMapper,然后找到对应的xml文件。

<mappers>
    <package name="com.tuling.mapper"/>
</mappers>

其源码实现如下,在解析这个config.xml的配置文件之后,会解析这个mapper.xml的映射文件

private void mapperElement(XNode parent) throws Exception {
    //创建读取XmlMapper构建器对象
    XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
    //开始真正的解析mapper的xml文件
   	mapperParser.parse();
}

进入这个解析映射文件的方法

public void parse() {
    //获取mapper映射文件的所有内容,并对映射文件进行解析
	configurationElement(parser.evalNode("/mapper"));
}

在进入这个configurationElement的这个方法

private void configurationElement(XNode context) {
    //会先解析mapper标签里面的这个namespace的这个标签
    String namespace = context.getStringAttribute("namespace");
    //设置到这个build的助手里面
    builderAssistant.setCurrentNamespace(namespace);
    //解析当前的缓存的引用
    cacheRefElement(context.evalNode("cache-ref"));
    //解析这个二级缓存
    cacheElement(context.evalNode("cache"));
    //解析resultMapper文件
    resultMapElements(context.evalNodes("/mapper/resultMap"));
    //解析sql片段
    sqlElement(context.evalNodes("/mapper/sql"));
    //解析数据的增删改查
    buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
}

6,再查看解析mapper里面的二级缓存,cacheElement方法如下,缓存的过期策略为一个LRU

private void cacheElement(XNode context) {
    //解析cache节点的type属性
    String type = context.getStringAttribute("type", "PERPETUAL");
    //根据type的String获取class类型
    Class<? extends Cache> typeClass = typeAliasRegistry.resolveAlias(type);
    //获取缓存过期策略:默认是LRU
    String eviction = context.getStringAttribute("eviction", "LRU");
    Class<? extends Cache> evictionClass = typeAliasRegistry.resolveAlias(eviction);
    //flushInterval(刷新间隔)属性可以被设置为任意的正整数,设置的值应该是一个以毫秒为单位的合理时间量。 默认情况是不设置,也就是没有刷新间隔,缓存仅仅会在调用语句时刷新。
    Long flushInterval = context.getLongAttribute("flushInterval");
    //size(引用数目)属性可以被设置为任意正整数,要注意欲缓存对象的大小和运行环境中可用的内存资源。默认值是 1024。
    Integer size = context.getIntAttribute("size");
    //只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false
    boolean readWrite = !context.getBooleanAttribute("readOnly", false);
    boolean blocking = context.getBooleanAttribute("blocking", false);
    Properties props = context.getChildrenAsProperties();
    //把缓存节点加入到Configuration中
    builderAssistant.useNewCache(typeClass, evictionClass, flushInterval, size, readWrite, blocking, props);
}

7,再查看这个解析数据的增删改查,会对文件里面的增删改查语句进行解析

private void buildStatementFromContext(List<XNode> list, String requiredDatabaseId) {
	for (XNode context : list) {
        //解析增删改查结点
		final XMLStatementBuilder statementParser = new XMLStatementBuilder(configuration, builderAssistant, context, requiredDatabaseId);
    	try {
			statementParser.parseStatementNode();
    	} catch (IncompleteElementException e) {
        configuration.addIncompleteStatement(statementParser);
    	}
    }
}      

五,总结

1,首先会创建一个SqlSessionFactoryBuilder 的对象,用于解析配置文件
2,会创建一个解析xml配置类的一个构造器,会解析xmlconfig里面的全部标签,并保存在configuration里面
3,会创建一个解析xml映射类的一个构造器,专门解析对应mapper.xml里面的全部标签
4,在解析mapper.xml的时候会将里面增删改查的元素全部解析出来,存在一个MapperStatement里面
5,所有的信息解析完之后,都会生成在一个configuration对象,所有的信息都会加入到这个configuration里面
6,最后会创建一个SqlSessionFactory,会将所有的配置信息,都加入到这个SqlSessionFactory里面

最后

以上就是温柔电脑为你收集整理的mybatis全局配置文件详解一,orm介绍2,JDBC三,mybatis功能架构四,mybatis源码解析五,总结的全部内容,希望文章能够帮你解决mybatis全局配置文件详解一,orm介绍2,JDBC三,mybatis功能架构四,mybatis源码解析五,总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部