上一篇Mybatis源码分析刚讲过PageHelper分页机制https://blog.csdn.net/shenchaohao12321/article/details/80168655,但是没有分析reasonable参数,碰到这次自己遇上个坑总结一下。问题描述及原因使用MybatisPageHelper插件做了表的分页查询,要求查询符合某一条件的所有记录做处理,就写了一个迭代器在while循环里对每条记录做处理,直到符合条件的记录都处理完程序返回。代码如下publicclassReconPaymentIteratorimplementsIterator<ReconPayment&g
PageInterceptor是Mybatis的插件,用于拦截Executor的query方法,增强这个方法用于分页查询。@Intercepts({@Signature(type=Executor.class,method="query",args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class}),@Signature(type=Executor.class,method="query",args={MappedStatement.class,Object.
MyBatis允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis允许使用插件来拦截的方法调用包括:Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)ParameterHandler(getParameterObject,setParameters)ResultSetHandler(handleResultSets,handleOutputParameters)StatementHandler(prepare,parameterize,batch,upd
Mybatis懒加载是通过动态代理完成的,通常来说Mybaits的映射实体都是POJO,所以Mybatis默认使用Cglib来做动态代理框架的。使用CglibProxyFactory的createProxy方法创建代理对象。其中又直接调用了EnhancedResultObjectProxyImpl静态createProxy方法。publicObjectcreateProxy(Objecttarget,ResultLoaderMaplazyLoader,Configurationconfiguration,ObjectFactoryobjectFactory,List<Class<?
ResultSetHandler提供了处理不同Statement的方法,我们这里分析最常用的handleResultSets。调用此方法将一个Statement对象转换为一个List对象。publicList<Object>handleResultSets(Statementstmt)throwsSQLException{ErrorContext.instance().activity("handlingresults").object(mappedStatement.getId());finalList<Object>multipleResults
上一篇分析到如果二级缓存没有命中,则会调用一个Executor(默认是SimpleExecutor)的query方法,SimpleExecutor继承了BaseExecutor,直接调用BaseExecutor的query方法。BaseExecutor有一个PerpetualCache实例localCache(一级缓存,因为生命周期和executor一样)用于缓存查询结果。public<E>List<E>query(MappedStatementms,Objectparameter,RowBoundsrowBounds,ResultHandlerresultHandle
DefaultSqlSession执行selectList方法内实际调用CachingExecutor的query方法,上篇文章分析过了BoundSql的获取过程,下面继续往下说一下二级缓存。public<E>List<E>query(MappedStatementms,ObjectparameterObject,RowBoundsrowBounds,ResultHandlerresultHandler)throwsSQLException{BoundSqlboundSql=ms.getBoundSql(parameterObject);CacheKeykey=crea
上篇文章分析Mapper的查询操作最终都会调用SqlSession的selectList方法,接下来几篇文章分析一下DefaultSqlSession的selectList的执行过程。public<E>List<E>selectList(Stringstatement,Objectparameter,RowBoundsrowBounds){try{MappedStatementms=configuration.getMappedStatement(statement);returnexecutor.query(ms,wrapCollection(parameter),r
当我们通过DefaultSqlSession的Mapper方式操作数据库时使用如下api:<T>TgetMapper(Class<T>type);此方法返回一个实现了type接口的实现类的实力,我们分析一下此实力的创建过程。public<T>TgetMapper(Class<T>type){returnconfiguration.<T>getMapper(type,this);}public<T>TgetMapper(Class<T>type,SqlSessionsqlSession){returnmapper
SqlSession是我们操作数据库的主要客户端API,是由SqlSessionFactory的openSession方法所创建。openSession有多个重载方法,我们看一下:publicinterfaceSqlSessionFactory{SqlSessionopenSession();SqlSessionopenSession(booleanautoCommit);SqlSessionopenSession(Connectionconnection);SqlSessionopenSession(TransactionIsolationLevellevel);SqlSessionopen
Mybatis中DataSourceFactory是负责创建DataSource对象的,Mybatis一共为我们提供了3种DataSourceFactory的实现,不同的DataSourceFactory创建不同的DataSource,分别为UnpooledDataSourceFactory,PooledDataSourceFactory和JndiDataSourceFactory。具体使用哪种DataSourceFactory我们在《SqlSessionFactory的创建过程》中分析过了,下面详细说一下PooledDataSourceFactory和UnpooledDataSourceFa
上一篇我们讲解到mapperElement方法用来解析mapper的,我们以packae属性为例详细分析一下:privatevoidmapperElement(XNodeparent)throwsException{if(parent!=null){for(XNodechild:parent.getChildren()){if("package".equals(child.getName())){StringmapperPackage=child.getStringAttribute("name");configuration.addMappers(ma
我们使用mybatis操作数据库都是通过SqlSession的API调用,而创建SqlSession是通过SqlSessionFactory。下面我们就通过一个例子看看SqlSessionFactory的创建过程。publicclassTestEntity{privatelongid;privateStringname;privateDatedate;}publicinterfaceTestMapper{TestEntitygetById(longid);}<?xmlversion="1.0"encoding="UTF-8"?><!DO