支持自动生成sql语句的ibatis改造
创始人
2024-04-16 15:11:49
0

什么是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自动代码生成

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...