千家信息网

Java持久层框架Mybatis的详细介绍

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,本篇内容介绍了"Java持久层框架Mybatis的详细介绍"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所
千家信息网最后更新 2025年02月05日Java持久层框架Mybatis的详细介绍

本篇内容介绍了"Java持久层框架Mybatis的详细介绍"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一.Mybaits的架构设计

二.Mybatis-Spring的执行流程

1.初始化SqlSessionFactoryBean

SqlSessionFactoryBean 实现了 Spring 的 FactoryBean和InitializingBean接口,Spring 将会在应用启动时为你 创建 SqlSessionFactory 对象

    
从类路径下加载在mappers包和它的子包中所有的 MyBatis 映射器 XML 文件。

2.获取MapperProxy进行代理执行Mapper接口.

代理Mapper接口(重中之重,Mybatis的动态代理MapperPoxy)

1.mapperRegistry.getMapper(type, sqlSession);

2.MapperProxyFactory mapperProxyFactory = (MapperProxyFactory)this.knownMappers.get(type);

3.mapperProxyFactory.newInstance(sqlSession);

4.代理执行查询

3.调用SqlsessionApi进行数据库操作

4.SqlSessionTemplate初始化sqlSessionProxy代理类进行open会话

5.openSession

6.openSession再执行:DefaultSqlSession调用selectList

7.先从缓存中查询:这里先查询二级缓存,再查session的缓存

CachingExecutor缓存执行器先查询缓存,再用delegate执行SIMPLEExecutor进行数据库查询。

8.缓存没有则查询数据库:queryFromDatabase

9.添加插件到RoutingStatementHandler

1.newStatementHandler

2.SatementHandler statementHandler = new RoutingStatementHandler()

3.this.interceptorChain.pluginAll(statementHandler);

10.最后真正的调用JDBC-->PreparedStatement.execute()进行数据库操作

11.查询结果处理:resultSetHandler:-->DefaultResultSetHandler

12.最后sqlSession.commit(true),并关闭Sqlsession

三.Mybatis核心原理需要着重debug

sql解析过程

Mybaitis的sql解析工作通过XMLMapperBuilder进行初始化的,在Mybaiti初始化Config的时候处理所有的Mapper文件,最终得到SqlSource,会放到Configuration中,有了SqlSource,就能拿BoundSql了,BoundSql可以得到最终的sql。解析的过程比较繁琐,大家可以debug一下。

推荐一篇博文,Mybatis-Sql动态解析原理:

http://www.cnblogs.com/fangjian0423/p/mybaits-dynamic-sql-analysis.html

MyBatis的事务管理

一、使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等。

二、使用MANAGED的事务管理机制:这种机制MyBatis自身不会去实现事务管理,而是让程序的容器如(JBOSS,Weblogic)来实现对事务的管理

事务这一块还没有仔细的debug,给大家推荐博文看一下:

https://blog.csdn.net/luanlouis/article/details/37992171

插件运行机制

默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

1.拦截执行器的方法:Executor

2.拦截参数的处理:ParameterHandler

3.拦截结果集的处理:ResultSetHandler

4.拦截Sql语法构建的处理:StatementHandler

Mybatis通过反射实例化plugin节点中的interceptor属性表示的类。然后调用全局配置类Configuration的addInterceptor方法。插件源码需要单独解析,大家自己也可以跟一遍。

Mybatis的缓存

一级缓存:对于会话(Session)级别的数据缓存。是为了短时间的一样的查询带来的资源浪费,MyBatis会在SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候,如果判断先前有个完全一样的查询,会直接从缓存中直接将结果取出,返回给用户,不需要再进行一次数据库查询了。一级缓存默认是开启的。

二级缓存:Mybatis默认对二级缓存是关闭的。需要自己配置,然后初始化的时候会拿到缓存开启的配置,进行处理这样的元素节点。后面再详细总结缓存的实现原理,虽然二级缓存用的不多。

 cacheElement(context.evalNode("cache"));

"Java持久层框架Mybatis的详细介绍"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0