首页 > 编程知识 正文

mybatis直接执行sql,mybatis执行多个标签

时间:2023-05-06 06:07:26 阅读:149660 作者:4877

mybatis四大对象1、Executor :SIMPLE、RESUE、BATCH2、StatementHandler :SIMPLE、PREPARED、CALLABLE3、ParameterHandler4、RESUE

在mybatis运行期间,将根据需要创建上述四个对象。

其中,Executor对象的创建是在创建SqlSession时进行的。 执行sql语句时,将创建StatementHandler对象。 在创建StatementHandler对象时,将创建一个名为ParameterHandler和ResultSetHandler的辅助对象。 mybatis拦截器注入1、首先, 需要创建拦截器类实现mybatis的拦截器接口: publicclassmyinterceptorimplementsinterceptor { @ overridepublicobjectinterceptor。 ect [ ] args=invocation.getargs (method method=invocation.get method (; return invocation.proceed (; } @ overridepublicobjectplugin (object target ) return plugin.wrap (target,this ); } @ overridepublicvoidsetproperties (properties properties ) system.out.println ) properties; }2、然后,需要在myabatis的配置文件中注册plugins。 pluginsplugininterceptor=' com.huwc.interceptor.my interceptor '/plugin/plugin用于标识此拦截器拦截mybatis中的哪些对象的方法@intercepts(signature ) type=statementhandler.class,mement args={ Statement.class} ) (publicclassmyinterceptorimplementsinterceptor )根据上述评论,我们的这个窃听器是StatementHandler的URL

interceptor的执行流程: interceptor界面有三种方法:设置属性、插件和intercept。 通过分析,我们可以总结出以下内容

1、setProperties方法用于在mybatis启动时进行迭代器注册时,向拦截器类添加属性; 2、plugin方法是mybatis在制作四大对象时,代理包装制作的对象的方法。 3、intercept方法:实际执行监听的方法。

让我们从代码开始分析:

在拦截器类的每个方法中执行断点处理,可以看到第一个执行的方法是setProperties方法。

正如您所看到的,在创建SqlSessionFactory的过程中,分析并加载mybatis的配置文件,最终创建Configuration对象,然后在创建Configuration对象的过程中,在配置文件中此时,扫描到相应的拦截器类并执行拦截器类中的Plugins。下一个断点是拦截器类的plugin方法:

创建SqlSession对象时,会创建对应的Executor对象,创建对象后,如果有拦截器,就会调用对应的拦截器类的plugin方法,并调用代理对象当然,如果没有与拦截器类注释相对应的执行程序,则不会生成代理,而是返回原始的执行程序对象。

publicstaticobjectwrap { object target,interceptor interceptor } { map class?setmethodsignaturemap=getsignaturemap (interceptor ); 类? type=target.getClass (; 类? [ ]接口=getallinterfaces (type,signatureMap ); 界面. length0) ret

urn Proxy.newProxyInstance( type.getClassLoader(), interfaces, new Plugin(target, interceptor, signatureMap)); } return target; }

接下来,就是执行数据库操作了,在执行过程中,首先是要创建StatementHandler对象,因为最终所有的跟数据库相关的操作,都是封装在了StatementHandler对象中 ,而在创建StatementHandler对象的过程中,需要两个辅助的对象:ParameterHandler和ResultSetHandler。
所以,断点再次停留的时候,是创建ParameterHandler和ResultSet对象的时候,分别判断这两个对象是否需要被代理:



上述代码中,我们可以看到ParameterHandler和ResultSetHandler对象都是在StatementHandler对象的构造器中进行创建的,调用的都是Configuration对象中的new相应方法来处理的。
再次停留断点则是StatementHandler对象创建完成后,进行代理的过程:

最终在执行StatementHandler对象的update方法时,拦截器类的intercept方法会被触发调用:

最后:我们看下Configuration对象中创建四大对象的代码:

public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) { ParameterHandler parameterHandler = mappedStatement.getLang().createParameterHandler(mappedStatement, parameterObject, boundSql); parameterHandler = (ParameterHandler) interceptorChain.pluginAll(parameterHandler); return parameterHandler; } public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler, ResultHandler resultHandler, BoundSql boundSql) { ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, resultHandler, boundSql, rowBounds); resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler); return resultSetHandler; } public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql); statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler); return statementHandler; } public Executor newExecutor(Transaction transaction) { return newExecutor(transaction, defaultExecutorType); } public Executor newExecutor(Transaction transaction, ExecutorType executorType) { executorType = executorType == null ? defaultExecutorType : executorType; executorType = executorType == null ? ExecutorType.SIMPLE : executorType; Executor executor; if (ExecutorType.BATCH == executorType) { executor = new BatchExecutor(this, transaction); } else if (ExecutorType.REUSE == executorType) { executor = new ReuseExecutor(this, transaction); } else { executor = new SimpleExecutor(this, transaction); } if (cacheEnabled) { executor = new CachingExecutor(executor); } executor = (Executor) interceptorChain.pluginAll(executor); return executor; }

上述代码中,四大对象的创建过程中,都会调用拦截器链的pluginAll方法,来实现拦截处理和代理的生成。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。