当前位置: 首页 > Web前端 > HTML

说起Mybatis的动态Sql,这三个SqlNode同等重要

时间:2023-03-28 16:45:04 HTML

聊Mybatis的动态Sql之这三个SqlNode一样重要的是ForEachSqlNodeForEachSqlNode是解析出的对象,@Overridepublicbooleanapply(DynamicContextcontext){Mapbindings=context.getBindings();finalIterableiterable=evaluator.evaluateIterable(collectionExpression,bindings,Optional.ofNullable(nullable).orElseGet(configuration::isNullableOnForEach));if(iterable==null||!iterable.iterator().hasNext()){返回真;}布尔值第一=真;applyOpen(上下文);诠释我=0;for(Objecto:iterable){DynamicContextoldContext=context;if(first||separator==null){context=newPrefixedContext(context,"");}else{context=newPrefixedContext(context,separator);}intuniqueNumber=context.getUniqueNumber();//Issue#709if(oinstanceofMap.Entry){@SuppressWarnings("unchecked")Map.EntrymapEntry=(Map.Entry)o;applyIndex(上下文,mapEntry.getKey(),uniqueNumber);applyItem(上下文,mapEntry.getValue(),uniqueNumber);}else{applyIndex(context,i,uniqueNumber);applyItem(上下文,o,uniqueNumber);}contents.apply(newFilteredDynamicContext(configuration,context,index,item,uniqueNumber));if(first){first=!((PrefixedContext)上下文).isPrefixApplied();}context=oldContext;我++;}应用关闭(上下文);context.getBindings().remove(item);context.getBindings().remove(index);返回真;expression,获取集合,添加open属性的字符串遍历集合,构建PrefixedContext对象。如果是Map类型,将key值保存在PrefixedContext对象中。如果不是,则将集合元素的标志和集合元素保存在PrefixedContext对象中,调用SqlNode的apply()方法,处理#{}占位符,调用applyClose()方法,添加close属性后缀,删除DynamicContext对象中的index和itemVarDeclSqlNodeVarDeclSqlNode是一个解析标签的类public类VarDeclSqlNode实现SqlNode{privatefinalStringname;私有最终字符串表达式;publicVarDeclSqlNode(Stringvar,Stringexp){name=var;表达式=exp;}@Overridepublicbooleanapply(DynamicContextcontext){finalObjectvalue=OgnlCache.getValue(expression,context.getBindings());上下文绑定(名称,值);返回真;}}name保存bind标签的name属性值,value保存bind标签的value属性值,在apply()方法中使用OGNL解析表达式的值,然后将name和value绑定到DynamicContext,这样就可以根据名字得到值了。ChooseSqlNodeChooseSqlNode是解析出选择标签的类publicclassChooseSqlNodeimplementsSqlNode{privatefinalSqlNodedefaultSqlNode;privatefinalListifSqlNodes;publicChooseSqlNode(ListifSqlNodes,SqlNodedefaultSqlNode){this.ifSqlNodes=ifSqlNodes;this.defaultSqlNode=defaultSqlNode;}@Overridepublicbooleanapply(DynamicContextcontext){for(SqlNodesqlNode:ifSqlNodes){if(sqlNode.apply(context)){ret是真的;}}if(defaultSqlNode!=null){defaultSqlNode.apply(上下文);返回真;}返回假;}}它的apply()方法也比较简单:遍历所有的ifSqlNode,也就是when标签的对象信息,调用各自的apply()方法,返回success表示条件成立,返回true,defaultSqlNode不空则为真,其他为假。总结本文主要讲了解析foreach标签的??类ForEachSqlNode,解析标签类的VarDeclSqlNode和解析choose标签的ChooseSqlNode类,并分别介绍了这三个类的apply()方法的实现.这三个类是SqlNode的实现类,是从xml文件中的标签解析出来的对象。这些SqlNode对象会被解析处理成SqlSource接口及其实现类,供数据库执行。在下一篇文章中,我们将介绍SqlSource接口及其实现类。对文章内容感兴趣的朋友可以微信搜索♂:敲码贾老头,获取相关资料