JAVA JDBC使用相同代码连接不同数据库原理浅解析

来源:互联网 发布:课堂游戏 知乎 编辑:程序博客网 时间:2024/06/14 06:08

如果我们使用JAVA连接数据库的话,一般要经过以下几步:

1.加载驱动

2.取得连接

3.取得Statement

4.取得结果集或执行结果

5.操作结果集

而其他如mybatis hibernate等数据库框架就是对jdbc的进一步封装,那jdbc又是怎样实现的呢,我们为什么可以通过相同代码操作不同数据库呢?来看看当年sun公司大牛的智慧^_^


数据库种类很多,要想统一使用,那就要有统一的规则,而不能让数据库各自为战.

首先,java定义了一系列数据库相关的接口,如:Driver,Connection,Statement等,然后告诉这些数据库厂商,要想让java程序员使用你们的数据库,你们自己就按照我写的接口实现功能,要不我们牛逼的java程序员就不用你家数据库了!于是各数据库厂商在开发数据库的时候还配套了自己的数据库驱动包,这就是为什么我们下载数据库(如:mysql)后能在他的文件中找到驱动包(如:mysql-connector-java-版本-bin)的原因.


接下来说一下相同代码操作不同数据库的过程:

由于java定义了一系列接口,我们按照开头说的,要想操作数据库,首先取得一个Connection,我们有两个方法可以取得Connection,一个是调用Driver类,一个是调用DriverManager类,如:

Connection connection=DriverManager.getConnection(conStr, "root", "root");

不管哪种方法,都需要特定的数据库驱动类,否则报错,而这个数据库驱动类由java定义接口,由数据库厂商自己实现,如mysql中Driver的实现:

public class Driver  extends NonRegisteringDriver  implements java.sql.Driver{  public Driver()    throws SQLException  {}    static  {    try    {      DriverManager.registerDriver(new Driver());    } catch (SQLException E) {      throw new RuntimeException("Can't register driver!");    }  }}

通过代码我们看出,我们使用:

Class.forName("com.mysql.jdbc.Driver");

将驱动加载进内存后,自动执行static静态代码块,将该驱动类注册,交给DriverManager管理,这是为什么DriverManager能取得数据库连接的原因,它不过是借助了Driver类(mysql的话Driver的大部分实现在NonRegisteringDriver中).

NonRegisteringDriver类是这样定义的:

public class NonRegisteringDriver implements Driver


通过特定的Driver

Connection connection=DriverManager.getConnection(conStr, "root", "root");

拿到了特定的Connection

Statement statement=connection.createStatement();

父类引用指向子类对象,所以调用的是特定数据库ConnectioncreateStatement()实现方法.

如此,下同,就完成了使用相同代码连接不同数据库的过程,而这里,java只是定义了一系列接口,具体实现需要不同数据库自己去完成.从而大大方便了程序员的数据库编程过程.


如有错误欢迎大家指正微笑

end

原创粉丝点击