今天项目碰到了一个问题:ibatis做数据持久层,现在碰到了一个问题,就是——开发的项目   我如何做,才能使自己写的一条SQL 既能访问oracle和mysql呢???目的:为了方便以后维护,我们只需要写一个SQL,使其自动识别是oracle还是mysql。
言简意赅:     写一条SQL ,它既能操作oracle也能操作mysql
求提供思路在线坐等……    亲们,谢谢……

解决方案 »

  1.   

    你的意思是 随便写一个SQL  oracle 也可以 mysql也可以?  
      

  2.   

    还自动识别......
    这种不可能的,你除非自己对ibatis进行一层包装,通过某些东西来表示该sql是执行对应的那个数据库。
      

  3.   


    恩,对的,亲……  嘿嘿……  知道  两个数据库在有的关键字上面不一样或者是冲突比如limit……求方法……
      

  4.   

    只要用标准SQL92的语法,好多数据库都可以执行可以针对每种数据库写专用xml文件,通过配置文件切换
      

  5.   


    其实  之所以  这么问   也就是想说:   在oracle和mysql之间,我们   不想写两套SQL   看看  有木有解决方案什么的……呵呵……
      

  6.   

    不想写两套的代价是写十套,你不把oracle和mysql都玩明白了,不可能写出来真正通用的,简单的不带函数的 基本语法都一样。
      

  7.   

    还是用Hibernate好点,这种问题很轻松解决叻 ... ... ... 
      

  8.   

       其实这个不是难题。要知道hibernate能够进行这样的切换,靠的什么东西?如果你知道Hibernate靠的什么就很好解决这样的问题。
       我就拿一个分页来说吧。在很多数据库中他们的分页SQL都是不一样的。就像LZ说的那个limit (mysql),top (MS)等
       将以上提到的信息进行分解。问题就很好解决了。
        解决过程:
          1.通过使用方言的标示,来说明当前使用的数据库是什么
          2.将分页的所有的标准SQL写好(数据库商家的标准SQL)
          3.哪就是使用Refact的问题了。
       我也只能够跟你说这些了。提供思路吧,方法也很简单。
      

  9.   

    很多东西说得容易,想起来也容易,但实现起来就不是那回事了!
    首先要求只写一套SQL(该要求中),能够在两个数据库中执行,要想通用,除非数据库很精通!
    其次你说用方言标示,来说明当前使用的数据库,这点有什么意思!这种相当于写两套SQL,系统自动识别是可以的,但要求是只写一套SQL.
    Hibernate能够通过方言实现跨数据库平台,是因为其作者相当于自己实现一套HQL等,再根据你配置的方言编译、转化为该数据库的Native SQL,难道这个过程你能够简单的就实现的了,好说,如果你能够实现,那就不叫IBatis了,那就是Hibenate的克隆了!使用Ibatis的原因就是想数据库自己优化,这样的话就不可能了,那还不如干脆直接使用Hibernate了!
      

  10.   

    如果是普通查询分页什么的,用ibatis的<include refid=""/>其分页语句就好,根据不同的数据库引入不同的分页部分
      

  11.   


    知己啊   心声    泪奔ing………………
      

  12.   

    知己啊   心声   泪奔ing…………
      

  13.   

    hibernate没有你想的那么神奇。通过hibernate的code为证:
    oracle的分页查询(类名称Oracle9iDialect)
    public String getLimitString(String sql, boolean hasOffset) {
        sql = sql.trim();
        boolean isForUpdate = false;
        if (sql.toLowerCase().endsWith(" for update")) {
          sql = sql.substring(0, sql.length() - 11);
          isForUpdate = true;
        }    StringBuffer pagingSelect = new StringBuffer(sql.length() + 100);
        if (hasOffset) {
          pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
        }
        else {
          pagingSelect.append("select * from ( ");
        }
        pagingSelect.append(sql);
        if (hasOffset) {
          pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");
        }
        else {
          pagingSelect.append(" ) where rownum <= ?");
        }    if (isForUpdate) {
          pagingSelect.append(" for update");
        }    return pagingSelect.toString();
      }
    MYSQL (类名称MySQLDialect)
    public String getLimitString(String sql, boolean hasOffset) {
        return sql.length() + 20 + sql + (hasOffset ? " limit ?, ?" : " limit ?");
      }
    以上均为Hibernate的源码
      

  14.   

    楼主   别纠结了  写两套呗  反正你说的分页 查询啥的  sql也比较简单
      

  15.   


    额 ,这个  这个…… ╮(╯▽╰)╭  看来 方案  貌似……
    不知道 用 ibatis和hibernate的区别,除了优化数据库意外的其他优缺点在哪里???  有木有解答的  ,   额  对了   google 一下先……