`
NetBus
  • 浏览: 145077 次
  • 性别: 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  
支持你的试验!

相关推荐

    mybatis自动sql生成插件源码

    本项目提供的"mybatis自动sql生成插件源码"则进一步提升了开发效率,通过拦截器(Interceptor)在运行时自动生成SQL语句,适用于具有主键或唯一索引的单表操作。 首先,`AutoMapperInterceptor.java`是这个插件的...

    sqlserver Ibatis XML自动生成工具

    XML文件中的每个元素都将对应数据库表的字段,使你可以直接在代码中调用这些预定义的SQL语句。 XML映射文件的生成包括以下几个关键部分: 1. `select`标签:用于查询操作,通常包含`id`(唯一标识符)、`resultMap`...

    ibatis sqlserver代码自动生成

    1. **代码生成器工具**:市面上存在多种Ibatis代码生成器,如MyBatis Generator(MBG)、Ibatis Code Generator等。这些工具通常需要用户配置数据库连接信息、表名和字段信息,然后能够自动生成对应的Mapper XML文件...

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

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

    ibatis SQL映射文件、DAO、model自动生成工具源码

    总的来说,这个Ibatis生成工具通过自动化的方式,减轻了开发过程中重复性的工作,使得开发者可以更专注于业务逻辑的实现。它的特点是生成的代码简洁,没有冗余的注释或其他不必要内容,同时配置过程简单明了。对于...

    iBatis的动态SQL语句

    iBatis框架中的动态SQL主要通过XML映射文件来实现,它允许在映射文件中使用各种标签来控制SQL语句的生成过程。这些标签包括但不限于`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`、`&lt;trim&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`...

    ibatis常用sql语句

    iBATIS通过`&lt;iterate&gt;`标签支持数组的遍历,将数组中的每个元素作为独立的值插入到SQL语句中。例如,`(" close=")" conjunction=","&gt;`这段代码会将`actionIds`数组中的每个元素以逗号分隔的形式插入到SQL语句中,...

    ibatis sql生成工具

    总结来说,Ibatis SQL生成工具是一款强大的开发辅助工具,它通过Web应用的方式提供多数据库支持,能够帮助开发者快速生成Ibatis所需的SQL语句和相关Java代码,提高开发效率,降低出错率,是现代企业级开发中的得力...

    ibatis自动生成工具

    使用Ibatis生成工具,我们可以方便地根据数据库表结构自动生成实体类。实体类中的每个属性都与数据库表的列相对应,且自动带有getter和setter方法。此外,实体类还可能包含一些与Ibatis映射相关的注解,如`@Table`, ...

    ibatis代码自动生成

    Ibatis作为轻量级的ORM(对象关系映射)框架,其核心功能是通过XML或注解的方式将Java对象与SQL语句进行映射,避免了直接编写大量的JDBC代码。这大大提高了开发效率,降低了出错的可能性,并且支持动态SQL,提供了...

    ibatis sql 语句的编写

    ibatis还支持动态SQL,允许根据不同的条件生成不同的SQL语句,这对于复杂的查询非常有用。 ##### 4.1 `if`标签 ```xml SELECT * FROM USERS != null"&gt; AND name = #{name} ``` 这里使用`&lt;if&gt;`标签来...

    mybatis/ibatis自动生成SQLMapper脚本

    通过自动生成SQLMapper脚本,开发者可以快速地构建数据访问层,减少手动编写SQL和映射文件的工作量,使项目更加规范且易于维护。这不仅提高了开发效率,也为团队协作提供了便利,确保代码的一致性和可读性。在实际...

    表自动生成ibatis工具

    2. **分析表结构**:连接成功后,工具会读取指定库中的表信息,包括表名、字段名、字段类型等,这是生成SQL语句的基础。 3. **生成Mapper接口**:基于表结构,工具会自动生成对应表的Mapper接口,包含CRUD(Create...

    ibatis代码自动生成代码程序

    【ibatis代码自动生成代码程序】是一个实用工具,旨在帮助开发者快速生成基于iBATIS框架的Java代码。iBATIS,作为一个数据访问层框架,它允许程序员将SQL语句与Java代码分离,提供了一种简单但强大的方式来处理...

    自动生成ibatis 实体类文件

    在Java开发中,MyBatis Generator(MBG)是一个强大的工具,它可以帮助开发者自动生成SQL映射文件、Java实体类以及对应的DAO接口。标题“自动生成iBatis 实体类文件”表明我们要讨论的是如何利用MBG来自动化创建与...

    08_ibatis教程_sql主键生成方式.zip

    Ibatis允许开发者直接编写SQL语句,将数据库操作与Java代码解耦,提供更灵活的数据访问控制。在主键生成方面,Ibatis提供了多种策略,以适应不同的数据库环境和业务需求。 1. **手工指定主键**:这是最基础的方式,...

    WAS上log4j日志不能输出(ibatis)sql语句解决办法[借鉴].pdf

    WAS 上 log4j 日志不能...解决 WAS 上 log4j 日志不能输出(ibatis)sql 语句的问题需要改变 WAS 的默认 LogFactory 实现类,使其使用 log4j 框架下的 LogFactory 实现类,并且需要正确配置 log4j.properties 文件。

    ibatis动态SQL标签用法

    iBatis提供了动态SQL片段的功能,可以将SQL语句拆分成小的、独立的片段,然后根据不同的条件组合这些片段生成最终的SQL语句。这可以提高代码的可重用性和灵活性。 例如,在上面的代码中,我们定义了三个动态SQL片段...

Global site tag (gtag.js) - Google Analytics