今天项目碰到了一个问题:ibatis做数据持久层,现在碰到了一个问题,就是——开发的项目 我如何做,才能使自己写的一条SQL 既能访问oracle和mysql呢???目的:为了方便以后维护,我们只需要写一个SQL,使其自动识别是oracle还是mysql。
言简意赅: 写一条SQL ,它既能操作oracle也能操作mysql
求提供思路在线坐等…… 亲们,谢谢……
言简意赅: 写一条SQL ,它既能操作oracle也能操作mysql
求提供思路在线坐等…… 亲们,谢谢……
解决方案 »
- poi 如何创建多个sheet
- J2EE的困惑
- 急问如下的hibernate原生sql查询的问题
- 请教一个郁闷问题
- javamail邮件系统发送出错
- Error:reference to Number is ambiguous; both class oracle.jbo.domain.Number in package oracle.jbo.domain and class java
- 被换行符捆住了,请教各位专家?
- JBuilderX 使用jboss 编译(make)jsp时出错
- 如果我用MSSQL做数据库,怎么和JAVA语句相连呀?
- 请问在weblogic下能不能不设密码?
- eclipse中怎么安装jbpm-jpdl-suite-3.2.2
- hibrnate超级bug
这种不可能的,你除非自己对ibatis进行一层包装,通过某些东西来表示该sql是执行对应的那个数据库。
恩,对的,亲…… 嘿嘿…… 知道 两个数据库在有的关键字上面不一样或者是冲突比如limit……求方法……
其实 之所以 这么问 也就是想说: 在oracle和mysql之间,我们 不想写两套SQL 看看 有木有解决方案什么的……呵呵……
我就拿一个分页来说吧。在很多数据库中他们的分页SQL都是不一样的。就像LZ说的那个limit (mysql),top (MS)等
将以上提到的信息进行分解。问题就很好解决了。
解决过程:
1.通过使用方言的标示,来说明当前使用的数据库是什么
2.将分页的所有的标准SQL写好(数据库商家的标准SQL)
3.哪就是使用Refact的问题了。
我也只能够跟你说这些了。提供思路吧,方法也很简单。
首先要求只写一套SQL(该要求中),能够在两个数据库中执行,要想通用,除非数据库很精通!
其次你说用方言标示,来说明当前使用的数据库,这点有什么意思!这种相当于写两套SQL,系统自动识别是可以的,但要求是只写一套SQL.
Hibernate能够通过方言实现跨数据库平台,是因为其作者相当于自己实现一套HQL等,再根据你配置的方言编译、转化为该数据库的Native SQL,难道这个过程你能够简单的就实现的了,好说,如果你能够实现,那就不叫IBatis了,那就是Hibenate的克隆了!使用Ibatis的原因就是想数据库自己优化,这样的话就不可能了,那还不如干脆直接使用Hibernate了!
知己啊 心声 泪奔ing………………
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的源码
额 ,这个 这个…… ╮(╯▽╰)╭ 看来 方案 貌似……
不知道 用 ibatis和hibernate的区别,除了优化数据库意外的其他优缺点在哪里??? 有木有解答的 , 额 对了 google 一下先……