没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
11页
Spring和MyBatis的整合是Java开发中常见的架构模式,它提供了一种高效、灵活的方式来管理数据库操作和业务逻辑层。本文深入探讨了Spring和MyBatis整合的关键原理和实践要点,帮助架构师和开发者有效地利用这两个强大的框架。 首先,Spring整合MyBatis的核心在于如何管理MyBatis的Mapper接口的动态代理。在整合时,Spring通过其IoC容器,自动地将MyBatis的Mapper接口实例化为Spring beans,这使得MyBatis的Mapper能够像普通的Spring beans一样被管理和注入。 关键的实现技术包括FactoryBean和BeanDefinitionRegistry。Spring使用FactoryBean来创建特定类型的bean,例如MyBatis的Mapper接口的动态代理实例。BeanDefinitionRegistry则用于注册这些动态生成的bean,确保它们可以被Spring容器识别和管理。
资源推荐
资源详情
资源评论
MyBatis执行Sql的流程分析
MyBatis执行Sql的流程分析
openSession的过程:
获取Mapper的流程
Mapper方法的执行流程
简单总结
Mybatis-插件原理
重要类
调试主要关注点
本章着重介绍MyBatis执行Sql的流程,关于在执行过程中缓存、动态SQl生成等细节不在本章
中体现
还是以之前的查询作为列子:
1
2 /***
3 *@Author徐庶QQ:1092002729
4 *@Slogan致敬大师,致敬未来的你
5 */
6 publicclassApp{
7 publicstaticvoidmain(String[]args){
8 Stringresource="mybatis‐config.xml";
9 Readerreader;
10 try{
11 //将XML配置文件构建为Configuration配置类
12 reader=Resources.getResourceAsReader(resource);
13 //通过加载配置文件流构建一个SqlSessionFactoryDefaultSqlSessionFactory
14 SqlSessionFactorysqlMapper=newSqlSessionFactoryBuilder().build(reader);
15 //数据源执行器DefaultSqlSession
16 SqlSessionsession=sqlMapper.openSession();
17 try{
18 //执行查询底层执行jdbc
19 //Useruser=(User)session.selectOne("com.tuling.mapper.selectById",1);
20
21 UserMappermapper=session.getMapper(UserMapper.class);
22 System.out.println(mapper.getClass());
23 Useruser=mapper.selectById(1L);
24 System.out.println(user.getUserName());
25 }catch(Exceptione){
26 e.printStackTrace();
27 }finally{
28 session.close();
29 }
30 }catch(IOExceptione){
31 e.printStackTrace();
32 }
33 }
34 }
之前提到拿到sqlSession之后就能进行各种CRUD操作了,所以我们就从
sqlSession.getMapper这个方法开始分析,看下整个Sql的执行流程是怎么样的。
openSession的过程:
Copy
1 privateSqlSessionopenSessionFromDataSource(ExecutorTypeexecType,TransactionIsol
ationLevellevel,booleanautoCommit){
2 Transactiontx=null;
3 try{
4 finalEnvironmentenvironment=configuration.getEnvironment();
5 finalTransactionFactorytransactionFactory=
getTransactionFactoryFromEnvironment(environment);
6 tx=transactionFactory.newTransaction(environment.getDataSource(),level,autoCom
mit);
7 //获取执行器,这边获得的执行器已经代理拦截器的功能(见下面代码)
8 finalExecutorexecutor=configuration.newExecutor(tx,execType);
9 //根据获取的执行器创建SqlSession
10 returnnewDefaultSqlSession(configuration,executor,autoCommit);
11 }catch(Exceptione){
12 closeTransaction(tx);//mayhavefetchedaconnectionsoletscallclose()
13 throwExceptionFactory.wrapException("Erroropeningsession.Cause:"+e,e);
14 }finally{
15 ErrorContext.instance().reset();
16 }
17 }
18 Copy
19 //interceptorChain生成代理类,具体参见Plugin这个类的方法
20 publicExecutornewExecutor(Transactiontransaction,ExecutorTypeexecutorType){
21 executorType=executorType==null?defaultExecutorType:executorType;
22 executorType=executorType==null?ExecutorType.SIMPLE:executorType;
23 Executorexecutor;
24 if(ExecutorType.BATCH==executorType){
25 executor=newBatchExecutor(this,transaction);
26 }elseif(ExecutorType.REUSE==executorType){
27 executor=newReuseExecutor(this,transaction);
28 }else{
29 executor=newSimpleExecutor(this,transaction);
30 }
31 if(cacheEnabled){
32 executor=newCachingExecutor(executor);
33 }
34 executor=(Executor)interceptorChain.pluginAll(executor);
35 returnexecutor;
36 }
Executor分成两大类,一类是CacheExecutor,另一类是普通Executor。
普通Executor又分为三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、
BatchExecutor。
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完
立刻关闭Statement对象。
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就
使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String,
Statement>内,供下一次使用。简言之,就是重复使用Statement对象。
BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有
sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多
个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行
executeBatch()批处理。与JDBC批处理相同。
作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。
CacheExecutor其实是封装了普通的Executor,和普通的区别是在查询前先会查询缓存中
是否存在结果,如果存在就使用缓存中的结果,如果不存在还是使用普通的Executor进行
查询,再将查询出来的结果存入缓存。
剩余10页未读,继续阅读
资源评论
- shiweixia2023-12-15感谢支持,内容很好
光芒软件工匠
- 粉丝: 789
- 资源: 64
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功