论坛首页 Java企业应用论坛

iBATIS如何复用SQL片段(翻译)

浏览 20345 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-15  

原文链接

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>     
  13.   
   发表时间:2006-12-16  
我觉得实际意义不大!
0 请登录后投票
   发表时间:2006-12-16  
我觉得有实际意义至少我们项目现在的分页就有用,取记录数与明细之前的条件语句就相同,谢谢分享!
0 请登录后投票
   发表时间:2006-12-16  
edusaj 写道
我觉得有实际意义至少我们项目现在的分页就有用,取记录数与明细之前的条件语句就相同,谢谢分享!


我觉得楼主给的例子意义不大,但是在分页中用这个很不错,尤其是多条件查询,count和list分别写一个确实太麻烦
0 请登录后投票
   发表时间:2006-12-16  
include还是使用很多的,除了例子中的count/list,还有相同的Mapping,不同的查询条件,在我们项目应用得非常多。
0 请登录后投票
   发表时间:2006-12-16  
我觉得例子仅仅是一个参考,主要是了解这个思路,知道这个功能,实际意义,对于我来说还是比较大的,我在网上找了很久才找到这个功能,看了SQL的官方文档这些都属于未记录(Document)的档案,所以就用我蹩脚的鸟语功夫,翻译了一下,希望对大家来说是一个参考
0 请登录后投票
   发表时间:2006-12-16  
要实现 SQL 的复用,最好是把 ajoo 的 JRC 和 iBatis 结合起来。
这可能要在 iBatis 底层进行修改,以提供更方便的使用接口。
目前还没认真想过如何结合,等遇到这样的需求时再看看。

ajoo 的 JRC:http://www.iteye.com/topic/21903
0 请登录后投票
   发表时间:2006-12-16  
include经常用,对于一些状态的判断还是挺方便的
0 请登录后投票
   发表时间:2006-12-16  
sinokaka 写道
我在网上找了很久才找到这个功能,看了SQL的官方文档这些都属于未记录(Document)的档案


怎么没记录!?
我下载的ibatis-2.3.0.677的iBATIS-SqlMaps-2_en.pdf就记录了。
0 请登录后投票
   发表时间:2006-12-16  
http://opensource.atlassian.com/confluence/oss/display/IBATIS/Not+Yet+Documented

我是在这里找到的,我在2.0里面的中文没有找到:)
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics