2006-10-12
实现数据库兼容并不象你想象的那么难
关键字: Hibernate railsylt 写道
我同意Readonly的观点。如果不用hql,想实现数据库兼容就太难了。
举个例子,在很多手工录入的表格中都要记录录入时间/操作人/备注,我在java中使用date/person/comment来表示,可是java的关键字和sql的是不一样的,不同数据库也有各自的扩展关键字,上面那几个字段很可能就是某种数据库的关键字。用hql,我所有的查询语句就可以保持统一,切换数据库只需要修改mapping。实际上我写了一个自动根据数据库关键字修改mapping的类,这样连mapping文件也只需要一个。
实现数据库兼容并不象你想象的那么难。:)
我做的平台软件在多种数据库上测试过,包括:Oracle9(10),SqlServer2000,MySql4(5),PostgreSQL8,
HyperSonic。
操作包括CRUD,查询也有比较复杂的。
兼容数据库的步骤如下:
1)数据库DDL是要自行处理的。当然可以借助PowerDesigner的自动转换数据库功能,虽然也有bug,其实主要无非就是一些数据类型的转换,手写也可。
2)CRUD中的字段类型。JDBC的PreparedStatement已经帮你将所有的字段类型都封装了,比如不需要为了插入日期型等数据调用数据库本地的函数,ps.setDate()即可。
3)CRUD之SQL语法。ANSI SQL标准虽然贯彻得不够彻底,但常用的语法的确得到了一致认可。比如,表的左外连接在Oracle8里只有a.field1=b.feild2(+)这种方式,但在Oracle9以后,都支持标准的left outer join on语法了。这种语法在上述5种数据库都得到支持。其他的别名的语法也支持良好。
我碰到的一个比较搞的问题就是SQLserver2000种删除语句不能给表设置别名,即不能delete from TABLE a where a.id=?,去除别名无问题。
4)结果分页。这个的确是我碰到的最需额外处理等问题。我就是参考了hibernate的方法解决的,提供通用的ResultSet滚动方式,以及使用数据库特有的方式在SQL级别上实现,如Oracle中使用RowNum。
5)ID生成问题。不同数据库有各自优化的方式,也可以使用通用的方式。也参考hibernate。
6)其他问题。比如Oracle里的hierachical query(connect by语句)在其他的数据库可能没有对等的实现方式,此时无法对此特性跨平台了。
发表评论
- 浏览: 123726 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
对于单例模式的一点想法
DCL成熟的
-- by lzy.je -
对于单例模式的一点想法
我觉得懒汉模式,即第一种足矣。
-- by okhaoba -
对于单例模式的一点想法
想不到javaeye上 不看清楚就乱回帖的人也这么多
-- by insiku -
对于单例模式的一点想法
还在讨论synchronized?第二页buaawhl 说的那个Initiali ...
-- by icewubin -
对于单例模式的一点想法
Lucas Lee 写道weiqingfei 写道private static ...
-- by xin_feng_08






评论排行榜