您好,登录后才能下订单哦!
本篇内容介绍了“Java持久层框架Mybatis的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
一.Mybaits的架构设计
二.Mybatis-Spring的执行流程
1.初始化SqlSessionFactoryBean
SqlSessionFactoryBean 实现了 Spring 的 FactoryBean和InitializingBean接口,Spring 将会在应用启动时为你 创建 SqlSessionFactory 对象
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:/mappers/**/*.xml" /></bean>
从类路径下加载在mappers包和它的子包中所有的 MyBatis 映射器 XML 文件。
2.获取MapperProxy进行代理执行Mapper接口.
代理Mapper接口(重中之重,Mybatis的动态代理MapperPoxy)
1.mapperRegistry.getMapper(type, sqlSession);
2.MapperProxyFactory<T> 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默认对二级缓存是关闭的。需要自己配置,然后初始化的时候会拿到缓存开启的配置<cache />,进行处理这样的元素节点。后面再详细总结缓存的实现原理,虽然二级缓存用的不多。
cacheElement(context.evalNode("cache"));
“Java持久层框架Mybatis的详细介绍”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。