`
NetBus
  • 浏览: 143560 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

改造iBatis,使其支持自动生成sql语句(1)

阅读更多

什么是iBatis:
  使用ibatis 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象, 这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate 会自动生成SQL 语句,而ibatis 则要求开发者编写具体的SQL 语句。相对Hibernate等 “全自动”ORM机制而言,ibatis 以SQL开发的工作量和数据库移植性上的让步,为系统 设计提供了更大的自由空间。作为“全自动”ORM 实现的一种有益补充,ibatis 的出现显 得别具意义。


  使用iBatis开发项目工作量比较大,因为每个sql语句都必须自己写。一般的CRUD sql都是sql 92规范,基本上都通用所有数据库。我想如果可以通过hack ibatis源代码实现自动生成iql(ibatis sql)可以简化多少开发量啊。(最开始有这个想法是因为ibatis for .net实现了这个功能,而ibatis for java没有)

  说干就干,决定依照ibatis for .net的实现方式来实现,通过sql-map的parametermap来实现。以最小代码来实现该功能。

  查看了相关dtd后,发现《parameter》节点没有column定义,《parameterMap》节点没有extends定义,《result》和《resultMap》这倒是有。于是修改dtd定义和BasicParameterMapping类,使其支持column。并且修改SqlMapParser类,使其初始化的时候支持column和extends。加入column的目的是为了支持java属性对应到不同的字段上。加入extends的目的是为了重用parametermap。

  parameter修改完成后,就要修改dtd文档定义,使其支持《generate》节点,我们只需要《insert》、《update》、《delete》、《select》这四个节点支持就行,《statement》和《sql》节点考虑在下一版支持。generate需要三个属性,分别是table、where、excludes。其中table表示是对应的表,适用于所有;where表示查询条件字段,适用于select、update、delete;excludes表示要排除哪些parameter,适用于select、update。

  dtd文档定义修改完成后,就可以修改ibatis加载类,使其支持generate。这个切入点比较难找,因为要仔细分析他的源代码。经过仔细思考后,发现ibatis和sql-map支持《include》,决定在include后面加入generate的解析代码。这样比较方便的找到了切入点。

  找到SqlStatementParser类,找到了parseDynamicTags方法,里面就有include的解析。这里面的判断代码是else if,我再加入一个generate的else if 就OK啦。经过一天的修改,完成。工作量也不是太大。

  哈哈,下篇日志发布出hack过后的ibatis代码和demo。

原创文章,如果要转载请注明出处、原始地址和作者信息。

 

分享到:
评论
10 楼 棋子chessman 2011-10-22  
讨论ibatis和hibernate的好坏网上一大把,没必要在这里讨论。

感谢作者给我思路,我现在在整理权限系统,ORM用的是IBATIS,如何控制到数据权限是个难题,这样也是动态控制ibatis所生成sql的好法子。
9 楼 waterborn 2007-12-29  
不是有Abator 吗? 可以自动生成所有的单表的select、update、delete SQL 和DAO 代码

http://ibatis.apache.org/tools/abator
8 楼 NetBus 2007-12-28  
<p>
lonely_521 写道
使用ibatis可能要比hibernate要灵活一些吧.呵呵…………个人感觉,不代表群众意见。
</p>
<p> </p>
<p>我同意!</p>
7 楼 NetBus 2007-12-28  
<p>
JBeans 写道
拜服~何必多次一举呢~用hibernate的效率要远高过这个
</p>
<p>1、我喜欢procedure,<br/>
2、我喜欢ibatis的动态SQL。<br/>
3、我不喜欢把sql(或者hql)语句写到java代码中。<br/>
</p>
<div class='code_title'>sqlmap.xml 代码
<div class='code_title'/>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-xml'>
    <li class='alt'><span><span class='tag'>&lt;</span><span class='tag-name'>select</span><span> </span><span class='attribute'>id</span><span>=</span><span class='attribute-value'>"getPromotionsByShopCount"</span><span> </span><span class='attribute'>parameterClass</span><span>=</span><span class='attribute-value'>"Query"</span><span> </span><span class='attribute'>resultClass</span><span>=</span><span class='attribute-value'>"int"</span><span class='tag'>&gt;</span><span>  </span></span></li>
    <li class=''><span>  select count(*) as value from promotion   </span></li>
    <li class='alt'><span>  </span><span class='tag'>&lt;</span><span class='tag-name'>isGreaterThan</span><span> </span><span class='attribute'>property</span><span>=</span><span class='attribute-value'>"userid"</span><span> </span><span class='attribute'>prepend</span><span>=</span><span class='attribute-value'>"where"</span><span> </span><span class='attribute'>compareValue</span><span>=</span><span class='attribute-value'>"0"</span><span class='tag'>&gt;</span><span>  </span></li>
    <li class=''><span>    </span><span class='attribute'>shopId</span><span> = #userid#   </span></li>
    <li class='alt'><span>  </span><span class='tag'>&lt;/</span><span class='tag-name'>isGreaterThan</span><span class='tag'>&gt;</span><span>  </span></li>
    <li class=''><span/><span class='tag'>&lt;/</span><span class='tag-name'>select</span><span class='tag'>&gt;</span><span>  </span></li>
</ol>
</div>
</div>
<p><br/>
我喜欢这种风格的代码,ibatis提供的动态sql代码支持太棒了。</p>
6 楼 lonely_521 2007-12-28  
使用ibatis可能要比hibernate要灵活一些吧.呵呵…………个人感觉,不代表群众意见。
5 楼 JBeans 2007-12-26  
拜服~何必多次一举呢~用hibernate的效率要远高过这个
4 楼 bukebushuo 2007-12-20  
强烈同意不把sql写在代码里。
我们的项目四年前就不在写在java代码中了,
一开始是struts项目,现在做的项目公司让选Hibernate或者iBatis
我选择i,抛弃H。
Hibernate最大的缺点是过犹不及。事事讲究封装、对象化,在C++中性能上可能不明显,在JAVA中,特别是大项目中,这种分配内存生成对象很耗时的平台中,将是非常明显的。
Hibernate不错,是因为在小项目中。
如果在大项目中(几百人月以上的)千万不要因为少写几行代码而图方便使用H,否则,一旦出现性能问题,想哭都找不到地方。
3 楼 NetBus 2007-12-14  
1、hibernate把sql语句封装在java代码中不喜欢。
2、hibernate对动态sql语句支持不好。
3、何必去浪费时间学习hql?不如去专心研究native sql。
2 楼 bbiao 2007-12-12  
如果你不想写SQL的话,为什么不直接用Hibernate呢?
1 楼 abx01 2007-12-10  
支持你的试验!

相关推荐

    表自动生成ibatis工具

    设置表自动生成ibatis的sql语句等对应的配置文件

    根据MyBatis或iBatis的SQLMapper文件反向生成数据库表

    根据MyBatis或iBatis的SQLMapper文件解析生成数据库表,通常是指通过解析MyBatis或iBatis的SQLMapper文件中的SQL语句,然后根据这些SQL语句来生成对应的数据库表结构。这样的需求可能源于需要将已有的SQLMapper文件...

    ibatis 自动生成插件

    本人好不容易从朋友公司里找到的 IBATIS的 ORM 生成工具插件 可以自动生成对表的新增 修改 删除 XML配置文件和SQL语句,加快开发速度

    Ibatis代码生成器

    1)、数据库类型选择:目前支持Oracle和Mysql两种数据库语句的生成,默认是Oracle。 2)、要生成建表语句, a)、请在“数据库定义Excel文件路径”中选择对应的文件, b)、然后点击下面的按钮“根据数据库...

    iBatis SQL Maps开发指南.pdf

    用SqlMapClient执行SQL语句 代码例子 例子1:执行update(insert,update,delete) 例子2:查询成对象(select) 例子3:用预赋值的结果对象查询成对象(select) 例子4:查询成对象List(select) 例子5:自动提交...

    代码自动生成器

    然而,当下比较流行的,绝大多数MySQL、iBatis开源代码生成器,只能生成动态SQL语句和几个简单粗糙的增删改查方法。 对于追求高质量代码的项目而言,都希望拥有高端的标准SQL语句,而不是相对低端的动态SQL语句。...

    SQL参数自动填充工具

    测试抓取ibatis日志生成的sql会有很多问号,参数填充太麻烦,所以写了一个窗口sql参数自动填充工具

    iBATIS学习笔记

    会自动生成SQL 语句,而iBATIS则要求开发者编写具体的SQL语句。相对Hibernate 等 “全自动”ORM机制而言,iBATIS以SQL开发的工作量和数据库移植性上的让步, 为系统设计提供了更大的自由空间。作为“全自动”ORM实现...

    iBATIS实战

    5.1.1 用于非查询SQL语句的SqlMap API 82 5.1.2 非查询已映射语句 83 5.2 插入数据 84 5.2.1 使用内联参数映射 84 5.2.2 使用外部参数映射 85 5.2.3 自动生成的键 86 5.3 更新和删除数据 88 5.3.1 处理并发更新 88 ...

    ibatis 开发指南

    使用ibatis 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象, 这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate 会自动生成SQL 语句,而ibatis 则要求...

    C#+IBatis+MVC3.0+Sql+验证码实例

    绝对无敌的重大实用的技术知识汇总,里面有我自己写的验证码方法,通过MVC3.0和IBatis以及Sql2010和Jquery实现的登录注册 模板, 这个实例,绝对是新手以及探究者 研究的好实例。...(里面附有Sql数据生成语句)

    ibatis的SqlMap辅助生成工具

    工具的使用,我写了一个说明。 功能: 能节省写SqlMap的时间,和创建实体的时间。 而且快捷准确,不必担心sql语句会写错,或者字段对应不上

    Ibatis框架的核心知识点

    1 简单的sqlmap 2 SQl语句 3 自动生成的主键 4 存储过程 5 parameterMap与inline parameter 6 二元条件元素和一元条件元素 7 隐式的Result Map

    ibatis 开发指南(pdf)

    使用ibatis 提供的ORM 机制,对业务逻辑实现人员而言,面对的是纯粹的Java 对象, 这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate 会自动生成SQL 语句,而ibatis 则要求...

    .net源码生成工具DataBase2Sharp

    可以生成各种架构代码,导出数据库文档、浏览数据库架构、查询数据、生成Sql脚本等。 主要的功能如下:  1、Castle的ActiveRecord代码生成功能,准确生成各种关系。  2、NHibernate代码生成,生成相应的实体类和...

    iBATIS技术教程PPT和代码.rar

    系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。面对这样的需求,再次举起 Hibernate 大刀,却发现刀锋不再锐利,甚至无法使用,...

    ibatis和hibernate的区别

    ibatas的sql语句需要自己手动写,而hibernate能够在程序运行时自动生成。但是不要就这样以为hibernate比ibatas方便,其实二者熟悉之后的效率差不多。而hibernate还能够自动建表等等,这样的好处就在于你带着这个程序...

    IbatisDemo04

    Ibatisnet 1,如何得到运行时ibatis.net动态生成的SQL语句? 2,如何获取DbCommand? 3,如何返回DataTable,DataSet? 4,批量数据的插入……

    mybatis 模糊查询的实现方法

    mybatis的逆向助手确实好用,可以省去很多编写常规sql语句的时间,但是它没办法自动生成模糊查询语句,但开发中模糊查询是必不可少的,所以,需要手动对mapper编写模糊查询功能。 这里先明确MyBatis/Ibatis中#和$的...

    Struts2+Ibatis+Spring例子

    附jar包和建表语句,里面有添、删、改、查通用查询方法,并且,加了log4j,所以对数据库操作SQL都会在控制台打印出来,加有最新的jQuery插件1.7.2.min.js,建好表,部署完工程直接就可以访问,还支持数据库切换,只...

Global site tag (gtag.js) - Google Analytics