通用JDBC驱动及源码

来源:互联网 发布:鬼子来了影评 知乎 编辑:程序博客网 时间:2024/05/22 07:09
mysql/oracle/sybase 通用JDBC驱动
2008年10月5日
2003年,DingL.com站长在项目开发过程中遇到了一个很棘手的问题。  
     问题是这样的。项目需要对130多张表进行维护,要同兼容oracle/sql server/sybase三种数据库。其中oracle数据库的表设计中,字符型的主键被设计成了char类型,我们知道char是固定长度的类型。这里有两种情况,一是此主键只保存单字节字符,这样是不会出现问题的,如果主键是中文等双字节字符时就会出现问题了。因为对于中文字符串,数据库在计算其长度时一个中文算两个长度,而在java中,一个中文只算一个长度。这样尽管我们在将值传给数据库前在其后面补了空格,在所有的where子句中(注意,字段是主键)的比较是不会相等的(因其空格个数不一样),因为java和数据库的长度计算方式不一样。所以,在java传值给数据库前必须把检测中文的个数,然后再去补相应的空格数。
     然而,要命的是,数据库的设计我们无法更改,也就是不能把主键的类型改为varchar2,况且varchar2类型在作索引时效率要比char类型差。
     更要命的时,当时发现存在这样的问题时,项目已经接近尾声了。由于涉及的表众多,如果要更改已经编写好的代码将花费相当多的精力和时间。
     如果我们能在PreparedStatement.setString()方法中去计算要补空格的个数就可以不修改已有的代码,从而解决问题。但我们知道,ResultSet、Statement、PreparedStatement、Connection等都只是接口,具体的实现类都是各JDBC驱动实现的,每个不同类型厂商的驱动实现都是不一样的。如果我们能有自己的PreparedStatement类实现就能解决问题了,通用JDBC驱动程序就这样诞生了。
     通用驱动从驱动注册开始入手,拥有自己的URL、驱动类、Connection等实现。
     通用驱动其内核其实还是各官方提供的JDBC驱动,所以在使用过程中同样需要把各官方驱动加到classpath中才能正常使用。目前支持Oracle JDBC驱动、SQL Server JDBC驱动、Sybase JDBC驱动、MySql JDBC驱动,通过修改源码和配置文件可支持任意的type4 JDBC驱动。

     下载通用JDBC驱动及源码
     通用JDBC驱动程序及源码均可在网上自由传播及免费使用。作为商业用途,若由于通用驱动程序的BUG或缺陷造成的损失DingL.com及站长概不负责,且DingL.com不提供任何技术支持,请谨慎使用
     下载通用驱动程序,请点击 这里
     下载通用驱动程序源码,请点击 这里

     通用JDBC驱动使用指南
     
URL
      为了将来扩展方便,URL采用如下格式:
jdbc:common/dbtype=XXX&host=XXX&port=XXX&dbname=XXX   &useTrim=XXX&charset=XXX
各项说明如下:
jdbc:common:URL的固定前缀,通用驱动不支持其它的URL前缀
dbtype:数据库的类型,此项必需提供。因为支持多种数据库,所以必须指定,目前支持四种数据库oracle、sql server、sybase、mysql:

数据库类型dbtype的值
oracleoracle
sql serversqlserver(注意,中间没有空格)
sybasesybase
mysqlmysql

host:数据库服务器的主机名或IP地址,如:192.168.0.2,此项必需提供。
port:数据库服务器提供服务的端口,若数据库的官方驱动不需要端口,可省去此项。如:1521,此项选择提供。
dbname:数据库名称,此项必需提供。
useTrim:是否需要计算空格数,这是我做的配置项,一般人是用不到的。此项与具体的实现有关。
charset:数据库的字符集。此项与具体的实现有关。

     让通用驱动支持更多的功能
    
根据需要增加的功能,直接修改Statement(PreparedStatement)或ResultSet的实现类的方法即可。若需要在驱动的URL中增加参数请按照charset和useTrim的方式增加,在各实现类中均有Properties类的实例param,调用param.get("参数名")即可得到参数的值。

     让通用驱动支持更多的数据库类型
    
在下载包中找到driver.properties文件,根据要增加支持的数据库官方驱动及其URL,添加类似文件中的项即可。如Oracle是如下配置:
#oracle
oracle.driver=oracle.jdbc.OracleDriver
oracle.url=jdbc:oracle:thin:@host-name:port:database-name
说明如下:
oracle.jdbc.OracleDriver是Oracle提供的官方驱动的驱动类名
jdbc:oracle:thin:@host-name:port:database-name是OracleDriver的URL形式,其中@符号后面的host-name、port、database-name都是变量,不需要给出具体值。
     配置完成后将其官方驱动jar文件加到classpath中,再修改通用驱动的URL中的相应配置就能正常使用了;

     通用JDBC驱动使用示例代码:

   Class.forName("com.dingl.jdbc.CommonDriver");
   Connection conn = DriverManager.getConnection("jdbc:common/dbtype=sybase&host=192.168.1.xx&port=5000 &dbname=db3&useTrim=no", "sa", "sa");
   PreparedStatement ps = conn.prepareStatement("select * from t_table");
     ResultSet rs = ps.executeQuery();
   if (rs.next()) {
     //...

原创粉丝点击