问题描述
如题。 最近接触到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的源码,里面的接口都只是声明而已。如果说这些接口都是数据库厂商来实现的话,那么他们的驱动机制是怎么回事的? 谢谢了!
解决方案
我查资料理解的:DriverManage.getConnection连接时要初始化里面调loadInitialDrivers方法初始化时调用了Class.forName(driver, true,ClassLoader.getSystemClassLoader());Class.forName方法最终是调了java原生方法装载驱动private static native Class forName0(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException; 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包就有
解决方案二:
你应该找具体驱动的源码来看吧。。。。比如oracle的数据库就是ojdbc14.jar
解决方案三:
Class.forName("com.mysql.jdbc.Driver");
解决方案四:
你不要看到它返回的类型是接口就认为他返回的是一个接口。它可以把一个具体的实现类的对象作为一个接口类型来返回即把子类对象当作父类对象来看所以你得到的那些接口对象其实是接口的实现类对象,而它们都对接口声明的方法做出了自己的实现
解决方案五:
如果说这些接口都是数据库厂商来实现的话,那么他们的驱动机制是怎么回事的? 如你所想,实现类是厂商都是实现的,驱动机制应该是加载实现类到JVM中给调用吧