风人园

弱水三千,只取一瓢,便能解渴;佛法无边,奉行一法,便能得益。
随笔 - 99, 文章 - 181, 评论 - 56, 引用 - 0
数据加载中……

iBATIS如何复用SQL片段(zt)

原文链接

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提供了一个强大的标签来复用这些重复片段,简单举例,我们想检索一些字段,并且想统计它们。

通常情况下,你会这样写:

xml 代码
  1. < select   id = "selectItemCount"   resultClass = "int" >      
  2.   SELECT COUNT(*) AS total      
  3.   FROM items      
  4.   WHERE  parentid  =  6      
  5. </select >      
  6. < select   id = "selectItems"   resultClass = "Item" >      
  7.   SELECT id, name      
  8.   FROM items      
  9.   WHERE  parentid  =  6      
  10. </select >      
  11.   

 To eliminate this duplication, we use the tags 【sql】 and 【include】. The 【sql】-tag contains the fragment to reuse, the 【include】-tag to include such a fragment:

为了消除重复片段,我们使用【sql】和【include】标签。【sql】标签用来包含重复片段,【include】标签用来引入片段:

 xml 代码

  1. < sql   id = "selectItem_fragment" >      
  2.   FROM items      
  3.   WHERE  parentid  =  6      
  4. </sql >      
  5. < select   id = "selectItemCount"   resultClass = "int" >      
  6.   SELECT COUNT(*) AS total      
  7.    < include   refid = "selectItem_fragment" />      
  8. </select >      
  9. < select   id = "selectItems"   resultClass = "Item" >      
  10.   SELECT id, name      
  11.    < include   refid = "selectItem_fragment" />      
  12. </select >      
  13.   

 The 【include】-tag is namespace-aware so you can refer to fragments even when they are located in another map (however, due to the way iBATIS loads the SqlMaps, the included fragment should be loaded before the including statement). 

【inclued】标签是一个命名空间可知的,所以你可以引入其他map的片段.(但是,因为iBATIS引入SqlMap的顺序,被引入的片段,要优先于欲引入的sql部分被导入)

The fragments are included and processed on query-execution so parameters can be used too:

重复片段在查询执行时被引入和执行,所以参数依然可以使用:

 xml 代码

  1. < sql   id = "selectItem_fragment" >      
  2.   FROM items      
  3.   WHERE  parentid  = #value#      
  4. </sql >      
  5. < select   id = "selectItemCount"   parameterClass = "int"   resultClass = "int" >      
  6.   SELECT COUNT(*) AS total      
  7.    < include   refid = "selectItem_fragment" />      
  8. </select >      
  9. < select   id = "selectItems"   parameterClass = "int"   resultClass = "Item" >      
  10.   SELECT id, name      
  11.    < include   refid = "selectItem_fragment" />      
  12. </select >      

posted on 2006-12-16 14:38 风人园 阅读(606) 评论(0)  编辑  收藏 所属分类: DAO