ibatis兼容多数据库的方法

来源:互联网 发布:漯河网络推广 编辑:程序博客网 时间:2024/06/05 13:33

问题:          
        ibatis 是一种“半自动化”的ORM实现,所谓“半自动化”很大部分原因在于ibatis要求开发人员直接编写原始数据库语句(native sql)进行数据操作,这势必造成ibatis对单数据库的强依赖和不兼容的缺陷。
       如果我们将其修改为“多数据库兼容”的持久应用,那将大大提升ibatis的使用范围和自动化程度。当然我们的目标不是向hibernate那样对数据库结构提供了较为完整的封装,提供从POJO 到数据库表的全套映射机制。因为一旦这样做了,也就把ibatis“简单全透明”操作的亮点给扼杀掉了。
       这里我们采用一种变通的作法,即在系统运行过程中,针对不同数据库类型区分加载不同文件路径下的sqlmap配置。留给开发人员做的事依旧是快乐地编写原始数据库语句,而不再为多数据库兼容问题挠头。"          
          
          
          
分析问题:          
1、解决ibatis多数据库兼容的问题,实际上就是让ibatis可以自动选择不同数据库sqlmap配置文件。          
2、打开ibatis源码工程并进行代码跟踪,最终定位到com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.java处,系统中运行的sqlmap节点均从这里统一转化加载的。          
3、很明显SqlMapConfigParser源码中的addSqlMapNodelets负责解析“/sqlMapConfig/sqlMap”路径,即也就是sqlmap文件路径。          
4、要实现“多数据库兼容”,这里改造下这个方法即可。          
          
解决方法:          
1、首选我们在<setting>节点新增一个“DBProductName”用于判断数据库种类。当然通过java.sql.DatabaseMetaData也可以获得,但这太依赖于jdbc驱动,还是手动配置保险。          
2、重构SqlMapConfigParser的addSqlMapNodelets方法。          
"   1)首选获得单个sqlmap文件的位置,如 sqlmap主目录\XXX.xml;
   2)依据上面设置的DBProductName属性值获得数据库类型;
   3)将sqlmap的文件路径重定位到运行数据库类型文件下。如 sqlmap主目录\mysql\XXX.xml,代表程序当前运行于msql数据库上,并加载系统mysql数据库对应的 sqlmap文件"          
4、ok,现在ibatis支持“多数据库兼容”了(完整源码见附件)。          
          
使用方法:          
1、编译SqlMapConfigParser.java生成可运行文件SqlMapConfigParser.class(见附件),并将其覆盖添加到ibatis.jar中。          
2、在系统sqlmap配置文件存放主目录如src\conf\mapping添加多数据库兼容支持的子目录,如src\conf\mapping\mysql,src\conf\mapping\oracle等          
3、以实际项目需要编写多数据库sqlmap配置文件。注意:不同数据库类型需要确保具有相同的sqlmap配置文件名和sql节点名          
4、在ibatis主配置文件(如sql-map-config.xml)中,<setting>指定当前程序运行数据库类型 

(注:本人文章均为原创,转载请注明出处!刀光剑影2012写于深圳。)