iteye_13524 2010-08-27 14:58
浏览 310
已采纳

JDBC的接口是怎么实现的?

如题。
最近接触到jdbc,我有个疑问,建立连接的时候调用的都是接口,那么接口的方法是怎么实现的呢?
比如声明:
Connection con; 
Statement sql;
ResultSet rs;  //Connection 、Statement 、ResultSet 都是接口

con=DriverManage.getConnection("jdbc:odbc:hello”,"",""); // DriverManage是一个类,getConnection是静 态方法,返回类型是Connection接口;
sql=con.createStatement();
rs=sql.executeQuery(“SELECT *FROM table”); 


我想问一下,Statement接口的getConnection,ResultSet接口的executeQuery方法都没有看到实现,怎么就直接用了。
我看过jdk的源码,里面的接口都只是声明而已。如果说这些接口都是数据库厂商来实现的话,那么他们的驱动机制是怎么回事的?
谢谢了!

 

  • 写回答

5条回答 默认 最新

  • iteye_19529 2010-08-29 00:58
    关注

    我查资料理解的:
    DriverManage.getConnection连接时要初始化里面调loadInitialDrivers方法初始化时调用了
    [code="java"]
    Class.forName(driver, true,ClassLoader.getSystemClassLoader());
    [/code]
    Class.forName方法最终是调了java原生方法装载驱动
    [code="java"]
    private static native Class forName0(String name, boolean initialize,

    ClassLoader loader) throws ClassNotFoundException;
    [/code]
    name - 所需类的完全限定名
    initialize - 是否必须初始化类
    loader - 用于加载类的类加载器
    如果 loader 为 null,也有安全管理器,并且调用方的类加载器不为 null,则此方法通过 RuntimePermission("getClassLoader") 权限调用安全管理器的 checkPermission 方法,以确保可以访问引导类加载器。
    initialize=true时,总是初始化这个被装载的类;false时,绝对不会初始化,但是可能被连接了,有个例外,如果在调用forName()前,已经被初始化了,那么返回的类型也肯定是被初始化的

    一个Native Method就是一个java调用非java代码的接口。该方法的实现由非java语言实现,比如C。具体调的哪个dll或什么类库,怎样实现的我肯定不知道。
    既然加载到对应的驱动了那也应该得到了对应数据库的connection了

    比如Class.forName("oracle.jdbc.driver.OracleDriver");就是去装载oracle的驱动类,只要引入oracle的ojdbc14.jar包就有

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)