JDBC源码分析(1)

来源:互联网 发布:去日本带mac好吗 编辑:程序博客网 时间:2024/06/05 12:06

JDBC(Java Data Base Connectivity)

简单来说就是用java语言来操作数据库,JDBC是一套标准,他由一些接口和实现类组成。

其中最主要的接口和实现类有以下几个:

  • 接口
    java.sql .Connection
    java.sql .ResultSet
    java.sql .Statement
    java.sql .PrepareStatement
    javax.sql.DataSource

  • java.lang.DriverManager

连接数据库

假如我们要通过程序去操作数据那么我们首先要链接到数据库,这就需要数据库驱动,什么是驱动那?两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
不同的数据库需要不同驱动jar。接下来以mysql为例
将驱动jar导入项目:

连接数据库

DriverManager 可以理解成是一个容器(Vector),可以装入很多数据库驱动 两个重要的方法

public static void registerDriver(Driver driver)  throws SQLException //注册驱动public static Connection getConnection(String url,String user,String password) //连接数据库
package driver;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import com.mysql.jdbc.Driver;public class Demo {    public static void main (String[] args) throws SQLException{        //注册驱动        DriverManager.registerDriver(new Driver());        //连接数据库        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/springdemo","root","admin");        System.out.println(con);    }}

这里写图片描述

public static synchronized void registerDriver(java.sql.Driver driver)        throws SQLException {        registerDriver(driver, null);    }

传入的参数:java.sql.Driver 而我们传入的是com.mysql.jdbc.Driver

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

观察看到Driver中有一个静态代码块,已经为我们创建了一个Driver实例。这样的话我们再实例化就在DriverManager中存在两个驱动,影响了性能。怎么解决?在构造中明确的提示我们可以使用反射调用

package driver;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class Demo {    public static void main(String[] args) throws SQLException {        // 注册驱动        try {            Class.forName("com.mysql.jdbc.Driver");        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        // 连接数据库        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/springdemo", "root", "admin");        System.out.println(con);    }}

1.只加载一次,装入一个驱动对象.
2.降低耦合,不依赖于驱动.

url的格式

mysql: jdbc(主协议):mysql(子协议)://localhost(主机):3306(端口号)/springdemo(数据库名)
oralce url: jdbc:oracle:thin:@localhost:1521:sid

1 0
原创粉丝点击