20190228——JDBC基础1

JDBC(java data base connectivity)java数据库连接,由一些接口和类构成的API

应用程序通过JDBC通过Driver(驱动)来访问数据库


**注册驱动** 只需要注册一次

有两种方式

Class.forName("com.mysql.jdbc.Driver");
DriverManager.registerDriver(new com.mysql.jdbc.Driver());

JDBC提供了独立于数据库的api,数据库公司都可以基于这个标准接口进行开发。包括java.sql包下的Driver,Connection,Statement,ResultSet是JDBC提供的接口,DriverManager是用于管理JDBC驱动的服务类,主要用于获取Connection对象(此类中全是静态方法)

Driver接口中,明确要求,Driver接口是每个驱动程序类都必须实现的接口,Java SQL框架允许多个数据库驱动程序,每个驱动程序都应该提供一个实现Driver接口的类,并且明确,在加载某一个类的时候,它应该创建自己的实例并向DriverManager注册该实例

我们会想 Class.forName(driverClass) 只能帮助我们得到Driver的Class对象啊,为什么会帮我们完成注册了呢。从上边对Driver()的API的查阅,API要求:在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。我们猜想是在类加载时,就自动完成了注册。下边去具体看一下源码:

其JDK1.7下的DriverManger的registerDriver()方法:

 public static synchronized void registerDriver(java.sql.Driver driver)
        throws SQLException {
 
        /* Register the driver if it has not already been added to our list */
        if(driver != ) {
            registeredDrivers.addIfAbsent(new DriverInfo(driver));
        } else {
            // This is for compatibility with the original DriverManager
            throw new NullPointerException();
        }
 
        println("registerDriver: " + driver);
 
    }

第二种方法是怎么通过只要获得Driver的Class对象就可以完成注册呢,下边看一下其com.mysql.jdbc.Driver的源码:

public class Driver extends NonRegisteringDriver implements java.sql.Driver {  
    // ~ Static fields/initializers  
    // ---------------------------------------------  
  
    //  
    // Register ourselves with the DriverManager  
    //  
    static {  
        try {  
            java.sql.DriverManager.registerDriver(new Driver());  
        } catch (SQLException E) {  
            throw new RuntimeException("Can't register driver!");  
        }  
    }  

** 根据类加载机制,当执行 Class.forName(driverClass) 获取其Class对象时, com.mysql.jdbc.Driver 就会被JVM加载,连接,并进行初始化,初始化就会执行静态代码块**

java.sql.DriverManager.registerDriver(new Driver());

对于上边的两种驱动注册方法,我们一般采用第二种方法:

(1)第一种方式 Driver driver = new Driver() 其在内部也执行静态代码块,这相当于实例化了两个Driver对象;

(2)第一种方式 Driver driver = new Driver() 会产生对某一种数据库的依赖(会import驱动包),耦合性较高。

 所以一般采用低二种方式。

**建立连接**
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc",user,password);

创建语句

Statement st =conn.createStatement();

执行语句

ResultSet rs =st.executeQuery("select *from user);

处理结果
rs相当于获得一个表,有行有列

while(rs.next(){
 system.out.printIn(rs.getObject(1) +"\t"+)
 }

释放资源

rs.close();
st.close();
conn.close();
import java.sql.*;
public class Demoone {
     static final String JDBC_DRIVER="com.mysql.jdbc.Driver" ;
     static final String DB_URL="jdbc:mysql://localhost/jdbc" ;

     static final String USER="root";
     static final String PWD="password";

    public static void main(String[] args) {
        Connection conn =null;
        Statement stmt=null;

        try{
            Class.forName(JDBC_DRIVER);
            System.out.println("连接数据库中...");
            conn=DriverManager.getConnection(DB_URL,USER,PWD);
            System.out.println("连接成功");
            stmt=conn.createStatement();
            String sql="select * from user";
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()){
                System.out.println(rs.getObject(1) +"\t"+rs.getObject(2)+"\t"+
                        rs.getObject(3)+"\t"+rs.getObject(4));
            }
            rs.close();
            stmt.close();
            conn.close();
        }catch (SQLException se){
            se.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            //finally block used to close resources
            try{
                if(stmt!=null)
                    stmt.close();
            }catch(SQLException se2){
            }// nothing we can do
            try{
                if(conn!=null)
                    conn.close();
            }catch(SQLException se){
                se.printStackTrace();
            }//end finally try
        }
        System.out.println("demoone实例演示成功");
    }

}

在这里插入图片描述

Connection相当于桥
Statement相当于车
Result相当于资源

猜你喜欢

转载自blog.csdn.net/qq_36344771/article/details/88019555