iBATIS如何复用SQL片段(翻译)
原文链接
http://opensource.atlassian.com/confluence/oss/display/IBATIS/How+do+I+reuse+SQL-fragments
When writing SqlMaps, you often encounter duplicate fragments of SQL, for example a FROM-clause or constraint-statement; iBATIS offers a simple yet powerful tag to reuse them. For the sake of simplicity, let's assume we want to get some items and we want to do a count on them.
Normally, you would write something like this:
当我们写SqlMaps的时候,经常会碰到重复的SQL片段,例如From语句或者约束条件;iBATIS提供了一个强大的标签来复用这些重复片段,简单举例,我们想检索一些字段,并且想统计它们。
通常情况下,你会这样写:
12 楼 sinokaka 2006-12-21 在sqlmap-config中配置useStatementNamespaces="true"就可以了 13 楼 gilber 2006-12-21 sinokaka 写道在sqlmap-config中配置useStatementNamespaces="true"就可以了原先没看到这一块,谢谢了! 14 楼 ddandyy 2006-12-22 真的是很方便的 在实际中
至于说例子 好像没有几个例子是有意义的 主要就是用最简单的方式让别人明白怎么用就行了 15 楼 wdl123 2007-01-29 <include refid="selectItem_fragment"/>
在这个include里面可不可以放变量,从程序外面传进去 16 楼 小嘴看世界 2007-03-21 <div class='code_title'>我感觉挺有用的,看我的代码</div>
<div class='code_title'/>
<div class='code_title'>xml 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-xml'>
<li class='alt'><span><span class='tag'><</span><span class='tag-name'>statement</span><span>?</span><span class='attribute'>id</span><span>=</span><span class='attribute-value'>"search"</span><span>?</span><span class='attribute'>resultMap</span><span>=</span><span class='attribute-value'>"infoResult"</span><span class='tag'>></span><span>??</span></span></li>
<li class=''><span>????????SELECT? ??</span></li>
<li class='alt'><span>????????????lnid, ??</span></li>
<li class=''><span>????????????tpye, ??</span></li>
<li class='alt'><span>????????????dsc, ??</span></li>
<li class=''><span>????????????pnid, ??</span></li>
<li class='alt'><span>????????FROM?F48100? ??</span></li>
<li class=''><span>????????</span><span class='tag'><</span><span class='tag-name'>include</span><span>?</span><span class='attribute'>refid</span><span>=</span><span class='attribute-value'>"Dy_SC"</span><span class='tag'>/></span><span>??</span></li>
<li class='alt'><span>????????ORDER?BY?bcdat?DESC ??</span></li>
<li class=''><span>????</span><span class='tag'></</span><span class='tag-name'>statement</span><span class='tag'>></span><span>??</span></li>
</ol>
</div>
<p>?使用的时候include就OK了,如下</p>
<div class='code_title'>
<div class='code_title'>xml 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-xml'>
<li class='alt'><span><span class='tag'>??? <</span><span class='tag-name'>sql</span><span>?</span><span class='attribute'>id</span><span>=</span><span class='attribute-value'>"Dy_SC"</span><span class='tag'>></span><span>??</span></span></li>
<li class=''><span>????????</span><span class='tag'><</span><span class='tag-name'>dynamic</span><span>?</span><span class='attribute'>prepend</span><span>=</span><span class='attribute-value'>"WHERE"</span><span class='tag'>></span><span>??</span></li>
<li class='alt'><span>????????????</span><span class='tag'><</span><span class='tag-name'>isNotNull</span><span>?</span><span class='attribute'>prepend</span><span>=</span><span class='attribute-value'>"AND"</span><span>?</span><span class='attribute'>property</span><span>=</span><span class='attribute-value'>"pnid"</span><span class='tag'>></span><span>??</span></li>
<li class=''><span>????????????????</span><span class='attribute'>pnid</span><span>?=?#pnid# ??</span></li>
<li class='alt'><span>????????????</span><span class='tag'></</span><span class='tag-name'>isNotNull</span><span class='tag'>></span><span>??</span></li>
<li class=''><span>????????????</span><span class='tag'><</span><span class='tag-name'>isNotNull</span><span>?</span><span class='attribute'>prepend</span><span>=</span><span class='attribute-value'>"AND"</span><span>?</span><span class='attribute'>property</span><span>=</span><span class='attribute-value'>"dsc"</span><span class='tag'>></span><span>??</span></li>
<li class='alt'><span>????????????????dsc?like?#dsc# ??</span></li>
<li class=''><span>????????????</span><span class='tag'></</span><span class='tag-name'>isNotNull</span><span class='tag'>></span><span>??</span></li>
<li class='alt'><span>????????</span><span class='tag'></</span><span class='tag-name'>dynamic</span><span class='tag'>></span><span>??</span></li>
<li class=''><span>????</span><span class='tag'></</span><span class='tag-name'>sql</span><span class='tag'>></span><span>??</span></li>
</ol>
</div>
</div>
<span class='tag'><span class='tag'><span class='tag'><span class='tag'><span class='tag'><span class='cdata'><span class='tag'><span class='tag'><span class='tag'>
<p>?</p>
<div class='code_title'>?</div>
<span class='tag'/></span></span></span></span></span></span></span></span></span> 17 楼 victor1017 2007-05-20 测试了一下,刚开始没成功,说找不到要include的sql,后来发现我要include的sql放在了xml文件的最后,将他移到最前面就没问题了,所以大家要注意放置的顺序。 18 楼 lszone 2007-05-21 谁说没用,我们现在就在用这种方法来做记录总数与记录明细的查询条件,节省了不少代码 19 楼 galaxystar 2007-05-21 节省代码与提高代码可读性也是把双刃剑,
如果一个xml很大或者id不在一个配置中,你要复用这个id,查找也是一种成本.
并且,好像嵌套做得不好!
比如:
select * from (XX) where rownum <= 10
这里的XX到底是放include里还是select里?
一般XX是会变的,肯定是写在select里对应一个ibatis dao方法,那么include就难做了.
它不能传参数,不能嵌套.
比较丑陋的,就是 select * from ( 定义为一个include
而 ) where rownum <= 10定义为另一个include 20 楼 spiritfrog 2007-05-24 sinokaka 写道在sqlmap-config中配置useStatementNamespaces="true"就可以了
晕了,以前我怎么说namespace根本不起作用,不写也不会出错,原来还要这个配置。 21 楼 heartsong 2007-08-03 还不错,不过如果大量使用的话,对于后来的开发人员阅读来说,可真是要痛苦了,就像在c语言里读goto一样。