支持自动生成sql语句的ibatis改造

开发 后端
使用iBatis开发项目工作量比较大,因为每个sql语句都必须自己写。一般的CRUD sql都是sql 92规范,基本上都通用所有数据库。如果可以通过ibatis改造实现自动生成iql(ibatis sql)可以简化大量的工作。

什么是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啦。经过一天的修改,完成。工作量也不是太大。

【编辑推荐】

  1. ibatis自动生成工具abator使用注意事项
  2. ibatis resultMap groupBy属性巧使用
  3. 了解iBatis.Net中的ResultMap
  4. ibatis插件的安装方式
  5. 轻松完成ibatis自动代码生成
责任编辑:桑丘 来源: javaeye论坛
相关推荐

2009-07-16 11:21:19

ibatis主键自动生成

2009-07-14 18:24:31

ibatis映射文件

2010-09-07 16:46:56

SQL语句nsert

2009-07-16 09:09:36

ibatis自动代码

2009-07-21 16:17:28

iBATIS.NET

2009-07-15 17:31:08

iBATIS Ecli

2009-07-16 11:40:23

ibatis自动生成abator

2009-07-14 17:12:26

ibatis自动代码生

2009-07-21 15:05:43

2010-09-07 16:31:17

SQL语句insert

2021-01-28 15:16:09

程序员技能开发者

2010-11-18 17:08:44

Oracle使用SQL

2009-07-17 14:20:31

ibatis Dao

2009-03-04 13:10:41

SQL语句INSERTDELETE

2009-07-24 16:59:57

iBatis模糊查询

2009-06-29 09:08:12

半自动化ORM实现

2009-07-20 16:18:54

iBatis分页Hibernate式的

2023-03-30 09:10:06

SQLSELECTFROM

2010-09-03 15:47:40

SQL语句锁定

2010-09-03 14:39:15

SQLSELECT语句
点赞
收藏

51CTO技术栈公众号